// TEMPLATE CLASS reverse_iterator
template<class RanIt, class T, class Ref = T&,
class Ptr = T *, class Dist = ptrdiff_t>
class reverse_iterator
: public random_access_iterator<T, Dist> {
public:
typedef reverse_iterator<RanIt, T, Ref, Ptr, Dist> Mytype;
reverse_iterator()
{}
explicit reverse_iterator(RanIt x)
: current(x) {}
RanIt base() const
{return (current); }
Ref operator*() const
{return (*(current - 1)); }
Ptr operator->() const
{return (&**this); }
Mytype& operator++()
{--current;
return (*this); }
Mytype operator++(int)
{Mytype tmp = *this;
--current;
return (tmp); }
Mytype& operator--()
{++current;
return (*this); }
Mytype operator--(int)
{Mytype tmp = *this;
++current;
return (tmp); }
Mytype& operator+=(Dist n)
{current -= n;
return (*this); }
Mytype operator+(Dist n) const
{return (Mytype(current - n)); }
Mytype& operator-=(Dist n)
{current += n;
return (*this); }
Mytype operator-(Dist n) const
{return (Mytype(current + n)); }
Ref operator[](Dist n) const
{return (*(*this + n)); }
protected:
RanIt current;
};
// reverse_iterator OPERATORS
template<class RanIt, class T, class Ref, class Ptr,
class Dist> inline
bool operator==(
const reverse_iterator<RanIt, T, Ref, Ptr, Dist>& x,
const reverse_iterator<RanIt, T, Ref, Ptr, Dist>& y)
{return (x.base() == y.base()); }
template<class RanIt, class T, class Ref, class Ptr,
class Dist> inline
bool operator<(
const reverse_iterator<RanIt, T, Ref, Ptr, Dist>& x,
const reverse_iterator<RanIt, T, Ref, Ptr, Dist>& y)
{return (y.base() < x.base()); }
template<class RanIt, class T, class Ref, class Ptr,
class Dist> inline
Dist operator-(
const reverse_iterator<RanIt, T, Ref, Ptr, Dist>& x,
const reverse_iterator<RanIt, T, Ref, Ptr, Dist>& y)
{return (y.base() - x.base()); }
template<class RanIt, class T, class Ref, class Ptr,
class Dist> inline
reverse_iterator<RanIt, T, Ref, Ptr, Dist> operator+(Dist n,
const reverse_iterator<RanIt, T, Ref, Ptr, Dist>& y)
{return (reverse_iterator<RanIt, T, Ref, Ptr, Dist>(
y.base() - n)); }
/* End of File */