34 Segments(std::initializer_list<const char*> initList) {
35 for (
const char* item : initList) {
40 Segments(std::initializer_list<std::string> initList) {
41 for (
const std::string& item : initList) {
46 void AddSegment(
const char* unmanagedString) {
47 indexes.push_back(std::make_pair(unmanaged.size(),
false));
48 unmanaged.push_back(unmanagedString);
51 void AddSegment(
const std::string& str) {
52 indexes.push_back(std::make_pair(managed.size(),
true));
53 managed.push_back(str);
56 class iterator :
public std::iterator<std::input_iterator_tag, const char*> {
59 : segments(_segments), cursor(_cursor) {}
66 bool operator==(
const iterator& that)
const {
67 return cursor == that.cursor && segments == that.segments;
70 bool operator!=(
const iterator& that)
const {
71 return !this->operator==(that);
74 const char* operator*()
const {
return segments->At(cursor); }
81 const char* At(
size_t cursor)
const {
82 const auto& index = indexes[cursor];
84 return managed[index.first].c_str();
86 return unmanaged[index.first];
90 size_t Length()
const {
return indexes.size(); }
92 iterator begin()
const {
return iterator(
this, 0); }
94 iterator end()
const {
return iterator(
this, indexes.size()); }
96 std::string ToString()
const {
99 std::ostringstream buffer;
100 for (
const char* segment : *this) {
107 Segments(
const Segments&) {}
109 std::vector<const char*> unmanaged;
110 std::vector<std::string> managed;
112 std::vector<std::pair<size_t, bool>> indexes;