diff --git a/thrust/testing/constant_iterator.cu b/thrust/testing/constant_iterator.cu index e42cfea8d34..618f545dae6 100644 --- a/thrust/testing/constant_iterator.cu +++ b/thrust/testing/constant_iterator.cu @@ -4,6 +4,8 @@ #include #include +#include + void TestConstantIteratorConstructFromConvertibleSystem(void) { using namespace thrust; @@ -30,21 +32,23 @@ void TestConstantIteratorIncrement(void) lhs++; ASSERT_EQUAL(1, lhs - rhs); - + lhs++; lhs++; - + ASSERT_EQUAL(3, lhs - rhs); lhs += 5; - + ASSERT_EQUAL(8, lhs - rhs); lhs -= 10; - + ASSERT_EQUAL(-2, lhs - rhs); } DECLARE_UNITTEST(TestConstantIteratorIncrement); +static_assert(cuda::std::is_trivially_copy_constructible>::value, ""); +static_assert(cuda::std::is_trivially_copyable>::value, ""); void TestConstantIteratorIncrementBig(void) { @@ -68,15 +72,15 @@ void TestConstantIteratorComparison(void) ASSERT_EQUAL(true, iter1 == iter2); iter1++; - + ASSERT_EQUAL(1, iter1 - iter2); ASSERT_EQUAL(false, iter1 == iter2); - + iter2++; ASSERT_EQUAL(0, iter1 - iter2); ASSERT_EQUAL(true, iter1 == iter2); - + iter1 += 100; iter2 += 100; @@ -146,7 +150,7 @@ void TestConstantIteratorTransform(void) ASSERT_EQUAL(-7, result[1]); ASSERT_EQUAL(-7, result[2]); ASSERT_EQUAL(-7, result[3]); - + thrust::transform(first1, last1, first2, result.begin(), thrust::plus()); ASSERT_EQUAL(10, result[0]); diff --git a/thrust/testing/counting_iterator.cu b/thrust/testing/counting_iterator.cu index ebefe4d64aa..cb55f5358aa 100644 --- a/thrust/testing/counting_iterator.cu +++ b/thrust/testing/counting_iterator.cu @@ -5,6 +5,7 @@ #include #include +#include THRUST_DISABLE_MSVC_POSSIBLE_LOSS_OF_DATA_WARNING_BEGIN @@ -33,6 +34,8 @@ void TestCountingIteratorCopyConstructor(void) ASSERT_EQUAL(*iter0, *d_iter); } DECLARE_UNITTEST(TestCountingIteratorCopyConstructor); +static_assert(cuda::std::is_trivially_copy_constructible>::value, ""); +static_assert(cuda::std::is_trivially_copyable>::value, ""); void TestCountingIteratorIncrement(void) @@ -44,18 +47,18 @@ void TestCountingIteratorIncrement(void) iter++; ASSERT_EQUAL(*iter, 1); - + iter++; iter++; - + ASSERT_EQUAL(*iter, 3); iter += 5; - + ASSERT_EQUAL(*iter, 8); iter -= 10; - + ASSERT_EQUAL(*iter, -2); } DECLARE_UNITTEST(TestCountingIteratorIncrement); @@ -70,15 +73,15 @@ void TestCountingIteratorComparison(void) ASSERT_EQUAL(iter1 == iter2, true); iter1++; - + ASSERT_EQUAL(iter1 - iter2, 1); ASSERT_EQUAL(iter1 == iter2, false); - + iter2++; ASSERT_EQUAL(iter1 - iter2, 0); ASSERT_EQUAL(iter1 == iter2, true); - + iter1 += 100; iter2 += 100; @@ -99,19 +102,19 @@ void TestCountingIteratorFloatComparison(void) ASSERT_EQUAL(iter2 < iter1, false); iter1++; - + ASSERT_EQUAL(iter1 - iter2, 1); ASSERT_EQUAL(iter1 == iter2, false); - ASSERT_EQUAL(iter2 < iter1, true); - ASSERT_EQUAL(iter1 < iter2, false); - + ASSERT_EQUAL(iter2 < iter1, true); + ASSERT_EQUAL(iter1 < iter2, false); + iter2++; ASSERT_EQUAL(iter1 - iter2, 0); ASSERT_EQUAL(iter1 == iter2, true); ASSERT_EQUAL(iter1 < iter2, false); ASSERT_EQUAL(iter2 < iter1, false); - + iter1 += 100; iter2 += 100; @@ -130,12 +133,12 @@ void TestCountingIteratorFloatComparison(void) ASSERT_EQUAL(iter4 < iter3, false); iter3++; // iter3 = 1.0, iter4 = 0.5 - + ASSERT_EQUAL(iter3 - iter4, 0); ASSERT_EQUAL(iter3 == iter4, true); ASSERT_EQUAL(iter3 < iter4, false); ASSERT_EQUAL(iter4 < iter3, false); - + iter4++; // iter3 = 1.0, iter4 = 1.5 ASSERT_EQUAL(iter3 - iter4, 0); @@ -162,9 +165,9 @@ void TestCountingIteratorDistance(void) ASSERT_EQUAL(thrust::distance(iter1, iter2), 5); iter1++; - + ASSERT_EQUAL(thrust::distance(iter1, iter2), 4); - + iter2 += 100; ASSERT_EQUAL(thrust::distance(iter1, iter2), 104); diff --git a/thrust/testing/discard_iterator.cu b/thrust/testing/discard_iterator.cu index f5933559d87..4cd36e90516 100644 --- a/thrust/testing/discard_iterator.cu +++ b/thrust/testing/discard_iterator.cu @@ -1,6 +1,8 @@ #include #include +#include + void TestDiscardIteratorIncrement(void) { thrust::discard_iterator<> lhs(0); @@ -11,21 +13,23 @@ void TestDiscardIteratorIncrement(void) lhs++; ASSERT_EQUAL(1, lhs - rhs); - + lhs++; lhs++; - + ASSERT_EQUAL(3, lhs - rhs); lhs += 5; - + ASSERT_EQUAL(8, lhs - rhs); lhs -= 10; - + ASSERT_EQUAL(-2, lhs - rhs); } DECLARE_UNITTEST(TestDiscardIteratorIncrement); +static_assert(cuda::std::is_trivially_copy_constructible>::value, ""); +static_assert(cuda::std::is_trivially_copyable>::value, ""); void TestDiscardIteratorComparison(void) { @@ -36,15 +40,15 @@ void TestDiscardIteratorComparison(void) ASSERT_EQUAL(true, iter1 == iter2); iter1++; - + ASSERT_EQUAL(1, iter1 - iter2); ASSERT_EQUAL(false, iter1 == iter2); - + iter2++; ASSERT_EQUAL(0, iter1 - iter2); ASSERT_EQUAL(true, iter1 == iter2); - + iter1 += 100; iter2 += 100; @@ -82,7 +86,7 @@ void TestZippedDiscardIterator(void) { ; } - + ASSERT_EQUAL(10, thrust::get<0>(z_iter1_first.get_iterator_tuple()) - thrust::make_discard_iterator()); typedef tuple > IteratorTuple2; diff --git a/thrust/testing/permutation_iterator.cu b/thrust/testing/permutation_iterator.cu index 22fef650cff..5740135ede1 100644 --- a/thrust/testing/permutation_iterator.cu +++ b/thrust/testing/permutation_iterator.cu @@ -6,6 +6,8 @@ #include #include +#include + template void TestPermutationIteratorSimple(void) { @@ -14,7 +16,7 @@ void TestPermutationIteratorSimple(void) Vector source(8); Vector indices(4); - + // initialize input thrust::sequence(source.begin(), source.end(), 1); @@ -22,7 +24,7 @@ void TestPermutationIteratorSimple(void) indices[1] = 0; indices[2] = 5; indices[3] = 7; - + thrust::permutation_iterator begin(source.begin(), indices.begin()); thrust::permutation_iterator end(source.begin(), indices.end()); @@ -53,6 +55,8 @@ void TestPermutationIteratorSimple(void) ASSERT_EQUAL(source[7], 8); } DECLARE_INTEGRAL_VECTOR_UNITTEST(TestPermutationIteratorSimple); +static_assert(cuda::std::is_trivially_copy_constructible>::value, ""); +static_assert(cuda::std::is_trivially_copyable>::value, ""); template void TestPermutationIteratorGather(void) @@ -62,7 +66,7 @@ void TestPermutationIteratorGather(void) Vector source(8); Vector indices(4); Vector output(4, 10); - + // initialize input thrust::sequence(source.begin(), source.end(), 1); @@ -70,7 +74,7 @@ void TestPermutationIteratorGather(void) indices[1] = 0; indices[2] = 5; indices[3] = 7; - + thrust::permutation_iterator p_source(source.begin(), indices.begin()); thrust::copy(p_source, p_source + 4, output.begin()); @@ -90,7 +94,7 @@ void TestPermutationIteratorScatter(void) Vector source(4, 10); Vector indices(4); Vector output(8); - + // initialize output thrust::sequence(output.begin(), output.end(), 1); @@ -98,7 +102,7 @@ void TestPermutationIteratorScatter(void) indices[1] = 0; indices[2] = 5; indices[3] = 7; - + // construct transform_iterator thrust::permutation_iterator p_output(output.begin(), indices.begin()); @@ -121,7 +125,7 @@ void TestMakePermutationIterator(void) Vector source(8); Vector indices(4); Vector output(4, 10); - + // initialize input thrust::sequence(source.begin(), source.end(), 1); @@ -129,7 +133,7 @@ void TestMakePermutationIterator(void) indices[1] = 0; indices[2] = 5; indices[3] = 7; - + thrust::copy(thrust::make_permutation_iterator(source.begin(), indices.begin()), thrust::make_permutation_iterator(source.begin(), indices.begin()) + 4, output.begin()); @@ -150,7 +154,7 @@ void TestPermutationIteratorReduce(void) Vector source(8); Vector indices(4); Vector output(4, 10); - + // initialize input thrust::sequence(source.begin(), source.end(), 1); @@ -158,7 +162,7 @@ void TestPermutationIteratorReduce(void) indices[1] = 0; indices[2] = 5; indices[3] = 7; - + // construct transform_iterator thrust::permutation_iterator iter(source.begin(), indices.begin()); @@ -166,7 +170,7 @@ void TestPermutationIteratorReduce(void) thrust::make_permutation_iterator(source.begin(), indices.begin()) + 4); ASSERT_EQUAL(result1, 19); - + T result2 = thrust::transform_reduce(thrust::make_permutation_iterator(source.begin(), indices.begin()), thrust::make_permutation_iterator(source.begin(), indices.begin()) + 4, thrust::negate(), @@ -187,7 +191,7 @@ void TestPermutationIteratorHostDeviceGather(void) HostVector h_source(8); HostVector h_indices(4); HostVector h_output(4, 10); - + DeviceVector d_source(8); DeviceVector d_indices(4); DeviceVector d_output(4, 10); @@ -200,7 +204,7 @@ void TestPermutationIteratorHostDeviceGather(void) h_indices[1] = d_indices[1] = 0; h_indices[2] = d_indices[2] = 5; h_indices[3] = d_indices[3] = 7; - + thrust::permutation_iterator p_h_source(h_source.begin(), h_indices.begin()); thrust::permutation_iterator p_d_source(d_source.begin(), d_indices.begin()); @@ -211,7 +215,7 @@ void TestPermutationIteratorHostDeviceGather(void) ASSERT_EQUAL(d_output[1], 1); ASSERT_EQUAL(d_output[2], 6); ASSERT_EQUAL(d_output[3], 8); - + // gather device->host thrust::copy(p_d_source, p_d_source + 4, h_output.begin()); @@ -233,7 +237,7 @@ void TestPermutationIteratorHostDeviceScatter(void) HostVector h_source(4,10); HostVector h_indices(4); HostVector h_output(8); - + DeviceVector d_source(4,10); DeviceVector d_indices(4); DeviceVector d_output(8); @@ -246,7 +250,7 @@ void TestPermutationIteratorHostDeviceScatter(void) h_indices[1] = d_indices[1] = 0; h_indices[2] = d_indices[2] = 5; h_indices[3] = d_indices[3] = 7; - + thrust::permutation_iterator p_h_output(h_output.begin(), h_indices.begin()); thrust::permutation_iterator p_d_output(d_output.begin(), d_indices.begin()); @@ -261,7 +265,7 @@ void TestPermutationIteratorHostDeviceScatter(void) ASSERT_EQUAL(d_output[5], 10); ASSERT_EQUAL(d_output[6], 7); ASSERT_EQUAL(d_output[7], 10); - + // scatter device->host thrust::copy(d_source.begin(), d_source.end(), p_h_output); @@ -281,7 +285,7 @@ void TestPermutationIteratorWithCountingIterator(void) { using T = typename Vector::value_type; using diff_t = typename thrust::counting_iterator::difference_type; - + thrust::counting_iterator input(0), index(0); // test copy() diff --git a/thrust/testing/reverse_iterator.cu b/thrust/testing/reverse_iterator.cu index 1571456f1c0..bb7b27b0f63 100644 --- a/thrust/testing/reverse_iterator.cu +++ b/thrust/testing/reverse_iterator.cu @@ -3,6 +3,8 @@ #include #include +#include + void TestReverseIteratorCopyConstructor(void) { thrust::host_vector h_v(1,13); @@ -23,6 +25,8 @@ void TestReverseIteratorCopyConstructor(void) ASSERT_EQUAL(*d_iter2, *d_iter3); } DECLARE_UNITTEST(TestReverseIteratorCopyConstructor); +static_assert(cuda::std::is_trivially_copy_constructible>::value, ""); +static_assert(cuda::std::is_trivially_copyable>::value, ""); void TestReverseIteratorIncrement(void) { @@ -71,7 +75,7 @@ void TestReverseIteratorCopy(void) source[3] = 40; Vector destination(4,0); - + thrust::copy(thrust::make_reverse_iterator(source.end()), thrust::make_reverse_iterator(source.begin()), destination.begin()); diff --git a/thrust/testing/zip_iterator.cu b/thrust/testing/zip_iterator.cu index b2493531cc3..8a600de060d 100644 --- a/thrust/testing/zip_iterator.cu +++ b/thrust/testing/zip_iterator.cu @@ -5,6 +5,8 @@ #include #include +#include + using namespace unittest; template @@ -90,6 +92,7 @@ template } }; SimpleUnitTest > TestZipIteratorManipulationInstance; +static_assert(cuda::std::is_trivially_copy_constructible>>::value, ""); template struct TestZipIteratorReference @@ -224,7 +227,7 @@ template //ASSERT_EQUAL(true, (detail::is_convertible::value) ); - + #if 0 // test host/any typedef tuple IteratorTuple4; @@ -346,8 +349,8 @@ struct TestZipIteratorTransform d_result.begin(), SumTwoTuple()); ASSERT_EQUAL(h_result, d_result); - - + + // Tuples with 3 elements transform( make_zip_iterator(make_tuple(h_data0.begin(), h_data1.begin(), h_data2.begin())), make_zip_iterator(make_tuple(h_data0.end(), h_data1.end(), h_data2.end())), diff --git a/thrust/thrust/detail/type_traits.h b/thrust/thrust/detail/type_traits.h index c7e884f477d..43314b20c3a 100644 --- a/thrust/thrust/detail/type_traits.h +++ b/thrust/thrust/detail/type_traits.h @@ -441,6 +441,8 @@ template : enable_if< is_convertible::value, T > {}; +template +using enable_if_convertible_t = typename enable_if_convertible::type; template struct disable_if_convertible @@ -453,7 +455,6 @@ template : enable_if::value, Result> {}; - template struct is_numeric : and_< diff --git a/thrust/thrust/iterator/constant_iterator.h b/thrust/thrust/iterator/constant_iterator.h index 26701d425f0..a019345a969 100644 --- a/thrust/thrust/iterator/constant_iterator.h +++ b/thrust/thrust/iterator/constant_iterator.h @@ -120,35 +120,25 @@ template - _CCCL_HOST_DEVICE - constant_iterator(constant_iterator const &rhs, - typename thrust::detail::enable_if_convertible< - typename thrust::iterator_system >::type, - typename thrust::iterator_system::type - >::type * = 0) - : super_t(rhs.base()), m_value(rhs.value()) {} + template >::type, + typename thrust::iterator_system::type, + int> = 0> + _CCCL_HOST_DEVICE constant_iterator(constant_iterator const& rhs) + : super_t(rhs.base()) + , m_value(rhs.value()) + {} /*! This constructor receives a value to use as the constant value of this * \p constant_iterator and an index specifying the location of this diff --git a/thrust/thrust/iterator/counting_iterator.h b/thrust/thrust/iterator/counting_iterator.h index 301e538b0ce..1403123b833 100644 --- a/thrust/thrust/iterator/counting_iterator.h +++ b/thrust/thrust/iterator/counting_iterator.h @@ -158,27 +158,20 @@ template - _CCCL_HOST_DEVICE - counting_iterator(counting_iterator const &rhs, - typename thrust::detail::enable_if_convertible< - typename thrust::iterator_system >::type, - typename thrust::iterator_system::type - >::type * = 0) - : super_t(rhs.base()){} + template < + class OtherSystem, + detail::enable_if_convertible_t< + typename thrust::iterator_system>::type, + typename thrust::iterator_system::type, + int> = 0> + _CCCL_HOST_DEVICE counting_iterator(counting_iterator const& rhs) + : super_t(rhs.base()) + {} /*! This \c explicit constructor copies the value of an \c Incrementable * into a new \p counting_iterator's \c Incrementable counter. @@ -189,10 +182,6 @@ template= 2011 - counting_iterator & operator=(const counting_iterator &) = default; -#endif - /*! \cond */ private: diff --git a/thrust/thrust/iterator/detail/reverse_iterator.inl b/thrust/thrust/iterator/detail/reverse_iterator.inl index e9e8cdc111c..9f845228d05 100644 --- a/thrust/thrust/iterator/detail/reverse_iterator.inl +++ b/thrust/thrust/iterator/detail/reverse_iterator.inl @@ -44,33 +44,6 @@ template } // end detail -template - _CCCL_HOST_DEVICE - reverse_iterator - ::reverse_iterator(BidirectionalIterator x) - :super_t(x) -{ -} // end reverse_iterator::reverse_iterator() - -template - template - _CCCL_HOST_DEVICE - reverse_iterator - ::reverse_iterator(reverse_iterator const &r -// XXX msvc screws this up -#if THRUST_HOST_COMPILER != THRUST_HOST_COMPILER_MSVC - , typename thrust::detail::enable_if< - thrust::detail::is_convertible< - OtherBidirectionalIterator, - BidirectionalIterator - >::value - >::type * -#endif // MSVC - ) - :super_t(r.base()) -{ -} // end reverse_iterator::reverse_iterator() - template _CCCL_HOST_DEVICE typename reverse_iterator::super_t::reference diff --git a/thrust/thrust/iterator/detail/zip_iterator.inl b/thrust/thrust/iterator/detail/zip_iterator.inl index f13b9370377..890e7374e56 100644 --- a/thrust/thrust/iterator/detail/zip_iterator.inl +++ b/thrust/thrust/iterator/detail/zip_iterator.inl @@ -32,14 +32,6 @@ THRUST_NAMESPACE_BEGIN -template -_CCCL_HOST_DEVICE - zip_iterator - ::zip_iterator() -{ -} // end zip_iterator::zip_iterator() - - template _CCCL_HOST_DEVICE zip_iterator @@ -48,21 +40,6 @@ _CCCL_HOST_DEVICE { } // end zip_iterator::zip_iterator() - -template - template - _CCCL_HOST_DEVICE - zip_iterator - ::zip_iterator(const zip_iterator &other, - typename thrust::detail::enable_if_convertible< - OtherIteratorTuple, - IteratorTuple - >::type *) - :m_iterator_tuple(other.get_iterator_tuple()) -{ -} // end zip_iterator::zip_iterator() - - template _CCCL_HOST_DEVICE const IteratorTuple &zip_iterator diff --git a/thrust/thrust/iterator/discard_iterator.h b/thrust/thrust/iterator/discard_iterator.h index 6b3ced47e40..e7945ac906b 100644 --- a/thrust/thrust/iterator/discard_iterator.h +++ b/thrust/thrust/iterator/discard_iterator.h @@ -115,18 +115,6 @@ template /*! \endcond */ - /*! Copy constructor copies from a source discard_iterator. - * - * \p rhs The discard_iterator to copy. - */ - _CCCL_HOST_DEVICE - discard_iterator(discard_iterator const &rhs) - : super_t(rhs.base()) {} - -#if _CCCL_STD_VER >= 2011 - discard_iterator & operator=(const discard_iterator &) = default; -#endif - /*! This constructor receives an optional index specifying the position of this * \p discard_iterator in a range. * diff --git a/thrust/thrust/iterator/permutation_iterator.h b/thrust/thrust/iterator/permutation_iterator.h index 1bc9dde7e1b..660b702acfb 100644 --- a/thrust/thrust/iterator/permutation_iterator.h +++ b/thrust/thrust/iterator/permutation_iterator.h @@ -159,18 +159,17 @@ template - _CCCL_HOST_DEVICE - permutation_iterator(permutation_iterator const &r - // XXX remove these guards when we have static_assert - , typename detail::enable_if_convertible::type* = 0 - , typename detail::enable_if_convertible::type* = 0 - ) - : super_t(r.base()), m_element_iterator(r.m_element_iterator) + template = 0, + detail::enable_if_convertible_t = 0> + _CCCL_HOST_DEVICE permutation_iterator(permutation_iterator const& rhs) + : super_t(rhs.base()) + , m_element_iterator(rhs.m_element_iterator) {} - /*! \cond - */ + /*! \cond + */ private: // MSVC 2013 and 2015 incorrectly warning about returning a reference to // a local/temporary here. diff --git a/thrust/thrust/iterator/reverse_iterator.h b/thrust/thrust/iterator/reverse_iterator.h index 7e93fbdcbcd..aa84759c821 100644 --- a/thrust/thrust/iterator/reverse_iterator.h +++ b/thrust/thrust/iterator/reverse_iterator.h @@ -166,8 +166,11 @@ template public: /*! Default constructor does nothing. */ - _CCCL_HOST_DEVICE - reverse_iterator() {} +#if defined(_CCCL_COMPILER_MSVC_2017) + _CCCL_HOST_DEVICE reverse_iterator() {} +#else // ^^^ _CCCL_COMPILER_MSVC_2017 ^^^ / vvv !_CCCL_COMPILER_MSVC_2017 vvv + reverse_iterator() = default; +#endif // !_CCCL_COMPILER_MSVC_2017 /*! \p Constructor accepts a \c BidirectionalIterator pointing to a range * for this \p reverse_iterator to reverse. @@ -175,27 +178,20 @@ template * \param x A \c BidirectionalIterator pointing to a range to reverse. */ _CCCL_HOST_DEVICE - explicit reverse_iterator(BidirectionalIterator x); + explicit reverse_iterator(BidirectionalIterator x) + : super_t(x) + {} /*! \p Copy constructor allows construction from a related compatible * \p reverse_iterator. * * \param r A \p reverse_iterator to copy from. */ - template - _CCCL_HOST_DEVICE - reverse_iterator(reverse_iterator const &r -// XXX msvc screws this up -// XXX remove these guards when we have static_assert -#if THRUST_HOST_COMPILER != THRUST_HOST_COMPILER_MSVC - , typename thrust::detail::enable_if< - thrust::detail::is_convertible< - OtherBidirectionalIterator, - BidirectionalIterator - >::value - >::type * = 0 -#endif // MSVC - ); + template = 0> + _CCCL_HOST_DEVICE reverse_iterator(reverse_iterator const& rhs) + : super_t(rhs.base()) + {} /*! \cond */ diff --git a/thrust/thrust/iterator/zip_iterator.h b/thrust/thrust/iterator/zip_iterator.h index 7f7b4eda7aa..fb5c9c5d52b 100644 --- a/thrust/thrust/iterator/zip_iterator.h +++ b/thrust/thrust/iterator/zip_iterator.h @@ -148,10 +148,13 @@ template : public detail::zip_iterator_base::type { public: - /*! Null constructor does nothing. + /*! Default constructor does nothing. */ - inline _CCCL_HOST_DEVICE - zip_iterator(); +#if defined(_CCCL_COMPILER_MSVC_2017) + inline _CCCL_HOST_DEVICE zip_iterator() {} +#else // ^^^ _CCCL_COMPILER_MSVC_2017 ^^^ / vvv !_CCCL_COMPILER_MSVC_2017 vvv + zip_iterator() = default; +#endif // !_CCCL_COMPILER_MSVC_2017 /*! This constructor creates a new \p zip_iterator from a * \p tuple of iterators. @@ -166,13 +169,11 @@ template * * \param other The \p zip_iterator to copy. */ - template - inline _CCCL_HOST_DEVICE - zip_iterator(const zip_iterator &other, - typename thrust::detail::enable_if_convertible< - OtherIteratorTuple, - IteratorTuple - >::type * = 0); + template = 0> + inline _CCCL_HOST_DEVICE zip_iterator(const zip_iterator& other) + : m_iterator_tuple(other.get_iterator_tuple()) + {} /*! This method returns a \c const reference to this \p zip_iterator's * \p tuple of iterators.