Files
boost_iterator/include/boost/permutation_iterator.hpp
T

75 lines
2.4 KiB
C++
Raw Normal View History

2001-11-30 10:38:36 +00:00
// (C) Copyright Toon Knapen 2001. Permission to copy, use,
// modify, sell and distribute this software is granted provided this
// copyright notice appears in all copies. This software is provided
// "as is" without express or implied warranty, and with no claim as
// to its suitability for any purpose.
//
2002-12-27 16:51:53 +00:00
// See http://www.boost.org/libs/utility/permutation_iterator.htm for documentation.
2002-01-26 09:26:09 +00:00
#ifndef boost_permutation_iterator_hpp
#define boost_permutation_iterator_hpp
2001-11-30 10:38:36 +00:00
#include <boost/iterator_adaptors.hpp>
namespace boost {
template < typename IndexIterator >
2001-11-30 10:38:36 +00:00
struct permutation_iterator_policies : public default_iterator_policies
{
permutation_iterator_policies() {}
permutation_iterator_policies(IndexIterator order_it)
2001-11-30 10:38:36 +00:00
: order_it_( order_it )
{}
template <class IteratorAdaptor>
typename IteratorAdaptor::reference dereference(const IteratorAdaptor& x) const
{ return *(x.base() + *order_it_); }
template <class IteratorAdaptor>
void increment(IteratorAdaptor&)
2001-11-30 10:38:36 +00:00
{ ++order_it_; }
template <class IteratorAdaptor>
void decrement(IteratorAdaptor&)
2001-11-30 10:38:36 +00:00
{ --order_it_; }
template <class IteratorAdaptor, class DifferenceType>
void advance(IteratorAdaptor& x, DifferenceType n)
{ std::advance( order_it_, n ); }
template <class IteratorAdaptor1, class IteratorAdaptor2>
typename IteratorAdaptor1::difference_type
distance(const IteratorAdaptor1& x, const IteratorAdaptor2& y) const
{ return std::distance( x.policies().order_it_, y.policies().order_it_ ); }
template <class IteratorAdaptor1, class IteratorAdaptor2>
bool equal(const IteratorAdaptor1& x, const IteratorAdaptor2& y) const
{ return x.policies().order_it_ == y.policies().order_it_; }
IndexIterator order_it_;
2001-11-30 10:38:36 +00:00
};
template < typename ElementIterator, typename IndexIterator >
2001-11-30 10:38:36 +00:00
struct permutation_iterator_generator
{
typedef boost::iterator_adaptor
< ElementIterator,
permutation_iterator_policies< IndexIterator >
2001-11-30 10:38:36 +00:00
> type;
};
template < class IndexIterator, class ElementIterator >
inline typename permutation_iterator_generator< ElementIterator, IndexIterator >::type
make_permutation_iterator(ElementIterator base, IndexIterator order)
2001-11-30 10:38:36 +00:00
{
typedef typename permutation_iterator_generator< ElementIterator, IndexIterator >::type result_t;
2001-11-30 10:38:36 +00:00
return result_t( base, order );
}
} // namespace boost
2002-01-26 09:26:09 +00:00
#endif // boost_permutation_iterator_hpp