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