Chris@16
|
1 // (C) Copyright Toon Knapen 2001.
|
Chris@16
|
2 // (C) Copyright David Abrahams 2003.
|
Chris@16
|
3 // (C) Copyright Roland Richter 2003.
|
Chris@16
|
4 // Distributed under the Boost Software License, Version 1.0. (See
|
Chris@16
|
5 // accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
6 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
7
|
Chris@16
|
8 #ifndef BOOST_PERMUTATION_ITERATOR_HPP
|
Chris@16
|
9 #define BOOST_PERMUTATION_ITERATOR_HPP
|
Chris@16
|
10
|
Chris@16
|
11 #include <iterator>
|
Chris@16
|
12
|
Chris@16
|
13 #include <boost/iterator/iterator_adaptor.hpp>
|
Chris@16
|
14
|
Chris@16
|
15
|
Chris@101
|
16 namespace boost {
|
Chris@101
|
17 namespace iterators {
|
Chris@16
|
18
|
Chris@16
|
19 template< class ElementIterator
|
Chris@16
|
20 , class IndexIterator>
|
Chris@16
|
21 class permutation_iterator
|
Chris@101
|
22 : public iterator_adaptor<
|
Chris@16
|
23 permutation_iterator<ElementIterator, IndexIterator>
|
Chris@101
|
24 , IndexIterator, typename boost::detail::iterator_traits<ElementIterator>::value_type
|
Chris@101
|
25 , use_default, typename boost::detail::iterator_traits<ElementIterator>::reference>
|
Chris@16
|
26 {
|
Chris@101
|
27 typedef iterator_adaptor<
|
Chris@16
|
28 permutation_iterator<ElementIterator, IndexIterator>
|
Chris@101
|
29 , IndexIterator, typename boost::detail::iterator_traits<ElementIterator>::value_type
|
Chris@101
|
30 , use_default, typename boost::detail::iterator_traits<ElementIterator>::reference> super_t;
|
Chris@16
|
31
|
Chris@16
|
32 friend class iterator_core_access;
|
Chris@16
|
33
|
Chris@16
|
34 public:
|
Chris@16
|
35 permutation_iterator() : m_elt_iter() {}
|
Chris@16
|
36
|
Chris@101
|
37 explicit permutation_iterator(ElementIterator x, IndexIterator y)
|
Chris@16
|
38 : super_t(y), m_elt_iter(x) {}
|
Chris@16
|
39
|
Chris@16
|
40 template<class OtherElementIterator, class OtherIndexIterator>
|
Chris@16
|
41 permutation_iterator(
|
Chris@16
|
42 permutation_iterator<OtherElementIterator, OtherIndexIterator> const& r
|
Chris@16
|
43 , typename enable_if_convertible<OtherElementIterator, ElementIterator>::type* = 0
|
Chris@16
|
44 , typename enable_if_convertible<OtherIndexIterator, IndexIterator>::type* = 0
|
Chris@16
|
45 )
|
Chris@16
|
46 : super_t(r.base()), m_elt_iter(r.m_elt_iter)
|
Chris@16
|
47 {}
|
Chris@16
|
48
|
Chris@16
|
49 private:
|
Chris@16
|
50 typename super_t::reference dereference() const
|
Chris@16
|
51 { return *(m_elt_iter + *this->base()); }
|
Chris@16
|
52
|
Chris@16
|
53 #ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
|
Chris@16
|
54 template <class,class> friend class permutation_iterator;
|
Chris@16
|
55 #else
|
Chris@16
|
56 public:
|
Chris@101
|
57 #endif
|
Chris@16
|
58 ElementIterator m_elt_iter;
|
Chris@16
|
59 };
|
Chris@16
|
60
|
Chris@16
|
61
|
Chris@16
|
62 template <class ElementIterator, class IndexIterator>
|
Chris@101
|
63 inline permutation_iterator<ElementIterator, IndexIterator>
|
Chris@16
|
64 make_permutation_iterator( ElementIterator e, IndexIterator i )
|
Chris@16
|
65 {
|
Chris@16
|
66 return permutation_iterator<ElementIterator, IndexIterator>( e, i );
|
Chris@16
|
67 }
|
Chris@16
|
68
|
Chris@101
|
69 } // namespace iterators
|
Chris@101
|
70
|
Chris@101
|
71 using iterators::permutation_iterator;
|
Chris@101
|
72 using iterators::make_permutation_iterator;
|
Chris@16
|
73
|
Chris@16
|
74 } // namespace boost
|
Chris@16
|
75
|
Chris@16
|
76 #endif
|