Listing 6: <iterator>, part 4


        //  TEMPLATE  FUNCTION  advance
template<class  InIt,  class  Dist>  inline
    void  advance(InIt&  p,  Dist  n)
    {_Advance(p,  n,  iterator_category(p));  }
template<class  InIt,  class  Dist>  inline
    void  _Advance(InIt&  p,  Dist  n,  input_iterator_tag)
    {for  (;  0  <  n;  --n)
        ++p;  }
template<class  FwdIt,  class  Dist>  inline
    void  _Advance(FwdIt&  p,  Dist  n,  forward_iterator_tag)
    {for  (;  0  <  n;  --n)
        ++p;  }
template<class  BidIt,  class  Dist>  inline
    void  _Advance(BidIt&  p,  Dist  n,  bidirectional_iterator_tag)
    {for  (;  0  <  n;  --n)
        ++p;
    for  (;  n  <  0;  ++n)
        --p;  }
template<class  RanIt,  class  Dist>  inline
    void  _Advance(RanIt&  p,  Dist  n,  random_access_iterator_tag)
    {p  +=  n;  }

        //  TEMPLATE  FUNCTION  distance
template<class  InIt,  class  Dist>  inline
    void  distance(InIt  first,  InIt  last,  Dist&  n)
    {_Distance(first,  last,  n,  iterator_category(first));  }
template<class  InIt,  class  Dist>  inline
    void  _Distance(InIt  first,  InIt  last,  Dist&  n,
        input_iterator_tag)
    {for  (;  first  !=  last;  ++first)
        ++n;  }
template<class  FwdIt,  class  Dist>  inline
    void  _Distance(FwdIt  first,  FwdIt  last,  Dist&  n,
        forward_iterator_tag)
    {for  (;  first  !=  last;  ++first)
        ++n;  }
template<class  BidIt,  class  Dist>  inline
    void  _Distance(BidIt  first,  BidIt  last,  Dist&  n,
        bidirectional_iterator_tag)
    {for  (;  first  !=  last;  ++first)
        ++n;  }
template<class  RanIt,  class  Dist>  inline
    void  _Distance(RanIt  first,  RanIt  last,  Dist&  n,
        random_access_iterator_tag)
    {n  +=  last  -  first;  }
//End of File