skia2/experimental/editor/stringslice.h
Hal Canary 0569447470 experimental/editor: progress
- selection
  - some state moved out of editor.
  - Editor::getPosition() translates x,y mouse position into text
    position
  - General Editor::move() function for moving cursor
  - Editor::insert() (does not yet handle newlines)
  - Editor::remove() (does not yet delete across lines)
  - new StringSlice class to replace SkString.

Change-Id: I1ca03247a745bc045e41619cd5a839c495dc405b
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/211884
Reviewed-by: Ben Wagner <bungeman@google.com>
Commit-Queue: Hal Canary <halcanary@google.com>
2019-05-07 18:01:50 +00:00

42 lines
1.3 KiB
C++

// 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 <memory>
#include <cstddef>
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() = default;
StringSlice(StringSlice&&);
StringSlice& operator=(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);
void reserve(std::size_t);
void shrink();
private:
struct FreeWrapper { void operator()(void*); };
std::unique_ptr<char, FreeWrapper> fPtr;
std::size_t fLength = 0;
std::size_t fCapacity = 0;
StringSlice(const StringSlice&) = delete;
StringSlice& operator=(const StringSlice&) = delete;
};
} // namespace editor;
#endif // stringslice_DEFINED