zip_iterator#
-
template<class ..._Iterators>
class zip_iterator : public __zv_iter_category_base<_Iterators...># zip_iterator
is an iterator which represents atuple
of iterators.This iterator is useful for creating a virtual array of structures while achieving the same performance and bandwidth as the structure of arrays idiom.
zip_iterator
also facilitates kernel fusion by providing a convenient means of amortizing the execution of the same operation over multiple ranges.The following code snippet demonstrates how to create a
zip_iterator
which represents the result of “zipping” multiple ranges together.#include <cuda/iterator> #include <thrust/device_vector.h> thrust::device_vector<int> int_v{0, 1, 2}; thrust::device_vector<float> float_v{0.0f, 1.0f, 2.0f}; thrust::device_vector<char> char_v{'a', 'b', 'c'}; cuda::zip_iterator iter{int_v.begin(), float_v.begin(), char_v.begin()}; *iter; // returns (0, 0.0f, 'a') iter[0]; // returns (0, 0.0f, 'a') iter[1]; // returns (1, 1.0f, 'b') iter[2]; // returns (2, 2.0f, 'c') cuda::std::get<0>(iter[2]); // returns 2 cuda::std::get<1>(iter[0]); // returns 0.0f cuda::std::get<2>(iter[1]); // returns 'b' // iter[3] is an out-of-bounds error
This example shows how to use
zip_iterator
to copy multiple ranges with a single call tothrust::copy
.#include <cuda/iterator> #include <thrust/device_vector.h> int main() { thrust::device_vector<int> int_in{0, 1, 2}, int_out(3); thrust::device_vector<float> float_in{0.0f, 10.0f, 20.0f}, float_out(3); thrust::copy(cuda::zip_iterator{int_in.begin(), float_in.begin()}, cuda::zip_iterator{int_in.end(), float_in.end()}, cuda::zip_iterator{int_out.begin(),float_out.begin()}); // int_out is now [0, 1, 2] // float_out is now [0.0f, 10.0f, 20.0f] return 0; }
Public Types
-
using iterator_concept = decltype(__get_zip_view_iterator_tag<_Iterators...>())#
-
using value_type = __tuple_or_pair<::cuda::std::iter_value_t<_Iterators>...>#
-
using reference = __tuple_or_pair<::cuda::std::iter_reference_t<_Iterators>...>#
-
using difference_type = ::cuda::std::common_type_t<::cuda::std::iter_difference_t<_Iterators>...>#
Public Functions
-
zip_iterator() = default#
Default-constructs a
zip_iterator
by defaulting all stored iterators.
- inline explicit constexpr zip_iterator(
- __tuple_or_pair<_Iterators...> __iters,
Constructs a
zip_iterator
from a tuple of iterators.- Parameters:
__iters – A tuple or pair of iterators
-
template<size_t _NumIterators = sizeof...(_Iterators), ::cuda::std::enable_if_t<(_NumIterators == 2), int> = 0>
inline explicit constexpr zip_iterator( - ::cuda::std::tuple<_Iterators...> __iters,
Constructs a
zip_iterator
from a tuple of iterators.- Parameters:
__iters – A tuple of iterators
-
inline explicit constexpr zip_iterator(_Iterators... __iters)#
Constructs a
zip_iterator
from variadic set of iterators.- Parameters:
__iters – The input iterators
-
template<class ..._OtherIters, ::cuda::std::enable_if_t<(sizeof...(_OtherIters) == sizeof...(_Iterators)) && __all_convertible<_OtherIters...>, int> = 0>
inline constexpr zip_iterator( - zip_iterator<_OtherIters...> __iter,
Converts a different
zip_iterator
.- Parameters:
__iter – The other
zip_iterator
- inline constexpr auto operator*(
Dereferences the
zip_iterator
.- Returns:
A tuple of references obtained by referencing every stored iterator
-
template<class _Constraints = __zip_iter_constraints<_Iterators...>, ::cuda::std::enable_if_t<_Constraints::__all_random_access, int> = 0>
inline constexpr auto operator[]( - difference_type __n,
Subscripts the
zip_iterator
with an offset.- Parameters:
__n – The additional offset
- Returns:
A tuple of references obtained by subscripting every stored iterator
- inline constexpr zip_iterator &operator++(
Increments all stored iterators.
-
inline constexpr auto operator++(int)#
Increments all stored iterators.
- Returns:
A copy of the original
zip_iterator
if possible
-
template<class _Constraints = __zip_iter_constraints<_Iterators...>, ::cuda::std::enable_if_t<_Constraints::__all_bidirectional, int> = 0>
inline constexpr zip_iterator &operator--( Decrements all stored iterators.
-
template<class _Constraints = __zip_iter_constraints<_Iterators...>, ::cuda::std::enable_if_t<_Constraints::__all_bidirectional, int> = 0>
inline constexpr zip_iterator operator--( - int,
Decrements all stored iterators.
-
template<class _Constraints = __zip_iter_constraints<_Iterators...>, ::cuda::std::enable_if_t<_Constraints::__all_random_access, int> = 0>
inline constexpr zip_iterator &operator+=( - difference_type __n,
Increments all stored iterators by a given number of elements.
- Parameters:
__n – The number of elements to increment
-
template<class _Constraints = __zip_iter_constraints<_Iterators...>, ::cuda::std::enable_if_t<_Constraints::__all_random_access, int> = 0>
inline constexpr zip_iterator &operator-=( - difference_type __n,
Decrements all stored iterators by a given number of elements.
- Parameters:
__n – The number of elements to decrement
Friends
-
template<class _Constraints = __zip_iter_constraints<_Iterators...>>
inline friend constexpr auto operator+( - const zip_iterator &__iter,
- difference_type __n,
Returns a copy of a
zip_iterator
incremented by a given number of elements.- Parameters:
__iter – The
zip_iterator
to increment__n – The number of elements to increment
requires (_Constraints::__all_random_access)
-
template<class _Constraints = __zip_iter_constraints<_Iterators...>>
inline friend constexpr auto operator+( - difference_type __n,
- const zip_iterator &__iter,
Returns a copy of a
zip_iterator
incremented by a given number of elements.- Parameters:
__n – The number of elements to increment
__iter – The
zip_iterator
to increment
requires (_Constraints::__all_random_access)
-
template<class _Constraints = __zip_iter_constraints<_Iterators...>>
inline friend constexpr auto operator-( - const zip_iterator &__iter,
- difference_type __n,
Returns a copy of a
zip_iterator
decremented by a given number of elements.- Parameters:
__n – The number of elements to decrement
__iter – The
zip_iterator
to decrement
requires (_Constraints::__all_random_access)
-
template<class _Constraints = __zip_iter_constraints<_Iterators...>>
inline friend constexpr auto operator-( - const zip_iterator &__n,
- const zip_iterator &__y,
Returns the distance between two
zip_iterators
.- Returns:
The minimal distance between any of the stored iterators
requires (_Constraints::__all_sized_sentinel)
-
template<class _Constraints = __zip_iter_constraints<_Iterators...>>
inline friend constexpr auto operator==( - const zip_iterator &__n,
- const zip_iterator &__y,
Compares two
zip_iterator
for equality by comparing the tuple of stored iterators.
requires (_Constraints::__all_equality_comparable)
-
template<class _Constraints = __zip_iter_constraints<_Iterators...>>
inline friend constexpr auto operator<( - const zip_iterator &__n,
- const zip_iterator &__y,
Compares two
zip_iterator
for less than by comparing the tuple of stored iterators.
requires (_Constraints::__all_random_access)
-
template<class _Constraints = __zip_iter_constraints<_Iterators...>>
inline friend constexpr auto operator>( - const zip_iterator &__n,
- const zip_iterator &__y,
Compares two
zip_iterator
for greater than by comparing the tuple of stored iterators.
requires (_Constraints::__all_random_access)
-
template<class _Constraints = __zip_iter_constraints<_Iterators...>>
inline friend constexpr auto operator<=( - const zip_iterator &__n,
- const zip_iterator &__y,
Compares two
zip_iterator
for less equal by comparing the tuple of stored iterators.
requires (_Constraints::__all_random_access)
-
template<class _Constraints = __zip_iter_constraints<_Iterators...>>
inline friend constexpr auto operator>=( - const zip_iterator &__n,
- const zip_iterator &__y,
Compares two
zip_iterator
for greater equal by comparing the tuple of stored iterators.
requires (_Constraints::__all_random_access)
-
template<class _Constraints = __zip_iter_constraints<_Iterators...>>
inline friend constexpr auto iter_move( - const zip_iterator &__iter,
Applies
iter_move
by applying it to all stored iterators.
-
template<class _Constraints = __zip_iter_constraints<_Iterators...>>
inline friend constexpr auto iter_swap( - const zip_iterator &__lhs,
- const zip_iterator &__rhs,
Applies
iter_swap
to twozip_iterator
by applying it to all stored iterators.
requires (_Constraints::__all_indirectly_swappable)
-
using iterator_concept = decltype(__get_zip_view_iterator_tag<_Iterators...>())#