| // 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 "modules/skplaintexteditor/include/stringview.h" | |
| #include <memory> | |
| #include <cstddef> | |
| namespace SkPlainTextEditor { | |
| // 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; } | |
| SkPlainTextEditor::StringView view() const { return {fPtr.get(), 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<char[], FreeWrapper> fPtr; | |
| std::size_t fLength = 0; | |
| std::size_t fCapacity = 0; | |
| void realloc(std::size_t); | |
| }; | |
| } // namespace SkPlainTextEditor | |
| #endif // stringslice_DEFINED |