2010-07-26 17:06:36 +00:00
|
|
|
// (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
|