#include <iostream>
        #include <vector>
        #include <cstring>

        using namespace std;

        class Mystring {
        private:
            char* str;
        public:
            Mystring();
            Mystring(const char* s);
            Mystring(const Mystring& source);
            Mystring(Mystring&& source);
            ~Mystring();
        
            Mystring& operator=(const Mystring& rhs);
            Mystring& operator=(Mystring&& rhs);
        
            void display() const;
            int get_lenght() const;
            const char* get_str() const;
        };

        int main() {
            vector <Mystring> stooges_vec;
            stooges_vec.push_back("Larry"); //11
            stooges_vec.push_back("Moe"); //12
            stooges_vec.push_back("Curly"); //13
        
            return 0;
        }
    

      
    //One-args constructor
    Mystring::Mystring(const char* s)
        : str{ nullptr } {
        if (s == nullptr) {
            str = new char[1];
            *str = '\0';
        }
        else {
            str = new char[std::strlen(s) + 1];
            std::strcpy(str, s);
        }
    }
    


    //Copy constructor
    Mystring::Mystring(const Mystring& source)
        :str{ nullptr } {
        str = new char[std::strlen(source.str) + 1];
        std::strcpy(str, source.str);
    }
    


    //Move constructor
    Mystring::Mystring(Mystring&& source)
        :str{ source.str } {
        source.str = nullptr;
        std::cout << "Move constructor called." << std::endl;
    }
    


    //Destructor
    Mystring::~Mystring() {
        delete[] str;
    }
    


    //Copy assignment
    Mystring& Mystring::operator=(const Mystring& rhs) {
        std::cout << "Copy assignment called." << std::endl;
        if (this == &rhs)
            return *this;
        delete[] str;
        str = new char[std::strlen(rhs.str) + 1];
        std::strcpy(str, rhs.str);
        return *this;
    }
    


    //Move assignment
    Mystring& Mystring::operator=(Mystring&& rhs) {
        std::cout << "Move assignment called." << std::endl;
        if (this == &rhs)
            return *this;
        delete[] str;
        str = rhs.str;
        rhs.str = nullptr;
        return *this;
    }