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