25 #include <thrust/detail/config.h> 26 #include <thrust/detail/type_traits.h> 27 #include <thrust/detail/type_traits/pointer_traits.h> 31 #if defined(_MSC_VER) && _MSC_VER < 1916 // MSVC 2017 version 15.9 36 #if THRUST_CPP_DIALECT >= 2017 37 #include <string_view> 46 template <
typename Iterator>
47 struct is_contiguous_iterator_impl;
55 template <
typename Iterator>
56 #if THRUST_CPP_DIALECT >= 2011 57 using is_contiguous_iterator =
61 detail::is_contiguous_iterator_impl<Iterator>
62 #if THRUST_CPP_DIALECT < 2011 67 #if THRUST_CPP_DIALECT >= 2014 68 template <
typename Iterator>
80 template <
typename Iterator>
86 #define THRUST_PROCLAIM_CONTIGUOUS_ITERATOR(Iterator) \ 89 struct proclaim_contiguous_iterator<Iterator> : ::thrust::true_type {}; \ 98 template <
typename Iterator>
99 struct is_libcxx_wrap_iter : false_type {};
101 #if defined(_LIBCPP_VERSION) 102 template <
typename Iterator>
103 struct is_libcxx_wrap_iter<
104 _VSTD::__wrap_iter<Iterator>
108 template <
typename Iterator>
109 struct is_libstdcxx_normal_iterator : false_type {};
111 #if defined(__GLIBCXX__) 112 template <
typename Iterator,
typename Container>
113 struct is_libstdcxx_normal_iterator<
114 ::__gnu_cxx::__normal_iterator<Iterator, Container>
118 #if _MSC_VER >= 1916 // MSVC 2017 version 15.9. 119 template <
typename Iterator>
120 struct is_msvc_contiguous_iterator
121 : is_pointer<::std::_Unwrapped_t<Iterator> > {};
122 #elif _MSC_VER >= 1700 // MSVC 2012. 123 template <
typename Iterator>
124 struct is_msvc_contiguous_iterator : false_type {};
126 template <
typename Vector>
127 struct is_msvc_contiguous_iterator<
128 ::std::_Vector_const_iterator<Vector>
131 template <
typename Vector>
132 struct is_msvc_contiguous_iterator<
133 ::std::_Vector_iterator<Vector>
136 template <
typename String>
137 struct is_msvc_contiguous_iterator<
138 ::std::_String_const_iterator<String>
141 template <
typename String>
142 struct is_msvc_contiguous_iterator<
143 ::std::_String_iterator<String>
146 template <
typename T, std::
size_t N>
147 struct is_msvc_contiguous_iterator<
148 ::std::_Array_const_iterator<T, N>
151 template <
typename T, std::
size_t N>
152 struct is_msvc_contiguous_iterator<
153 ::std::_Array_iterator<T, N>
156 #if THRUST_CPP_DIALECT >= 2017 157 template <
typename Traits>
158 struct is_msvc_contiguous_iterator<
159 ::std::_String_view_iterator<Traits>
163 template <
typename Iterator>
164 struct is_msvc_contiguous_iterator : false_type {};
168 template <
typename Iterator>
169 struct is_contiguous_iterator_impl
172 , is_pointer<Iterator>::value
173 || is_thrust_pointer<Iterator>::value
174 || is_libcxx_wrap_iter<Iterator>::value
175 || is_libstdcxx_normal_iterator<Iterator>::value
176 || is_msvc_contiguous_iterator<Iterator>::value
177 || proclaim_contiguous_iterator<Iterator>::value
Definition: is_contiguous_iterator.h:59
Definition: is_contiguous_iterator.h:81