summaryrefslogtreecommitdiff
path: root/boost/iterator/distance.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/iterator/distance.hpp')
-rw-r--r--boost/iterator/distance.hpp65
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