1 // Copyright 2019 Google LLC. 2 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. 3 #ifndef stringslice_DEFINED 4 #define stringslice_DEFINED 5 6 #include "experimental/editor/stringview.h" 7 8 #include <memory> 9 #include <cstddef> 10 11 namespace editor { 12 // A lightweight modifiable string class. 13 class StringSlice { 14 public: 15 StringSlice() = default; StringSlice(const char * s,std::size_t l)16 StringSlice(const char* s, std::size_t l) { this->insert(0, s, l); } 17 StringSlice(StringSlice&&); StringSlice(const StringSlice & that)18 StringSlice(const StringSlice& that) : StringSlice(that.begin(), that.size()) {} 19 ~StringSlice() = default; 20 StringSlice& operator=(StringSlice&&); 21 StringSlice& operator=(const StringSlice&); 22 23 // access: 24 // Does not have a c_str method; is *not* NUL-terminated. begin()25 const char* begin() const { return fPtr.get(); } end()26 const char* end() const { return fPtr ? fPtr.get() + fLength : nullptr; } size()27 std::size_t size() const { return fLength; } view()28 editor::StringView view() const { return {fPtr.get(), fLength}; } 29 30 // mutation: 31 void insert(std::size_t offset, const char* text, std::size_t length); 32 void remove(std::size_t offset, std::size_t length); 33 34 // modify capacity only: reserve(std::size_t size)35 void reserve(std::size_t size) { if (size > fCapacity) { this->realloc(size); } } shrink()36 void shrink() { this->realloc(fLength); } 37 38 private: 39 struct FreeWrapper { void operator()(void*); }; 40 std::unique_ptr<char[], FreeWrapper> fPtr; 41 std::size_t fLength = 0; 42 std::size_t fCapacity = 0; 43 void realloc(std::size_t); 44 }; 45 } // namespace editor; 46 #endif // stringslice_DEFINED 47