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
|
class permutation_iterator
|
||||||
: public iterator_adaptor<
|
: public iterator_adaptor<
|
||||||
permutation_iterator<ElementIterator, IndexIterator, ValueT, CategoryT, ReferenceT, DifferenceT>
|
permutation_iterator<ElementIterator, IndexIterator, ValueT, CategoryT, ReferenceT, DifferenceT>
|
||||||
, ElementIterator, ValueT, CategoryT, ReferenceT, DifferenceT >
|
, IndexIterator, ValueT, CategoryT, ReferenceT, DifferenceT >
|
||||||
{
|
{
|
||||||
typedef iterator_adaptor<
|
typedef iterator_adaptor<
|
||||||
permutation_iterator<ElementIterator, IndexIterator, ValueT, CategoryT, ReferenceT, DifferenceT>
|
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;
|
friend class iterator_core_access;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
permutation_iterator() : order_it_() {}
|
permutation_iterator() : m_elt_iter() {}
|
||||||
|
|
||||||
explicit permutation_iterator(ElementIterator x, IndexIterator y)
|
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 >
|
template<class OtherElementIterator, class OtherIndexIterator, class V, class C, class R, class D >
|
||||||
permutation_iterator(
|
permutation_iterator(
|
||||||
@ -46,36 +46,14 @@ public:
|
|||||||
, typename enable_if_convertible<OtherElementIterator, ElementIterator>::type* = 0
|
, typename enable_if_convertible<OtherElementIterator, ElementIterator>::type* = 0
|
||||||
, typename enable_if_convertible<OtherIndexIterator, IndexIterator>::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:
|
private:
|
||||||
typename super_t::reference dereference() const
|
typename super_t::reference dereference() const
|
||||||
{ return *(this->base() + *this->order_it_); }
|
{ return *(m_elt_iter + *this->base()); }
|
||||||
|
|
||||||
void increment() { ++this->order_it_; }
|
ElementIterator m_elt_iter;
|
||||||
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_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user