/* * String.h */ #ifndef STRING_H #define STRING_H #include #include #include #include namespace IDA_String { class String { public: using size_type = std::size_t; using iterator = char*; using const_iterator = const char*; using reverse_iterator = std::reverse_iterator; using const_reverse_iterator = std::reverse_iterator; // Constructors and destructor String() = default; String(const String&); String(String&&) noexcept; String(const char*); String(size_type, char); String(std::initializer_list); ~String(); // Assignment String& operator=(const String&) &; String& operator=(String&&) & noexcept; String& operator=(const char*) &; String& operator=(char) &; String& operator=(std::initializer_list) &; // Iterators iterator begin() { return iterator(p_); } const_iterator begin() const { return const_iterator(p_); } iterator end() { return iterator(p_ + size_); } const_iterator end() const { return const_iterator(p_ + size_); } reverse_iterator rbegin() { return reverse_iterator(end()); } const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } reverse_iterator rend() { return reverse_iterator(begin()); } const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } const_iterator cbegin() const { return const_iterator(p_); } const_iterator cend() const { return const_iterator(p_ + size_); } const_reverse_iterator crbegin() const { return const_reverse_iterator(end()); } const_reverse_iterator crend() const { return const_reverse_iterator(begin()); } // Element access char& operator[](size_type); char operator[](size_type) const; char& at(size_type); char at(size_type) const; // Size size_type length() const; bool empty() const; void clear(); // Concatenation (one possible move version left out) String& operator+=(const String&); String& operator+=(const char*); String& operator+=(char); String& operator+=(std::initializer_list); // Convert to C string const char* c_str() const; explicit operator const char*() const; // Swap content with other String void swap(String&) noexcept; private: static char empty_rep_[1]; // empty, null-terminated C string size_type size_{ 0 }; char* p_{ empty_rep_ }; // Internal helper functions void construct_(const char*, size_type); void construct_(size_type, char); void construct_(std::initializer_list); void append_(const char*); void append_(char); }; // Concatenation (seven possible move versions left out) String operator+(const String&, const String&); String operator+(const char*, const String&); String operator+(const String&, const char*); String operator+(const String&, char); String operator+(char, const String&); // Equality operators bool operator==(const String&, const String&); bool operator==(const char*, const String&); bool operator==(const String&, const char*); bool operator!=(const String&, const String&); bool operator!=(const char*, const String&); bool operator!=(const String&, const char*); // Relational operators bool operator<(const String&, const String&); bool operator<(const char*, const String&); bool operator<(const String&, const char*); bool operator<=(const String&, const String&); bool operator<=(const char*, const String&); bool operator<=(const String&, const char*); bool operator>(const String&, const String&); bool operator>(const char*, const String&); bool operator>(const String&, const char*); bool operator>=(const String&, const String&); bool operator>=(const char*, const String&); bool operator>=(const String&, const char*); // Input and output std::ostream& operator<<(std::ostream&, const String&); std::istream& operator>>(std::istream&, String&); std::istream& getline(std::istream&, String&, char = '\n'); // Swap content of two Strings void swap(String&, String&) noexcept; } // namespace IDA_String #endif