1 // Copyright (C) 2017 Michel Morin.
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)
7 #ifndef BOOST_ITERATOR_DISTANCE_HPP
8 #define BOOST_ITERATOR_DISTANCE_HPP
10 #include <boost/config.hpp>
11 #include <boost/iterator/iterator_categories.hpp>
12 #include <boost/iterator/iterator_traits.hpp>
18 template <typename SinglePassIterator>
19 inline BOOST_CXX14_CONSTEXPR typename iterator_difference<SinglePassIterator>::type
21 SinglePassIterator first
22 , SinglePassIterator last
23 , single_pass_traversal_tag
26 typename iterator_difference<SinglePassIterator>::type n = 0;
27 while (first != last) {
34 template <typename RandomAccessIterator>
35 inline BOOST_CXX14_CONSTEXPR typename iterator_difference<RandomAccessIterator>::type
37 RandomAccessIterator first
38 , RandomAccessIterator last
39 , random_access_traversal_tag
46 namespace distance_adl_barrier {
47 template <typename SinglePassIterator>
48 inline BOOST_CXX14_CONSTEXPR typename iterator_difference<SinglePassIterator>::type
49 distance(SinglePassIterator first, SinglePassIterator last)
51 return detail::distance_impl(
52 first, last, typename iterator_traversal<SinglePassIterator>::type()
57 using namespace distance_adl_barrier;
59 } // namespace iterators
61 using iterators::distance;