]> git.lyx.org Git - lyx.git/blob - boost/boost/permutation_iterator.hpp
LFUN_ESCAPE gets ReadOnly (fix bug 1142)
[lyx.git] / boost / boost / permutation_iterator.hpp
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.
6 //
7
8 //  See http://www.boost.org/libs/utility/permutation_iterator.htm for documentation.
9
10 #ifndef boost_permutation_iterator_hpp
11 #define boost_permutation_iterator_hpp
12
13 #include <boost/iterator_adaptors.hpp>
14
15 namespace boost {
16
17   template < typename IndexIterator >
18   struct permutation_iterator_policies : public default_iterator_policies
19   {
20     permutation_iterator_policies() {}
21
22     permutation_iterator_policies(IndexIterator order_it) 
23       : order_it_( order_it ) 
24     {}
25
26     template <class IteratorAdaptor>
27     typename IteratorAdaptor::reference dereference(const IteratorAdaptor& x) const
28     { return *(x.base() + *order_it_); }
29
30     template <class IteratorAdaptor>
31     void increment(IteratorAdaptor&)
32     { ++order_it_; }
33
34     template <class IteratorAdaptor>
35     void decrement(IteratorAdaptor&)
36     { --order_it_; }
37
38     template <class IteratorAdaptor, class DifferenceType>
39     void advance(IteratorAdaptor& x, DifferenceType n)
40     { std::advance( order_it_, n ); }
41
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_ ); }
46
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_; }
50   
51     IndexIterator order_it_;
52   };
53
54   template < typename ElementIterator, typename IndexIterator >
55   struct permutation_iterator_generator
56   {
57     typedef boost::iterator_adaptor
58     < ElementIterator,
59       permutation_iterator_policies< IndexIterator > 
60     > type;
61   };
62
63   template < class IndexIterator, class ElementIterator >
64   inline typename permutation_iterator_generator< ElementIterator, IndexIterator >::type
65   make_permutation_iterator(ElementIterator base, IndexIterator order)
66   {
67     typedef typename permutation_iterator_generator< ElementIterator, IndexIterator >::type result_t;
68     return result_t( base, order );
69   }
70
71 } // namespace boost
72
73 #endif // boost_permutation_iterator_hpp
74