32 Segments(std::initializer_list<const char*> initList) {
33 for (
const string& item : initList) {
38 Segments(std::initializer_list<string> initList) {
39 for (
const string& item : initList) {
44 void AddSegment(
const char* unmanagedString) {
45 indexes.push_back(std::make_pair(unmanaged.size(),
false));
46 unmanaged.push_back(unmanagedString);
49 void AddSegment(
const string& str) {
50 indexes.push_back(std::make_pair(managed.size(),
true));
51 managed.push_back(str);
54 class iterator :
public std::iterator<std::input_iterator_tag, const char*> {
57 : segments(_segments), cursor(_cursor) {}
64 bool operator==(
const iterator& that)
const {
65 return cursor == that.cursor && segments == that.segments;
68 bool operator!=(
const iterator& that)
const {
69 return !this->operator==(that);
72 const char* operator*()
const {
return segments->At(cursor); }
79 const char* At(
size_t cursor)
const {
80 const auto& index = indexes[cursor];
82 return managed[index.first].c_str();
84 return unmanaged[index.first];
88 size_t Length()
const {
return indexes.size(); }
90 iterator begin()
const {
return iterator(
this, 0); }
92 iterator end()
const {
return iterator(
this, indexes.size()); }
94 string ToString()
const {
97 std::ostringstream buffer;
98 for (
const char* segment : *
this) {
105 Segments(
const Segments&) {}
107 vector<const char*> unmanaged;
108 vector<string> managed;
110 vector<std::pair<size_t, bool>> indexes;