downcast() -> self()

distance_from() -> distance_to()


[SVN r669]
This commit is contained in:
Dave Abrahams
2002-11-07 03:09:00 +00:00
parent 15edaef66e
commit ad9df3393d

View File

@@ -19,8 +19,8 @@ struct downcastable : Base
{ {
typedef typename Base::final final_t; typedef typename Base::final final_t;
public: public:
final_t& downcast() { return static_cast<final_t&>(*this); } final_t& self() { return static_cast<final_t&>(*this); }
const final_t& downcast() const { return static_cast<const final_t&>(*this); } const final_t& self() const { return static_cast<const final_t&>(*this); }
}; };
template <class Base> template <class Base>
@@ -32,42 +32,42 @@ template <class Base1, class Base2>
inline bool operator==(const iterator_comparisons<Base1>& xb, inline bool operator==(const iterator_comparisons<Base1>& xb,
const iterator_comparisons<Base2>& yb) const iterator_comparisons<Base2>& yb)
{ {
return xb.downcast().equal(yb.downcast()); return xb.self().equal(yb.self());
} }
template <class Base1, class Base2> template <class Base1, class Base2>
inline bool operator!=(const iterator_comparisons<Base1>& xb, inline bool operator!=(const iterator_comparisons<Base1>& xb,
const iterator_comparisons<Base2>& yb) const iterator_comparisons<Base2>& yb)
{ {
return !xb.downcast().equal(yb.downcast()); return !xb.self().equal(yb.self());
} }
template <class Base1, class Base2> template <class Base1, class Base2>
inline bool operator<(const iterator_comparisons<Base1>& xb, inline bool operator<(const iterator_comparisons<Base1>& xb,
const iterator_comparisons<Base2>& yb) const iterator_comparisons<Base2>& yb)
{ {
return yb.downcast().distance_from(xb.downcast()) < 0; return xb.self().distance_to(yb.self()) < 0;
} }
template <class Base1, class Base2> template <class Base1, class Base2>
inline bool operator>(const iterator_comparisons<Base1>& xb, inline bool operator>(const iterator_comparisons<Base1>& xb,
const iterator_comparisons<Base2>& yb) const iterator_comparisons<Base2>& yb)
{ {
return yb.downcast().distance_from(xb.downcast()) > 0; return xb.self().distance_to(yb.self()) > 0;
} }
template <class Base1, class Base2> template <class Base1, class Base2>
inline bool operator>=(const iterator_comparisons<Base1>& xb, inline bool operator>=(const iterator_comparisons<Base1>& xb,
const iterator_comparisons<Base2>& yb) const iterator_comparisons<Base2>& yb)
{ {
return yb.downcast().distance_from(xb.downcast()) >= 0; return xb.self().distance_to(yb.self()) >= 0;
} }
template <class Base1, class Base2> template <class Base1, class Base2>
inline bool operator<=(const iterator_comparisons<Base1>& xb, inline bool operator<=(const iterator_comparisons<Base1>& xb,
const iterator_comparisons<Base2>& yb) const iterator_comparisons<Base2>& yb)
{ {
return yb.downcast().distance_from(xb.downcast()) <= 0; return xb.self().distance_to(yb.self()) <= 0;
} }
@@ -79,7 +79,7 @@ typename Base::final operator+(
const iterator_arith<Base>& i, // pass by ref, not value to avoid slicing -JGS const iterator_arith<Base>& i, // pass by ref, not value to avoid slicing -JGS
typename Base::difference_type n) typename Base::difference_type n)
{ {
typename Base::final tmp(i.downcast()); typename Base::final tmp(i.self());
return tmp += n; return tmp += n;
} }
@@ -88,7 +88,7 @@ typename Base::final operator+(
typename Base::difference_type n, typename Base::difference_type n,
const iterator_arith<Base>& i) // pass by ref, not value to avoid slicing -JGS const iterator_arith<Base>& i) // pass by ref, not value to avoid slicing -JGS
{ {
typename Base::final tmp(i.downcast()); typename Base::final tmp(i.self());
return tmp += n; return tmp += n;
} }
@@ -97,7 +97,7 @@ typename Base1::difference_type operator-(
const iterator_arith<Base1>& i, const iterator_arith<Base1>& i,
const iterator_arith<Base2>& j) const iterator_arith<Base2>& j)
{ {
return j.downcast().distance_from(i.downcast()); return i.self().distance_to(i.self());
} }
@@ -116,49 +116,49 @@ struct iterator_adaptor : B
typedef D difference_type; typedef D difference_type;
reference operator*() const reference operator*() const
{ return downcast().dereference(); } { return self().dereference(); }
//operator->() const { return detail::operator_arrow(*this, iterator_category()); } //operator->() const { return detail::operator_arrow(*this, iterator_category()); }
reference operator[](difference_type n) const reference operator[](difference_type n) const
{ return *(*this + n); } { return *(*this + n); }
Final& operator++() Final& operator++()
{ downcast().increment(); return downcast(); } { self().increment(); return self(); }
Final operator++(int) Final operator++(int)
{ Final tmp(downcast()); ++*this; return tmp; } { Final tmp(self()); ++*this; return tmp; }
Final& operator--() Final& operator--()
{ downcast().decrement(); return downcast(); } { self().decrement(); return self(); }
Final operator--(int) Final operator--(int)
{ Final tmp(downcast()); --*this; return tmp; } { Final tmp(self()); --*this; return tmp; }
Final& operator+=(difference_type n) Final& operator+=(difference_type n)
{ downcast().advance(n); return downcast(); } { self().advance(n); return self(); }
Final& operator-=(difference_type n) Final& operator-=(difference_type n)
{ downcast().advance(-n); return downcast(); } { self().advance(-n); return self(); }
Final operator-(difference_type x) const Final operator-(difference_type x) const
{ Final result(downcast()); return result -= x; } { Final result(self()); return result -= x; }
template <class Final2, class V2, class R2, class P2, class B2> template <class Final2, class V2, class R2, class P2, class B2>
bool equal(iterator_adaptor<Final2,V2,R2,P2,C,D,B2> const& x) const bool equal(iterator_adaptor<Final2,V2,R2,P2,C,D,B2> const& x) const
{ {
return this->downcast().base() == x.downcast().base(); return self().base() == x.self().base();
} }
void advance(difference_type n) void advance(difference_type n)
{ {
this->downcast().base() += n; self().base() += n;
} }
reference dereference() const { return *this->downcast().base(); } reference dereference() const { return *self().base(); }
void increment() { ++this->downcast().base(); } void increment() { ++self().base(); }
void decrement() { --this->downcast().base(); } void decrement() { --self().base(); }
template <class Final2, class B2, class V2, class R2, class P2> template <class Final2, class B2, class V2, class R2, class P2>
difference_type difference_type
distance_from(const iterator_adaptor<Final2,V2,R2,P2,C,D,B2>& y) const distance_to(const iterator_adaptor<Final2,V2,R2,P2,C,D,B2>& y) const
{ {
return y.downcast().base() - this->downcast().base();//? return self().base() - y.self().base();//?
} }
private: private:
using B::downcast; using B::self;
}; };
@@ -199,9 +199,9 @@ struct reverse_iterator
template <class B2, class V2, class R2, class P2> template <class B2, class V2, class R2, class P2>
typename super::difference_type typename super::difference_type
distance_from(const reverse_iterator<B2,V2,R2,P2,C,D>& y) const distance_to(const reverse_iterator<B2,V2,R2,P2,C,D>& y) const
{ {
return m_base - y.m_base; return y.m_base - m_base;
} }
private: private:
Base m_base; Base m_base;
@@ -242,7 +242,6 @@ private:
AdaptableUnaryFunction m_f; AdaptableUnaryFunction m_f;
}; };
} // namespace boost } // namespace boost