Listing 1: <iterator>, part 5


          // 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 */