21 #ifndef ROCPRIM_ITERATOR_ZIP_ITERATOR_HPP_ 22 #define ROCPRIM_ITERATOR_ZIP_ITERATOR_HPP_ 26 #include <type_traits> 28 #include "../config.hpp" 29 #include "../detail/various.hpp" 30 #include "../types/tuple.hpp" 35 BEGIN_ROCPRIM_NAMESPACE
43 template<
class... Types>
46 using type = ::rocprim::tuple<typename std::iterator_traits<Types>::reference...>;
52 template<
class... Types>
55 using type = ::rocprim::tuple<typename std::iterator_traits<Types>::value_type...>;
60 template<
class Iterator>
61 ROCPRIM_HOST_DEVICE
inline 62 void operator()(Iterator& it)
70 template<
class Iterator>
71 ROCPRIM_HOST_DEVICE
inline 72 void operator()(Iterator& it)
78 template<
class Difference>
81 ROCPRIM_HOST_DEVICE
inline 87 template<
class Iterator>
88 ROCPRIM_HOST_DEVICE
inline 89 void operator()(Iterator& it)
91 using it_distance_type =
typename std::iterator_traits<Iterator>::difference_type;
92 it +=
static_cast<it_distance_type
>(distance_);
99 template<
class ReferenceTuple,
class... Types,
size_t... Indices>
100 ROCPRIM_HOST_DEVICE
inline 101 ReferenceTuple dereference_iterator_tuple_impl(const ::rocprim::tuple<Types...>& t,
102 ::rocprim::index_sequence<Indices...>)
104 ReferenceTuple rt { *::rocprim::get<Indices>(t)... };
108 template<
class ReferenceTuple,
class... Types>
109 ROCPRIM_HOST_DEVICE
inline 110 ReferenceTuple dereference_iterator_tuple(const ::rocprim::tuple<Types...>& t)
112 return dereference_iterator_tuple_impl<ReferenceTuple>(
113 t, ::rocprim::index_sequence_for<Types...>()
126 template<
class IteratorTuple>
144 typename ::rocprim::tuple_element<0, IteratorTuple>::type
149 ROCPRIM_HOST_DEVICE
inline 155 ROCPRIM_HOST_DEVICE
inline 157 : iterator_tuple_(iterator_tuple)
161 #ifndef DOXYGEN_SHOULD_SKIP_THIS 162 ROCPRIM_HOST_DEVICE
inline 169 ROCPRIM_HOST_DEVICE
inline 177 ROCPRIM_HOST_DEVICE
inline 184 ROCPRIM_HOST_DEVICE
inline 192 ROCPRIM_HOST_DEVICE
inline 195 return detail::dereference_iterator_tuple<reference>(iterator_tuple_);
198 ROCPRIM_HOST_DEVICE
inline 204 ROCPRIM_HOST_DEVICE
inline 211 ROCPRIM_HOST_DEVICE
inline 219 ROCPRIM_HOST_DEVICE
inline 222 detail::for_each_in_tuple(
229 ROCPRIM_HOST_DEVICE
inline 237 ROCPRIM_HOST_DEVICE
inline 244 ROCPRIM_HOST_DEVICE
inline 247 return ::rocprim::get<0>(iterator_tuple_) - ::rocprim::get<0>(other.iterator_tuple_);
250 ROCPRIM_HOST_DEVICE
inline 253 return iterator_tuple_ == other.iterator_tuple_;
256 ROCPRIM_HOST_DEVICE
inline 259 return !(*
this == other);
262 ROCPRIM_HOST_DEVICE
inline 265 return ::rocprim::get<0>(iterator_tuple_) < ::rocprim::get<0>(other.iterator_tuple_);
268 ROCPRIM_HOST_DEVICE
inline 271 return !(other < *
this);
274 ROCPRIM_HOST_DEVICE
inline 277 return other < *
this;
280 ROCPRIM_HOST_DEVICE
inline 283 return !(*
this < other);
286 friend std::ostream& operator<<(std::ostream& os,
const zip_iterator& )
290 #endif // DOXYGEN_SHOULD_SKIP_THIS 293 IteratorTuple iterator_tuple_;
296 #ifndef DOXYGEN_SHOULD_SKIP_THIS 297 template<
class IteratorTuple>
298 ROCPRIM_HOST_DEVICE
inline 303 return iterator + distance;
305 #endif // DOXYGEN_SHOULD_SKIP_THIS 314 template<
class IteratorTuple>
315 ROCPRIM_HOST_DEVICE
inline 322 END_ROCPRIM_NAMESPACE
327 #endif // ROCPRIM_ITERATOR_ZIP_ITERATOR_HPP_ std::random_access_iterator_tag iterator_category
The category of the iterator.
Definition: zip_iterator.hpp:147
Definition: zip_iterator.hpp:50
typename detail::tuple_of_references< IteratorTuple >::type reference
A reference type of the type iterated over.
Definition: zip_iterator.hpp:134
ROCPRIM_HOST_DEVICE bool operator>=(const tuple< TTypes... > &lhs, const tuple< UTypes... > &rhs)
Greater than or equal to operator for tuples.
Definition: tuple.hpp:915
ROCPRIM_HOST_DEVICE bool operator<(const tuple< TTypes... > &lhs, const tuple< UTypes... > &rhs)
Less than operator for tuples.
Definition: tuple.hpp:864
Definition: zip_iterator.hpp:68
Definition: zip_iterator.hpp:58
ROCPRIM_HOST_DEVICE bool operator!=(const tuple< TTypes... > &lhs, const tuple< UTypes... > &rhs)
Not equal to operator for tuples.
Definition: tuple.hpp:838
typename detail::tuple_of_values< IteratorTuple >::type value_type
The type of the value that can be obtained by dereferencing the iterator.
Definition: zip_iterator.hpp:136
Deprecated: Configuration of device-level scan primitives.
Definition: block_histogram.hpp:62
Definition: zip_iterator.hpp:41
typename std::iterator_traits< typename ::rocprim::tuple_element< 0, IteratorTuple >::type >::difference_type difference_type
A type used for identify distance between iterators.
Definition: zip_iterator.hpp:145
ROCPRIM_HOST_DEVICE zip_iterator(IteratorTuple iterator_tuple)
Creates a new zip_iterator.
Definition: zip_iterator.hpp:156
ROCPRIM_HOST_DEVICE bool operator<=(const tuple< TTypes... > &lhs, const tuple< UTypes... > &rhs)
Less than or equal to operator for tuples.
Definition: tuple.hpp:898
ROCPRIM_HOST_DEVICE zip_iterator< IteratorTuple > make_zip_iterator(IteratorTuple iterator_tuple)
make_zip_iterator creates a zip_iterator using iterator_tuple as the underlying tuple of iterator...
Definition: zip_iterator.hpp:317
Definition: zip_iterator.hpp:79
ROCPRIM_HOST_DEVICE bool operator>(const tuple< TTypes... > &lhs, const tuple< UTypes... > &rhs)
Greater than operator for tuples.
Definition: tuple.hpp:881
ROCPRIM_HOST_DEVICE bool operator==(const tuple< TTypes... > &lhs, const tuple< UTypes... > &rhs)
Equal to operator for tuples.
Definition: tuple.hpp:819
value_type * pointer
A pointer type of the type iterated over (value_type).
Definition: zip_iterator.hpp:138
TBD.
Definition: zip_iterator.hpp:127