// (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_PERMUTATION_ITERATOR_HPP | |
#define BOOST_PERMUTATION_ITERATOR_HPP | |
#include <iterator> | |
#include <boost/iterator/iterator_adaptor.hpp> | |
namespace boost | |
{ | |
template< class ElementIterator | |
, class IndexIterator> | |
class permutation_iterator | |
: public iterator_adaptor< | |
permutation_iterator<ElementIterator, IndexIterator> | |
, IndexIterator, typename detail::iterator_traits<ElementIterator>::value_type | |
, use_default, typename detail::iterator_traits<ElementIterator>::reference> | |
{ | |
typedef iterator_adaptor< | |
permutation_iterator<ElementIterator, IndexIterator> | |
, IndexIterator, typename detail::iterator_traits<ElementIterator>::value_type | |
, use_default, typename detail::iterator_traits<ElementIterator>::reference> super_t; | |
friend class iterator_core_access; | |
public: | |
permutation_iterator() : m_elt_iter() {} | |
explicit permutation_iterator(ElementIterator x, IndexIterator y) | |
: super_t(y), m_elt_iter(x) {} | |
template<class OtherElementIterator, class OtherIndexIterator> | |
permutation_iterator( | |
permutation_iterator<OtherElementIterator, OtherIndexIterator> const& r | |
, typename enable_if_convertible<OtherElementIterator, ElementIterator>::type* = 0 | |
, typename enable_if_convertible<OtherIndexIterator, IndexIterator>::type* = 0 | |
) | |
: super_t(r.base()), m_elt_iter(r.m_elt_iter) | |
{} | |
private: | |
typename super_t::reference dereference() const | |
{ return *(m_elt_iter + *this->base()); } | |
#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS | |
template <class,class> friend class permutation_iterator; | |
#else | |
public: | |
#endif | |
ElementIterator m_elt_iter; | |
}; | |
template <class ElementIterator, class IndexIterator> | |
permutation_iterator<ElementIterator, IndexIterator> | |
make_permutation_iterator( ElementIterator e, IndexIterator i ) | |
{ | |
return permutation_iterator<ElementIterator, IndexIterator>( e, i ); | |
} | |
} // namespace boost | |
#endif |