34   Segments(std::initializer_list<const char*> initList) {
 
   35     for (
const std::string& 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;