From ba354377d56a08fa4ba3a80074008b38f32b4144 Mon Sep 17 00:00:00 2001
From: Jeremy Siek
-template <class Iterator, - class ConstIterator, +template <class Iterator, + class ConstIterator, class Traits = std::iterator_traits<Iterator>, - class ConstTraits = std::iterator_traits<ConstIterator>, + class ConstTraits = std::iterator_traits<ConstIterator>, class Policies = default_iterator_policies> struct iterator_adaptors { @@ -119,7 +124,7 @@ struct default_iterator_policies { return *x; } template <class Iterator> - void increment(Iterator& x) const + static void increment(Iterator& x) { ++x; } template <class Iterator1, class Iterator2> @@ -128,12 +133,12 @@ struct default_iterator_policies // required for a BidirectionalIterator template <class Iterator> - void decrement(Iterator& x) const + static void decrement(Iterator& x) { --x; } // required for a RandomAccessIterator template <class Iterator, class DifferenceType> - void advance(Iterator& x, DifferenceType n) const + static void advance(Iterator& x, DifferenceType n) { x += n; } template <class Difference, class Iterator1, class Iterator2> @@ -174,9 +179,8 @@ arguments.
|
- struct indirect_iterator_policies : public default_iterator_policies - { +struct indirect_iterator_policies : public default_iterator_policies +{ template <class Reference, class Iterator> Reference dereference(type<Reference>, const Iterator& x) const - { return **x; } - }; + { return **x; } +}; + |
+
++template <class OuterIterator, class InnerIterator, + class OuterTraits = std::iterator_traits<OuterIterator>, + class InnerTraits = std::iterator_traits<InnerIterator> + > +struct indirect_traits +{ + typedef typename OuterTraits::difference_type difference_type; + typedef typename InnerTraits::value_type value_type; + typedef typename InnerTraits::pointer pointer; + typedef typename InnerTraits::reference reference; + typedef typename OuterTraits::iterator_category iterator_category; +}; + |
+
++template <class OuterIterator, class InnerIterator, + class OuterTraits = std::iterator_traits<OuterIterator>, + class InnerTraits = std::iterator_traits<InnerIterator> + > +struct indirect_iterator +{ + typedef iterator_adaptor<OuterIterator, + indirect_iterator_policies, + indirect_traits<OuterIterator, InnerIterator, + OuterTraits, InnerTraits> + > type; +}; + +template <class OuterIterator, // Mutable or Immutable, does not matter + class InnerIterator, // Mutable + class ConstInnerIterator, // Immutable + class OuterTraits = std::iterator_traits<OuterIterator>, + class InnerTraits = std::iterator_traits<InnerIterator>, + class ConstInnerTraits = std::iterator_traits<ConstInnerIterator> + > +struct indirect_iterators +{ + typedef iterator_adaptors<OuterIterator, OuterIterator, + indirect_traits<OuterIterator, InnerIterator, + OuterTraits, InnerTraits>, + indirect_traits<OuterIterator, ConstInnerIterator, + OuterTraits, ConstInnerTraits>, + indirect_iterator_policies + > Adaptors; typedef typename Adaptors::iterator iterator; typedef typename Adaptors::const_iterator const_iterator; - }; +}; |