| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- // (C) Copyright Toon Knapen 2001.
- // (C) Copyright David Abrahams 2003.
- // (C) Copyright Roland Richter 2003.
- // Distributed under the Boost Software License, Version 1.0. (See
- // accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- #ifndef BOOST_ITERATOR_PERMUTATION_ITERATOR_HPP_INCLUDED_
- #define BOOST_ITERATOR_PERMUTATION_ITERATOR_HPP_INCLUDED_
- #include <iterator>
- #include <boost/core/use_default.hpp>
- #include <boost/iterator/iterator_adaptor.hpp>
- #include <boost/iterator/enable_if_convertible.hpp>
- namespace boost {
- namespace iterators {
- template< typename ElementIterator, typename IndexIterator >
- class permutation_iterator :
- public iterator_adaptor<
- permutation_iterator< ElementIterator, IndexIterator >,
- IndexIterator,
- typename std::iterator_traits< ElementIterator >::value_type,
- use_default,
- typename std::iterator_traits< ElementIterator >::reference
- >
- {
- friend class iterator_core_access;
- template< typename, typename >
- friend class permutation_iterator;
- private:
- using super_t = iterator_adaptor<
- permutation_iterator< ElementIterator, IndexIterator >,
- IndexIterator,
- typename std::iterator_traits< ElementIterator >::value_type,
- use_default,
- typename std::iterator_traits< ElementIterator >::reference
- >;
- public:
- permutation_iterator() :
- m_elt_iter()
- {}
- explicit permutation_iterator(ElementIterator x, IndexIterator y) :
- super_t(y),
- m_elt_iter(x)
- {}
- template<
- typename OtherElementIterator,
- typename OtherIndexIterator,
- typename = enable_if_convertible_t< OtherElementIterator, ElementIterator >,
- typename = enable_if_convertible_t< OtherIndexIterator, IndexIterator >
- >
- permutation_iterator(permutation_iterator< OtherElementIterator, OtherIndexIterator > const& r) :
- super_t(r.base()),
- m_elt_iter(r.m_elt_iter)
- {}
- private:
- typename super_t::reference dereference() const { return *(m_elt_iter + *this->base()); }
- private:
- ElementIterator m_elt_iter;
- };
- template< typename ElementIterator, typename IndexIterator >
- inline permutation_iterator< ElementIterator, IndexIterator > make_permutation_iterator(ElementIterator e, IndexIterator i)
- {
- return permutation_iterator< ElementIterator, IndexIterator >(e, i);
- }
- } // namespace iterators
- using iterators::permutation_iterator;
- using iterators::make_permutation_iterator;
- } // namespace boost
- #endif // BOOST_ITERATOR_PERMUTATION_ITERATOR_HPP_INCLUDED_
|