You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
72 lines
2.2 KiB
72 lines
2.2 KiB
// (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
|
|
|