diff options
Diffstat (limited to 'boost/iterator/distance.hpp')
-rw-r--r-- | boost/iterator/distance.hpp | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/boost/iterator/distance.hpp b/boost/iterator/distance.hpp new file mode 100644 index 0000000000..8cf3f15c44 --- /dev/null +++ b/boost/iterator/distance.hpp @@ -0,0 +1,65 @@ +// Copyright (C) 2017 Michel Morin. +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_ITERATOR_DISTANCE_HPP +#define BOOST_ITERATOR_DISTANCE_HPP + +#include <boost/config.hpp> +#include <boost/iterator/iterator_categories.hpp> +#include <boost/iterator/iterator_traits.hpp> + +namespace boost { +namespace iterators { + + namespace detail { + template <typename SinglePassIterator> + inline BOOST_CXX14_CONSTEXPR typename iterator_difference<SinglePassIterator>::type + distance_impl( + SinglePassIterator first + , SinglePassIterator last + , single_pass_traversal_tag + ) + { + typename iterator_difference<SinglePassIterator>::type n = 0; + while (first != last) { + ++first; + ++n; + } + return n; + } + + template <typename RandomAccessIterator> + inline BOOST_CXX14_CONSTEXPR typename iterator_difference<RandomAccessIterator>::type + distance_impl( + RandomAccessIterator first + , RandomAccessIterator last + , random_access_traversal_tag + ) + { + return last - first; + } + } + + namespace distance_adl_barrier { + template <typename SinglePassIterator> + inline BOOST_CXX14_CONSTEXPR typename iterator_difference<SinglePassIterator>::type + distance(SinglePassIterator first, SinglePassIterator last) + { + return detail::distance_impl( + first, last, typename iterator_traversal<SinglePassIterator>::type() + ); + } + } + + using namespace distance_adl_barrier; + +} // namespace iterators + +using iterators::distance; + +} // namespace boost + +#endif |