summaryrefslogtreecommitdiff
path: root/boost/compute/detail/is_contiguous_iterator.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/compute/detail/is_contiguous_iterator.hpp')
-rw-r--r--boost/compute/detail/is_contiguous_iterator.hpp118
1 files changed, 118 insertions, 0 deletions
diff --git a/boost/compute/detail/is_contiguous_iterator.hpp b/boost/compute/detail/is_contiguous_iterator.hpp
new file mode 100644
index 0000000000..d0889b2f9e
--- /dev/null
+++ b/boost/compute/detail/is_contiguous_iterator.hpp
@@ -0,0 +1,118 @@
+//---------------------------------------------------------------------------//
+// 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_IS_CONTIGUOUS_ITERATOR_HPP
+#define BOOST_COMPUTE_DETAIL_IS_CONTIGUOUS_ITERATOR_HPP
+
+#include <vector>
+#include <valarray>
+
+#include <boost/config.hpp>
+#include <boost/type_traits.hpp>
+#include <boost/utility/enable_if.hpp>
+
+namespace boost {
+namespace compute {
+namespace detail {
+
+// default = false
+template<class Iterator, class Enable = void>
+struct _is_contiguous_iterator : public boost::false_type {};
+
+// std::vector<T>::iterator = true
+template<class Iterator>
+struct _is_contiguous_iterator<
+ Iterator,
+ typename boost::enable_if<
+ typename boost::is_same<
+ Iterator,
+ typename std::vector<typename Iterator::value_type>::iterator
+ >::type
+ >::type
+> : public boost::true_type {};
+
+// std::vector<T>::const_iterator = true
+template<class Iterator>
+struct _is_contiguous_iterator<
+ Iterator,
+ typename boost::enable_if<
+ typename boost::is_same<
+ Iterator,
+ typename std::vector<typename Iterator::value_type>::const_iterator
+ >::type
+ >::type
+> : public boost::true_type {};
+
+// std::valarray<T>::iterator = true
+template<class Iterator>
+struct _is_contiguous_iterator<
+ Iterator,
+ typename boost::enable_if<
+ typename boost::is_same<
+ Iterator,
+ typename std::valarray<typename Iterator::value_type>::iterator
+ >::type
+ >::type
+> : public boost::true_type {};
+
+// std::valarray<T>::const_iterator = true
+template<class Iterator>
+struct _is_contiguous_iterator<
+ Iterator,
+ typename boost::enable_if<
+ typename boost::is_same<
+ Iterator,
+ typename std::valarray<typename Iterator::value_type>::const_iterator
+ >::type
+ >::type
+> : public boost::true_type {};
+
+// T* = true
+template<class Iterator>
+struct _is_contiguous_iterator<
+ Iterator,
+ typename boost::enable_if<
+ boost::is_pointer<Iterator>
+ >::type
+> : public boost::true_type {};
+
+// the is_contiguous_iterator meta-function returns true if Iterator points
+// to a range of contiguous values. examples of contiguous iterators are
+// std::vector<>::iterator and float*. examples of non-contiguous iterators
+// are std::set<>::iterator and std::insert_iterator<>.
+//
+// the implementation consists of two phases. the first checks that value_type
+// for the iterator is not void. this must be done as for many containers void
+// is not a valid value_type (ex. std::vector<void>::iterator is not valid).
+// after ensuring a non-void value_type, the _is_contiguous_iterator function
+// is invoked. it has specializations retuning true for all (known) contiguous
+// iterators types and a default value of false.
+template<class Iterator, class Enable = void>
+struct is_contiguous_iterator :
+ public _is_contiguous_iterator<
+ typename boost::remove_cv<Iterator>::type
+ > {};
+
+// value_type of void = false
+template<class Iterator>
+struct is_contiguous_iterator<
+ Iterator,
+ typename boost::enable_if<
+ typename boost::is_void<
+ typename Iterator::value_type
+ >::type
+ >::type
+> : public boost::false_type {};
+
+} // end detail namespace
+} // end compute namespace
+} // end boost namespace
+
+#endif // BOOST_COMPUTE_DETAIL_IS_CONTIGUOUS_ITERATOR_HPP