32class OPENCC_EXPORT Segments {
36 Segments(std::initializer_list<const char*> initList) {
37 for (
const char* item : initList) {
42 Segments(std::initializer_list<std::string> initList) {
43 for (
const std::string& item : initList) {
48 void AddSegment(
const char* unmanagedString) {
49 indexes.push_back(std::make_pair(unmanaged.size(),
false));
50 unmanaged.push_back(unmanagedString);
53 void AddSegment(
const std::string& str) {
54 indexes.push_back(std::make_pair(managed.size(),
true));
55 managed.push_back(str);
58 void AddSegment(std::string_view sv) {
59 indexes.push_back(std::make_pair(managed.size(),
true));
60 managed.emplace_back(sv);
65 using iterator_category = std::input_iterator_tag;
66 using value_type =
const char*;
68 iterator(
const Segments*
const _segments,
size_t _cursor)
69 : segments(_segments), cursor(_cursor) {}
71 iterator& operator++() {
76 bool operator==(
const iterator& that)
const {
77 return cursor == that.cursor && segments == that.segments;
80 bool operator!=(
const iterator& that)
const {
81 return !this->operator==(that);
84 const char* operator*()
const {
return segments->At(cursor); }
87 const Segments*
const segments;
91 const char* At(
size_t cursor)
const {
92 const auto& index = indexes[cursor];
94 return managed[index.first].c_str();
96 return unmanaged[index.first];
100 size_t Length()
const {
return indexes.size(); }
102 iterator begin()
const {
return iterator(
this, 0); }
104 iterator end()
const {
return iterator(
this, indexes.size()); }
106 std::string ToString()
const {
107 size_t totalLength = 0;
108 for (
const char* segment : *
this) {
109 totalLength += std::strlen(segment);
113 buffer.reserve(totalLength);
114 for (
const char* segment : *
this) {
115 buffer.append(segment);
120 std::vector<std::string> ToVector()
const {
121 std::vector<std::string> result;
122 result.reserve(indexes.size());
123 for (
const char* segment : *
this) {
124 result.emplace_back(segment);
130 Segments(
const Segments&) {}
132 std::vector<const char*> unmanaged;
133 std::vector<std::string> managed;
135 std::vector<std::pair<size_t, bool>> indexes;