xref: /aosp_15_r20/external/skia/modules/skplaintexteditor/include/stringslice.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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