31class OPENCC_EXPORT Segments {
35 Segments(std::initializer_list<const char*> initList) {
36 for (
const char* item : initList) {
41 Segments(std::initializer_list<std::string> initList) {
42 for (
const std::string& item : initList) {
47 void AddSegment(
const char* unmanagedString) {
48 indexes.push_back(std::make_pair(unmanaged.size(),
false));
49 unmanaged.push_back(unmanagedString);
52 void AddSegment(
const std::string& str) {
53 indexes.push_back(std::make_pair(managed.size(),
true));
54 managed.push_back(str);
59 using iterator_category = std::input_iterator_tag;
60 using value_type =
const char*;
62 iterator(
const Segments*
const _segments,
size_t _cursor)
63 : segments(_segments), cursor(_cursor) {}
65 iterator& operator++() {
70 bool operator==(
const iterator& that)
const {
71 return cursor == that.cursor && segments == that.segments;
74 bool operator!=(
const iterator& that)
const {
75 return !this->operator==(that);
78 const char* operator*()
const {
return segments->At(cursor); }
81 const Segments*
const segments;
85 const char* At(
size_t cursor)
const {
86 const auto& index = indexes[cursor];
88 return managed[index.first].c_str();
90 return unmanaged[index.first];
94 size_t Length()
const {
return indexes.size(); }
96 iterator begin()
const {
return iterator(
this, 0); }
98 iterator end()
const {
return iterator(
this, indexes.size()); }
100 std::string ToString()
const {
103 std::ostringstream buffer;
104 for (
const char* segment : *
this) {
111 Segments(
const Segments&) {}
113 std::vector<const char*> unmanaged;
114 std::vector<std::string> managed;
116 std::vector<std::pair<size_t, bool>> indexes;