summaryrefslogtreecommitdiff
path: root/boost/compute/detail/iterator_plus_distance.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/compute/detail/iterator_plus_distance.hpp')
-rw-r--r--boost/compute/detail/iterator_plus_distance.hpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/boost/compute/detail/iterator_plus_distance.hpp b/boost/compute/detail/iterator_plus_distance.hpp
new file mode 100644
index 0000000000..26e95f16c0
--- /dev/null
+++ b/boost/compute/detail/iterator_plus_distance.hpp
@@ -0,0 +1,53 @@
+//---------------------------------------------------------------------------//
+// Copyright (c) 2013 Kyle Lutz <kyle.r.lutz@gmail.com>
+//
+// 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
+//
+// See http://boostorg.github.com/compute for more information.
+//---------------------------------------------------------------------------//
+
+#ifndef BOOST_COMPUTE_DETAIL_ITERATOR_PLUS_DISTANCE_HPP
+#define BOOST_COMPUTE_DETAIL_ITERATOR_PLUS_DISTANCE_HPP
+
+#include <iterator>
+
+namespace boost {
+namespace compute {
+namespace detail {
+
+template<class Iterator, class Distance, class Tag>
+inline Iterator iterator_plus_distance(Iterator i, Distance n, Tag)
+{
+ while(n--){ i++; }
+
+ return i;
+}
+
+template<class Iterator, class Distance>
+inline Iterator iterator_plus_distance(Iterator i,
+ Distance n,
+ std::random_access_iterator_tag)
+{
+ typedef typename
+ std::iterator_traits<Iterator>::difference_type difference_type;
+
+ return i + static_cast<difference_type>(n);
+}
+
+// similar to std::advance() except returns the advanced iterator and
+// also works with iterators that don't define difference_type
+template<class Iterator, class Distance>
+inline Iterator iterator_plus_distance(Iterator i, Distance n)
+{
+ typedef typename std::iterator_traits<Iterator>::iterator_category tag;
+
+ return iterator_plus_distance(i, n, tag());
+}
+
+} // end detail namespace
+} // end compute namespace
+} // end boost namespace
+
+#endif // BOOST_COMPUTE_DETAIL_ITERATOR_PLUS_DISTANCE_HPP