mirror of
https://github.com/boostorg/iterator.git
synced 2025-07-20 08:02:10 +02:00
removed use of std::distance and std::advance
also simplified the implementation by using the index iterator as the base instead of the element iterator [SVN r21765]
This commit is contained in:
@ -26,19 +26,19 @@ template< class ElementIterator
|
||||
class permutation_iterator
|
||||
: public iterator_adaptor<
|
||||
permutation_iterator<ElementIterator, IndexIterator, ValueT, CategoryT, ReferenceT, DifferenceT>
|
||||
, ElementIterator, ValueT, CategoryT, ReferenceT, DifferenceT >
|
||||
, IndexIterator, ValueT, CategoryT, ReferenceT, DifferenceT >
|
||||
{
|
||||
typedef iterator_adaptor<
|
||||
permutation_iterator<ElementIterator, IndexIterator, ValueT, CategoryT, ReferenceT, DifferenceT>
|
||||
, ElementIterator, ValueT, CategoryT, ReferenceT, DifferenceT > super_t;
|
||||
, IndexIterator, ValueT, CategoryT, ReferenceT, DifferenceT > super_t;
|
||||
|
||||
friend class iterator_core_access;
|
||||
|
||||
public:
|
||||
permutation_iterator() : order_it_() {}
|
||||
permutation_iterator() : m_elt_iter() {}
|
||||
|
||||
explicit permutation_iterator(ElementIterator x, IndexIterator y)
|
||||
: super_t(x), order_it_(y) {}
|
||||
: super_t(y), m_elt_iter(x) {}
|
||||
|
||||
template<class OtherElementIterator, class OtherIndexIterator, class V, class C, class R, class D >
|
||||
permutation_iterator(
|
||||
@ -46,36 +46,14 @@ public:
|
||||
, typename enable_if_convertible<OtherElementIterator, ElementIterator>::type* = 0
|
||||
, typename enable_if_convertible<OtherIndexIterator, IndexIterator>::type* = 0
|
||||
)
|
||||
: super_t(r.base())
|
||||
: super_t(r.base()), m_elt_iter(r.m_elt_iter)
|
||||
{}
|
||||
|
||||
private:
|
||||
typename super_t::reference dereference() const
|
||||
{ return *(this->base() + *this->order_it_); }
|
||||
{ return *(m_elt_iter + *this->base()); }
|
||||
|
||||
void increment() { ++this->order_it_; }
|
||||
void decrement() { --this->order_it_; }
|
||||
|
||||
void advance(typename super_t::difference_type n)
|
||||
{
|
||||
std::advance( order_it_, n );
|
||||
}
|
||||
|
||||
template<class OtherElementIterator, class OtherIndexIterator, class V, class C, class R, class D >
|
||||
typename super_t::difference_type
|
||||
distance_to( permutation_iterator<OtherElementIterator, OtherIndexIterator, V, C, R, D> const& y ) const
|
||||
{
|
||||
return std::distance( this->order_it_, y.order_it_ );
|
||||
}
|
||||
|
||||
template<class OtherElementIterator, class OtherIndexIterator, class V, class C, class R, class D >
|
||||
bool
|
||||
equal( permutation_iterator<OtherElementIterator, OtherIndexIterator, V, C, R, D> const& y ) const
|
||||
{
|
||||
return( y.order_it_ == this->order_it_ );
|
||||
}
|
||||
|
||||
IndexIterator order_it_;
|
||||
ElementIterator m_elt_iter;
|
||||
};
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user