#pragma once #include #include "StringValue.h" /* Design decisions: * - Everything related to ref-counting is the responsibility of the StringValue class * - Anything dynamically allocated is owned (and thus once deleted) by the StringValue class * (including itself -- this is possible because of the reference counting mechanism) */ class String { private: StringValue* _str; public: String(); String(const char*); String(const String&); String& operator=(String); String(String&&); ~String(); friend void swap(String&, String&) noexcept; String operator+(const String&) const; String& operator+=(const String&); String operator+(char) const; String& operator+=(char); bool operator==(const String&) const; const char& operator[](size_t) const; char& operator[](size_t); size_t size() const; // does not include null-terminator const char* c_str() const; friend std::istream& operator>>(std::istream&, String&); }; std::ostream& operator<<(std::ostream&, const String&);