Skip to content

Commit 2ee3808

Browse files
Add variadic ctor and CTAD to zip_iterator
Fixes: NVIDIA#4110
1 parent 12390d6 commit 2ee3808

File tree

2 files changed

+32
-11
lines changed

2 files changed

+32
-11
lines changed

thrust/testing/zip_iterator.cu

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,17 +57,22 @@ struct TestZipIteratorManipulation
5757
sequence(v2.begin(), v2.end());
5858

5959
using IteratorTuple = tuple<typename Vector::iterator, typename Vector::iterator>;
60+
IteratorTuple t = make_tuple(v0.begin(), v1.begin());
61+
using ZipIterator = zip_iterator<IteratorTuple>;
6062

61-
IteratorTuple t = make_tuple(v0.begin(), v1.begin());
62-
63-
using ZipIterator = zip_iterator<IteratorTuple>;
64-
65-
// test construction
63+
// test construction from tuple
6664
ZipIterator iter0 = make_zip_iterator(t);
6765
ASSERT_EQUAL(true, iter0 == ZipIterator{t});
68-
6966
ASSERT_EQUAL_QUIET(v0.begin(), get<0>(iter0.get_iterator_tuple()));
7067
ASSERT_EQUAL_QUIET(v1.begin(), get<1>(iter0.get_iterator_tuple()));
68+
static_assert(::cuda::std::is_same_v<decltype(zip_iterator{t}), ZipIterator>); // CTAD
69+
70+
// test construction from pack
71+
ZipIterator iter0_pack = make_zip_iterator(v0.begin(), v1.begin());
72+
ASSERT_EQUAL(true, (iter0_pack == ZipIterator{v0.begin(), v1.begin()}));
73+
ASSERT_EQUAL_QUIET(v0.begin(), get<0>(iter0_pack.get_iterator_tuple()));
74+
ASSERT_EQUAL_QUIET(v1.begin(), get<1>(iter0_pack.get_iterator_tuple()));
75+
static_assert(::cuda::std::is_same_v<decltype(zip_iterator{v0.begin(), v1.begin()}), ZipIterator>); // CTAD
7176

7277
// test dereference
7378
ASSERT_EQUAL(*v0.begin(), get<0>(*iter0));
@@ -429,7 +434,7 @@ void TestZipIteratorCopyAoSToSoA()
429434

430435
thrust::copy(d_aos.begin(), d_aos.end(), h_soa);
431436
ASSERT_EQUAL_QUIET(make_tuple(7, 13), h_soa[0]);
432-
};
437+
}
433438
DECLARE_UNITTEST(TestZipIteratorCopyAoSToSoA);
434439

435440
void TestZipIteratorCopySoAToAoS()

thrust/thrust/iterator/zip_iterator.h

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,15 @@ class _CCCL_DECLSPEC_EMPTY_BASES zip_iterator : public detail::make_zip_iterator
195195
: m_iterator_tuple(iterator_tuple)
196196
{}
197197

198+
//! This constructor creates a new \p zip_iterator from a pack of iterators.
199+
//!
200+
//! \param iterators A pack of iterators to zip.
201+
template <typename... Iterators,
202+
::cuda::std::enable_if_t<(::cuda::std::input_or_output_iterator<Iterators> && ...), int> = 0>
203+
_CCCL_HOST_DEVICE zip_iterator(Iterators... iterators)
204+
: m_iterator_tuple(::cuda::std::move(iterators)...)
205+
{}
206+
198207
//! This copy constructor creates a new \p zip_iterator from another \p zip_iterator.
199208
//!
200209
//! \param other The \p zip_iterator to copy.
@@ -296,6 +305,13 @@ class _CCCL_DECLSPEC_EMPTY_BASES zip_iterator : public detail::make_zip_iterator
296305
//! \endcond
297306
};
298307

308+
template <typename... Iterators>
309+
_CCCL_HOST_DEVICE zip_iterator(_CUDA_VSTD::tuple<Iterators...>) -> zip_iterator<_CUDA_VSTD::tuple<Iterators...>>;
310+
311+
template <typename... Iterators,
312+
::cuda::std::enable_if_t<(::cuda::std::input_or_output_iterator<Iterators> && ...), int> = 0>
313+
_CCCL_HOST_DEVICE zip_iterator(Iterators...) -> zip_iterator<_CUDA_VSTD::tuple<Iterators...>>;
314+
299315
//! \p make_zip_iterator creates a \p zip_iterator from a \p tuple of iterators.
300316
//!
301317
//! \param t The \p tuple of iterators to copy.
@@ -308,17 +324,17 @@ make_zip_iterator(_CUDA_VSTD::tuple<Iterators...> t)
308324
return zip_iterator<_CUDA_VSTD::tuple<Iterators...>>(t);
309325
}
310326

311-
//! \p make_zip_iterator creates a \p zip_iterator from
312-
//! iterators.
327+
//! \p make_zip_iterator creates a \p zip_iterator from iterators.
313328
//!
314329
//! \param its The iterators to copy.
315330
//! \return A newly created \p zip_iterator which zips the iterators.
316331
//!
317332
//! \see zip_iterator
318-
template <typename... Iterators>
333+
template <typename... Iterators,
334+
::cuda::std::enable_if_t<(::cuda::std::input_or_output_iterator<Iterators> && ...), int> = 0>
319335
inline _CCCL_HOST_DEVICE zip_iterator<_CUDA_VSTD::tuple<Iterators...>> make_zip_iterator(Iterators... its)
320336
{
321-
return make_zip_iterator(_CUDA_VSTD::make_tuple(its...));
337+
return zip_iterator<_CUDA_VSTD::tuple<Iterators...>>(::cuda::std::move(its)...);
322338
}
323339

324340
//! \} // end fancyiterators

0 commit comments

Comments
 (0)