1 // (C) Copyright Toon Knapen 2001. Permission to copy, use,
2 // modify, sell and distribute this software is granted provided this
3 // copyright notice appears in all copies. This software is provided
4 // "as is" without express or implied warranty, and with no claim as
5 // to its suitability for any purpose.
8 // See http://www.boost.org/libs/utility/permutation_iterator.htm for documentation.
10 #ifndef boost_permutation_iterator_hpp
11 #define boost_permutation_iterator_hpp
13 #include <boost/iterator_adaptors.hpp>
17 template < typename IndexIterator >
18 struct permutation_iterator_policies : public default_iterator_policies
20 permutation_iterator_policies() {}
22 permutation_iterator_policies(IndexIterator order_it)
23 : order_it_( order_it )
26 template <class IteratorAdaptor>
27 typename IteratorAdaptor::reference dereference(const IteratorAdaptor& x) const
28 { return *(x.base() + *order_it_); }
30 template <class IteratorAdaptor>
31 void increment(IteratorAdaptor&)
34 template <class IteratorAdaptor>
35 void decrement(IteratorAdaptor&)
38 template <class IteratorAdaptor, class DifferenceType>
39 void advance(IteratorAdaptor& x, DifferenceType n)
40 { std::advance( order_it_, n ); }
42 template <class IteratorAdaptor1, class IteratorAdaptor2>
43 typename IteratorAdaptor1::difference_type
44 distance(const IteratorAdaptor1& x, const IteratorAdaptor2& y) const
45 { return std::distance( x.policies().order_it_, y.policies().order_it_ ); }
47 template <class IteratorAdaptor1, class IteratorAdaptor2>
48 bool equal(const IteratorAdaptor1& x, const IteratorAdaptor2& y) const
49 { return x.policies().order_it_ == y.policies().order_it_; }
51 IndexIterator order_it_;
54 template < typename ElementIterator, typename IndexIterator >
55 struct permutation_iterator_generator
57 typedef boost::iterator_adaptor
59 permutation_iterator_policies< IndexIterator >
63 template < class IndexIterator, class ElementIterator >
64 inline typename permutation_iterator_generator< ElementIterator, IndexIterator >::type
65 make_permutation_iterator(ElementIterator base, IndexIterator order)
67 typedef typename permutation_iterator_generator< ElementIterator, IndexIterator >::type result_t;
68 return result_t( base, order );
73 #endif // boost_permutation_iterator_hpp