File indexing completed on 2025-09-17 08:34:37
0001
0002
0003
0004
0005
0006
0007
0008 #ifndef BOOST_ITERATOR_PERMUTATION_ITERATOR_HPP_INCLUDED_
0009 #define BOOST_ITERATOR_PERMUTATION_ITERATOR_HPP_INCLUDED_
0010
0011 #include <iterator>
0012
0013 #include <boost/core/use_default.hpp>
0014 #include <boost/iterator/iterator_adaptor.hpp>
0015 #include <boost/iterator/enable_if_convertible.hpp>
0016
0017 namespace boost {
0018 namespace iterators {
0019
0020 template< typename ElementIterator, typename IndexIterator >
0021 class permutation_iterator :
0022 public iterator_adaptor<
0023 permutation_iterator< ElementIterator, IndexIterator >,
0024 IndexIterator,
0025 typename std::iterator_traits< ElementIterator >::value_type,
0026 use_default,
0027 typename std::iterator_traits< ElementIterator >::reference
0028 >
0029 {
0030 friend class iterator_core_access;
0031 template< typename, typename >
0032 friend class permutation_iterator;
0033
0034 private:
0035 using super_t = iterator_adaptor<
0036 permutation_iterator< ElementIterator, IndexIterator >,
0037 IndexIterator,
0038 typename std::iterator_traits< ElementIterator >::value_type,
0039 use_default,
0040 typename std::iterator_traits< ElementIterator >::reference
0041 >;
0042
0043 public:
0044 permutation_iterator() :
0045 m_elt_iter()
0046 {}
0047
0048 explicit permutation_iterator(ElementIterator x, IndexIterator y) :
0049 super_t(y),
0050 m_elt_iter(x)
0051 {}
0052
0053 template<
0054 typename OtherElementIterator,
0055 typename OtherIndexIterator,
0056 typename = enable_if_convertible_t< OtherElementIterator, ElementIterator >,
0057 typename = enable_if_convertible_t< OtherIndexIterator, IndexIterator >
0058 >
0059 permutation_iterator(permutation_iterator< OtherElementIterator, OtherIndexIterator > const& r) :
0060 super_t(r.base()),
0061 m_elt_iter(r.m_elt_iter)
0062 {}
0063
0064 private:
0065 typename super_t::reference dereference() const { return *(m_elt_iter + *this->base()); }
0066
0067 private:
0068 ElementIterator m_elt_iter;
0069 };
0070
0071
0072 template< typename ElementIterator, typename IndexIterator >
0073 inline permutation_iterator< ElementIterator, IndexIterator > make_permutation_iterator(ElementIterator e, IndexIterator i)
0074 {
0075 return permutation_iterator< ElementIterator, IndexIterator >(e, i);
0076 }
0077
0078 }
0079
0080 using iterators::permutation_iterator;
0081 using iterators::make_permutation_iterator;
0082
0083 }
0084
0085 #endif