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:
Jeremy Siek
2004-01-15 18:48:35 +00:00
parent c08cc33394
commit 73e6736566

View File

@ -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_;
}; };