#include #include class simple_string { public: simple_string(const simple_string& src); simple_string& operator =(const simple_string& src); simple_string(simple_string&& src) noexcept; simple_string& operator =(simple_string&& src) noexcept; simple_string(const char* beg, const char* end); simple_string(const char* str, const size_t slen); simple_string(const char* str); simple_string(const size_t initial_capacity, const char fill_value='\0'); simple_string(const std::string& str); simple_string(); ~simple_string(void); simple_string& append(const char* other); simple_string& append(const char* beg, const char* end); simple_string& append(const char* other, const size_t slen); simple_string& append(const std::string& other); simple_string& append(const simple_string& other); simple_string& append(const char x); void resize(const size_t new_size); void expand(const size_t extra_capacity); void reserve(const size_t new_capacity); const char* c_str(void) const noexcept; char* data(void) noexcept; size_t size(void) const noexcept; char* begin(void) noexcept; char* end(void) noexcept; const char* cbegin(void) const noexcept; const char* cend(void) const noexcept; char& operator [](const size_t idx) noexcept; const char& operator [](const size_t idx) const noexcept; private: char* m_data = nullptr; size_t m_size = 0; size_t m_capacity = 0; };