// Example 13-19: A simple implementation of distance.
#include <iterator>

namespace not_really_std {
  template<typename InputIter>
  typename std::iterator_traits<InputIter>::difference_type
  specialize_distance(InputIter first, InputIter last, ...)
  {
    typename std::iterator_traits<InputIter>::difference_type n;
    for (n = 0; first != last; ++first)
      ++n;
    return n;
  }

  template<typename InputIter>
  typename std::iterator_traits<InputIter>::difference_type
  specialize_distance(InputIter first, InputIter last,
                      std::random_access_iterator_tag)
  {
    return last - first;
  }

  template<typename InputIter>
  typename std::iterator_traits<InputIter>::difference_type
  distance(InputIter first, InputIter last)
  {
    return specialize_distance(first, last,
      std::iterator_traits<InputIter>::iterator_category());
  }
}
