Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-09-17 08:34:37

0001 // (C) Copyright Toon Knapen    2001.
0002 // (C) Copyright David Abrahams 2003.
0003 // (C) Copyright Roland Richter 2003.
0004 // Distributed under the Boost Software License, Version 1.0. (See
0005 // accompanying file LICENSE_1_0.txt or copy at
0006 // http://www.boost.org/LICENSE_1_0.txt)
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 } // namespace iterators
0079 
0080 using iterators::permutation_iterator;
0081 using iterators::make_permutation_iterator;
0082 
0083 } // namespace boost
0084 
0085 #endif // BOOST_ITERATOR_PERMUTATION_ITERATOR_HPP_INCLUDED_