#pragma once #include #include class String { typedef char* Iterator; typedef const char* ConstIterator; public: String(char* c_str); String(char* c_str, usize length); String(); String(String&&); String(const String&) = delete; ~String(); Result clone() const; Result substring(usize begin, usize size) const; static Result from_cstring(const char* str); const char* chars() const { return m_inline ? m_inline_storage : m_string; } usize length() const { return m_length; } bool is_empty() const { return m_length == 0; } StringView view() const { return { chars(), m_length }; } const char& operator[](usize) const; Iterator begin() { return m_inline ? m_inline_storage : m_string; } ConstIterator begin() const { return chars(); } Iterator end() { return begin() + m_length; } ConstIterator end() const { return begin() + m_length; } private: union { char* m_string { nullptr }; char m_inline_storage[sizeof(char*)]; }; bool m_inline { true }; usize m_length { 0 }; };