fork download
  1. #include <iterator>
  2. #include <stdexcept>
  3.  
  4. template <class Range> class MultiRangeIterator;
  5. template <class Iterator, class SubRange>
  6. struct MultiRange;
  7.  
  8. template <class E> struct EmptyRange
  9. {
  10. typedef MultiRangeIterator<EmptyRange<E>> iterator;
  11. iterator begin();
  12. iterator end();
  13.  
  14. template <class NewIter>
  15. struct Append
  16. {
  17. typedef MultiRange<NewIter, EmptyRange<E>> type;
  18. };
  19.  
  20. template <class NewIter>
  21. typename Append<NewIter>::type append(NewIter first, NewIter last) const;
  22. };
  23.  
  24. template <class Iterator, class SubRange = EmptyRange<typename Iterator::value_type>>
  25. struct MultiRange
  26. {
  27. Iterator first;
  28. Iterator last;
  29. SubRange deeper;
  30.  
  31. template <class NewIter>
  32. struct Append {
  33. typedef MultiRange<Iterator, typename SubRange::template Append<NewIter>::type> type;
  34. };
  35.  
  36. typedef MultiRangeIterator<MultiRange> iterator;
  37. MultiRange(Iterator a, Iterator b, SubRange s = SubRange())
  38. : first(a), last(b), deeper(s) {}
  39.  
  40. iterator begin();
  41. iterator end();
  42.  
  43. template <class NewIter>
  44. typename Append<NewIter>::type operator()(NewIter newFirst, NewIter newLast) const
  45. { return this->append(newFirst, newLast); }
  46.  
  47. template <class NewIter>
  48. typename Append<NewIter>::type append(NewIter newFirst, NewIter newLast) const
  49. {
  50. typedef typename Append<NewIter>::type NewMultiRange;
  51. return NewMultiRange(first, last, deeper.append(newFirst, newLast));
  52. }
  53. };
  54.  
  55. template <class E>
  56. template <class NewIter>
  57. typename EmptyRange<E>::template Append<NewIter>::type EmptyRange<E>::append(NewIter first, NewIter last) const
  58. {
  59. return MultiRange<NewIter,EmptyRange<E>>(first, last);
  60. }
  61.  
  62. template <class Iterator>
  63. MultiRange<Iterator> makeRange(Iterator first, Iterator last)
  64. { return MultiRange<Iterator> (first, last); }
  65.  
  66. template <class E>
  67. struct MultiRangeIterator<EmptyRange<E>>
  68. {
  69. E& operator*() const { throw std::out_of_range("past the end!"); }
  70. MultiRangeIterator& operator++() { return *this; }
  71. };
  72.  
  73. template <class Iterator, class SubRange>
  74. struct MultiRangeIterator<MultiRange<Iterator, SubRange>>
  75. {
  76. MultiRange<Iterator, SubRange> const& myRange;
  77. Iterator myIter;
  78. MultiRangeIterator<SubRange> deeperIter;
  79.  
  80. typedef typename std::iterator_traits<Iterator>::reference reference;
  81.  
  82. MultiRangeIterator(MultiRange<Iterator, SubRange> const& r, Iterator it, MultiRangeIterator<SubRange> d )
  83. : myRange(r), myIter(it), deeperIter(d) {}
  84.  
  85. bool pastEndOfRange() const
  86. { return myIter == myRange.last; }
  87.  
  88. reference operator*() const
  89. { return pastEndOfRange() ?
  90. *deeperIter :
  91. *myIter; }
  92.  
  93. MultiRangeIterator& operator++()
  94. {
  95. if (!pastEndOfRange())
  96. ++myIter;
  97. else
  98. ++deeperIter;
  99. return *this;
  100. }
  101. };
  102.  
  103. namespace std {
  104. template <class Iterator, class SubRange>
  105. struct iterator_traits<MultiRangeIterator<MultiRange<Iterator, SubRange>>>
  106. : std::iterator_traits<Iterator>
  107. {};
  108. };
  109.  
  110. template <class Iterator, class SubRange>
  111. bool operator== (MultiRangeIterator<MultiRange<Iterator, SubRange>> const& lhs,
  112. MultiRangeIterator<MultiRange<Iterator, SubRange>> const& rhs)
  113. { return lhs.myIter == rhs.myIter && lhs.deeperIter == rhs.deeperIter; }
  114.  
  115. template <class E>
  116. bool operator == (MultiRangeIterator<EmptyRange<E>> const& lhs,
  117. MultiRangeIterator<EmptyRange<E>> const& rhs)
  118. { return true; }
  119.  
  120. template <class Range>
  121. bool operator != (MultiRangeIterator<Range> const& lhs, MultiRangeIterator<Range> const& rhs)
  122. { return !(lhs==rhs); }
  123.  
  124. template <class Iterator, class SubRange>
  125. typename MultiRange<Iterator, SubRange>::iterator
  126. MultiRange<Iterator, SubRange>::begin()
  127. { return iterator(*this, first, deeper.begin()); }
  128.  
  129. template <class Iterator, class SubRange>
  130. typename MultiRange<Iterator, SubRange>::iterator
  131. MultiRange<Iterator, SubRange>::end()
  132. { return iterator(*this, last, deeper.end()); }
  133.  
  134. template <class E>
  135. typename EmptyRange<E>::iterator
  136. EmptyRange<E>::begin()
  137. { return iterator(); }
  138. template <class E>
  139. typename EmptyRange<E>::iterator
  140. EmptyRange<E>::end()
  141. { return iterator(); }
  142.  
  143.  
  144. #include <vector>
  145. #include <list>
  146. #include <set>
  147. #include <iostream>
  148. #include <string>
  149. #include <sstream>
  150. #include <iterator>
  151.  
  152. /* nur zu Testzwecken...
  153. template <class E>
  154. char const* debug(MultiRangeIterator<EmptyRange<E>>) {return "()";}
  155.  
  156. template <class Iterator, class SubRange>
  157. std::string debug(MultiRangeIterator<MultiRange<Iterator, SubRange>> const& mri)
  158. {
  159.   std::ostringstream out;
  160.   out << '(' << std::distance(mri.myRange.first, mri.myIter);
  161.   if (mri.pastEndOfRange()) out << "=end";
  162.   out << debug(mri.deeperIter) << ')';
  163.   return out.str();
  164. } */
  165.  
  166. using namespace std;
  167.  
  168. int main()
  169. {
  170. vector<int> vi = {1,2,3,4};
  171. list<int> li = {5,6,7,8};
  172. list<int> li2 = {9,10};
  173.  
  174. auto myRange = makeRange(vi.begin(), vi.end())
  175. (li.begin(), li.end());
  176.  
  177. auto newRange = myRange.append(myRange.begin(), myRange.end())
  178. (li2.begin(), li2.end());
  179.  
  180. for(auto it = newRange.begin(); it != newRange.end(); ++it)
  181. {
  182. // cout << debug(it) << ": ";
  183. cout << *it << ',';
  184. }
  185. }
  186.  
Success #stdin #stdout 0s 3020KB
stdin
Standard input is empty
stdout
1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,9,10,