distance.hpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // Copyright (C) 2017 Michel Morin.
  2. //
  3. // Distributed under the Boost Software License, Version 1.0.
  4. // (See accompanying file LICENSE_1_0.txt or copy at
  5. // http://www.boost.org/LICENSE_1_0.txt)
  6. #ifndef BOOST_ITERATOR_DISTANCE_HPP
  7. #define BOOST_ITERATOR_DISTANCE_HPP
  8. #include <boost/config.hpp>
  9. #include <boost/iterator/iterator_categories.hpp>
  10. #include <boost/iterator/iterator_traits.hpp>
  11. namespace boost {
  12. namespace iterators {
  13. namespace detail {
  14. template< typename SinglePassIterator >
  15. inline BOOST_CXX14_CONSTEXPR typename iterator_difference< SinglePassIterator >::type
  16. distance_impl(SinglePassIterator first, SinglePassIterator last, single_pass_traversal_tag)
  17. {
  18. typename iterator_difference< SinglePassIterator >::type n = 0;
  19. while (first != last)
  20. {
  21. ++first;
  22. ++n;
  23. }
  24. return n;
  25. }
  26. template< typename RandomAccessIterator >
  27. inline BOOST_CXX14_CONSTEXPR typename iterator_difference< RandomAccessIterator >::type
  28. distance_impl(RandomAccessIterator first, RandomAccessIterator last, random_access_traversal_tag)
  29. {
  30. return last - first;
  31. }
  32. } // namespace detail
  33. namespace distance_adl_barrier {
  34. template< typename SinglePassIterator >
  35. inline BOOST_CXX14_CONSTEXPR typename iterator_difference< SinglePassIterator >::type
  36. distance(SinglePassIterator first, SinglePassIterator last)
  37. {
  38. return detail::distance_impl(first, last, typename iterator_traversal< SinglePassIterator >::type());
  39. }
  40. } // namespace distance_adl_barrier
  41. using namespace distance_adl_barrier;
  42. } // namespace iterators
  43. using namespace iterators::distance_adl_barrier;
  44. } // namespace boost
  45. #endif