// Copyright 2019 Google LLC. // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. #ifndef stringslice_DEFINED #define stringslice_DEFINED #include #include namespace editor { // A lightweight modifiable string class. class StringSlice { public: StringSlice() = default; StringSlice(const char* s, std::size_t l) { this->insert(0, s, l); } StringSlice(StringSlice&&); StringSlice(const StringSlice& that) : StringSlice(that.begin(), that.size()) {} ~StringSlice() = default; StringSlice& operator=(StringSlice&&); StringSlice& operator=(const StringSlice&); // access: // Does not have a c_str method; is *not* NUL-terminated. const char* begin() const { return fPtr.get(); } const char* end() const { return fPtr ? fPtr.get() + fLength : nullptr; } std::size_t size() const { return fLength; } // mutation: void insert(std::size_t offset, const char* text, std::size_t length); void remove(std::size_t offset, std::size_t length); // modify capacity only: void reserve(std::size_t size) { if (size > fCapacity) { this->realloc(size); } } void shrink() { this->realloc(fLength); } private: struct FreeWrapper { void operator()(void*); }; std::unique_ptr fPtr; std::size_t fLength = 0; std::size_t fCapacity = 0; void realloc(std::size_t); }; } // namespace editor; #endif // stringslice_DEFINED