@@ -88,7 +88,7 @@ inline constexpr bool __transform_iterator_nothrow_subscript<_Fn, _Iter, true> =
88
88
// ! needed while saving both memory capacity and bandwidth.
89
89
// !
90
90
// ! The following code snippet demonstrates how to create a \p transform_iterator which represents the result of
91
- // ! \c sqrtf applied to the contents of a \p device_vector.
91
+ // ! \c sqrtf applied to the contents of a \p thrust:: device_vector.
92
92
// !
93
93
// ! @code
94
94
// ! #include <cuda/iterator>
@@ -105,11 +105,7 @@ inline constexpr bool __transform_iterator_nothrow_subscript<_Fn, _Iter, true> =
105
105
// !
106
106
// ! int main()
107
107
// ! {
108
- // ! thrust::device_vector<float> v(4);
109
- // ! v[0] = 1.0f;
110
- // ! v[1] = 4.0f;
111
- // ! v[2] = 9.0f;
112
- // ! v[3] = 16.0f;
108
+ // ! thrust::device_vector<float> v{1.0f, 4.0f, 9.0f, 16.0f};
113
109
// !
114
110
// ! using FloatIterator = thrust::device_vector<float>::iterator;
115
111
// !
@@ -126,8 +122,8 @@ inline constexpr bool __transform_iterator_nothrow_subscript<_Fn, _Iter, true> =
126
122
// ! @endcode
127
123
// !
128
124
// ! This next example demonstrates how to use a \p transform_iterator with the \p thrust::reduce function to compute the
129
- // ! sum of squares of a sequence. We will create temporary \p transform_iterators with the \p make_transform_iterator
130
- // ! function in order to avoid explicitly specifying their type:
125
+ // ! sum of squares of a sequence. We will create temporary \p transform_iterators utilising class template argument
126
+ // ! deduction avoid explicitly specifying their type:
131
127
// !
132
128
// ! @code
133
129
// ! #include <cuda/iterator>
@@ -151,62 +147,21 @@ inline constexpr bool __transform_iterator_nothrow_subscript<_Fn, _Iter, true> =
151
147
// ! v[0] = 1.0f;
152
148
// ! v[1] = 2.0f;
153
149
// ! v[2] = 3.0f;
154
- // ! v[3] = 4.0f;
155
- // !
156
- // ! float sum_of_squares =
157
- // ! thrust::reduce(cuda::make_transform_iterator(v.begin(), square{}),
158
- // ! cuda::make_transform_iterator(v.end(), square{}));
150
+ // ! thrust::device_vector<float> v{1.0f, 2.0f, 3.0f, 4.0f};
151
+ // ! thrust::reduce(cuda::transform_iterator{v.begin(), square{}},
152
+ // ! cuda::transform_iterator{v.end(), square{}});
159
153
// !
160
154
// ! std::cout << "sum of squares: " << sum_of_squares << std::endl;
161
155
// ! return 0;
162
156
// ! }
163
157
// ! @endcode
164
- // !
165
- // ! The following example illustrates how to use the third template argument to explicitly specify the return type of
166
- // ! the function.
167
- // !
168
- // ! @code
169
- // ! #include <cuda/iterator>
170
- // ! #include <thrust/device_vector.h>
171
- // !
172
- // ! struct square_root
173
- // ! {
174
- // ! __host__ __device__
175
- // ! float operator()(float x) const
176
- // ! {
177
- // ! return sqrtf(x);
178
- // ! }
179
- // ! };
180
- // !
181
- // ! int main()
182
- // ! {
183
- // ! thrust::device_vector<float> v(4);
184
- // ! v[0] = 1.0f;
185
- // ! v[1] = 4.0f;
186
- // ! v[2] = 9.0f;
187
- // ! v[3] = 16.0f;
188
- // !
189
- // ! using FloatIterator = thrust::device_vector<float>::iterator;
190
- // !
191
- // ! // note: float result_type is specified explicitly
192
- // ! cuda::transform_iterator iter(v.begin(), square_root{});
193
- // !
194
- // ! *iter; // returns 1.0f
195
- // ! iter[0]; // returns 1.0f;
196
- // ! iter[1]; // returns 2.0f;
197
- // ! iter[2]; // returns 3.0f;
198
- // ! iter[3]; // returns 4.0f;
199
- // !
200
- // ! // iter[4] is an out-of-bounds error
201
- // ! }
202
- // ! @endcode
203
158
template <class _Iter , class _Fn >
204
159
class transform_iterator : public __transform_iterator_category_base <_Iter, _Fn>
205
160
{
206
161
static_assert (_CUDA_VSTD::is_object_v<_Fn>, " cuda::transform_iterator requires that _Fn is a function object" );
207
162
static_assert (_CUDA_VSTD::regular_invocable<_Fn&, _CUDA_VSTD::iter_reference_t <_Iter>>,
208
163
" cuda::transform_iterator requires that _Fn is invocable with iter_reference_t<_Iter>" );
209
- static_assert (_CUDA_VSTD::regular_invocable< _Fn&, _CUDA_VSTD::iter_reference_t <_Iter>>,
164
+ static_assert (_CUDA_VSTD::__can_reference<_CUDA_VSTD:: invoke_result_t < _Fn&, _CUDA_VSTD::iter_reference_t <_Iter> >>,
210
165
" cuda::transform_iterator requires that the return type of _Fn is referenceable" );
211
166
212
167
public:
@@ -341,10 +296,7 @@ class transform_iterator : public __transform_iterator_category_base<_Iter, _Fn>
341
296
return _CUDA_VSTD::invoke (const_cast <_Fn&>(*__func_), __current_[__n]);
342
297
}
343
298
344
- // ! @brief Compares two \c transform_iterator \p __lhs and \p __rhs for equality
345
- // ! @param __lhs The left \c transform_iterator
346
- // ! @param __rhs The right \c transform_iterator
347
- // ! @return true if the stored iterators compares equal
299
+ // ! @brief Compares two \c transform_iterator for equality, directly comparing the stored iterators
348
300
template <class _Iter2 = _Iter>
349
301
[[nodiscard]] _LIBCUDACXX_HIDE_FROM_ABI friend constexpr auto
350
302
operator ==(const transform_iterator& __lhs, const transform_iterator& __rhs) noexcept (
@@ -355,10 +307,7 @@ class transform_iterator : public __transform_iterator_category_base<_Iter, _Fn>
355
307
}
356
308
357
309
#if _CCCL_STD_VER <= 2017
358
- // ! @brief Compares two \c transform_iterator \p __lhs and \p __rhs for inequality
359
- // ! @param __lhs The left \c transform_iterator
360
- // ! @param __rhs The right \c transform_iterator
361
- // ! @return true if the stored iterators do not compare equal
310
+ // ! @brief Compares two \c transform_iterator for inequality, directly comparing the stored iterators
362
311
template <class _Iter2 = _Iter>
363
312
[[nodiscard]] _LIBCUDACXX_HIDE_FROM_ABI friend constexpr auto
364
313
operator !=(const transform_iterator& __lhs, const transform_iterator& __rhs) noexcept (
@@ -369,10 +318,7 @@ class transform_iterator : public __transform_iterator_category_base<_Iter, _Fn>
369
318
}
370
319
#endif // _CCCL_STD_VER <= 2017
371
320
372
- // ! @brief Compares two \c transform_iterator \p __lhs and \p __rhs for less than
373
- // ! @param __lhs The left \c transform_iterator
374
- // ! @param __rhs The right \c transform_iterator
375
- // ! @return true if the stored iterators compares less than
321
+ // ! @brief Compares two \c transform_iterator for less then, directly comparing the stored iterators
376
322
template <class _Iter2 = _Iter>
377
323
[[nodiscard]] _LIBCUDACXX_HIDE_FROM_ABI friend constexpr auto
378
324
operator <(const transform_iterator& __lhs, const transform_iterator& __rhs) noexcept (
@@ -382,10 +328,7 @@ class transform_iterator : public __transform_iterator_category_base<_Iter, _Fn>
382
328
return __lhs.__current_ < __rhs.__current_ ;
383
329
}
384
330
385
- // ! @brief Compares two \c transform_iterator \p __lhs and \p __rhs for greater than
386
- // ! @param __lhs The left \c transform_iterator
387
- // ! @param __rhs The right \c transform_iterator
388
- // ! @return true if the stored iterators compares greater than
331
+ // ! @brief Compares two \c transform_iterator for greater then, directly comparing the stored iterators
389
332
template <class _Iter2 = _Iter>
390
333
[[nodiscard]] _LIBCUDACXX_HIDE_FROM_ABI friend constexpr auto
391
334
operator >(const transform_iterator& __lhs, const transform_iterator& __rhs) noexcept (
@@ -395,10 +338,7 @@ class transform_iterator : public __transform_iterator_category_base<_Iter, _Fn>
395
338
return __lhs.__current_ > __rhs.__current_ ;
396
339
}
397
340
398
- // ! @brief Compares two \c transform_iterator \p __lhs and \p __rhs for less equal
399
- // ! @param __lhs The left \c transform_iterator
400
- // ! @param __rhs The right \c transform_iterator
401
- // ! @return true if the stored iterators compares less equal
341
+ // ! @brief Compares two \c transform_iterator for less equal, directly comparing the stored iterators
402
342
template <class _Iter2 = _Iter>
403
343
[[nodiscard]] _LIBCUDACXX_HIDE_FROM_ABI friend constexpr auto
404
344
operator <=(const transform_iterator& __lhs, const transform_iterator& __rhs) noexcept (
@@ -408,10 +348,7 @@ class transform_iterator : public __transform_iterator_category_base<_Iter, _Fn>
408
348
return __lhs.__current_ <= __rhs.__current_ ;
409
349
}
410
350
411
- // ! @brief Compares two \c transform_iterator \p __lhs and \p __rhs for greater equal
412
- // ! @param __lhs The left \c transform_iterator
413
- // ! @param __rhs The right \c transform_iterator
414
- // ! @return true if the stored iterators compares greater equal
351
+ // ! @brief Compares two \c transform_iterator for greater equal, directly comparing the stored iterators
415
352
template <class _Iter2 = _Iter>
416
353
[[nodiscard]] _LIBCUDACXX_HIDE_FROM_ABI friend constexpr auto
417
354
operator >=(const transform_iterator& __lhs, const transform_iterator& __rhs) noexcept (
@@ -422,10 +359,7 @@ class transform_iterator : public __transform_iterator_category_base<_Iter, _Fn>
422
359
}
423
360
424
361
#if _LIBCUDACXX_HAS_SPACESHIP_OPERATOR()
425
- // ! @brief Three-way-compares two \c transform_iterator \p __lhs and \p __rhs
426
- // ! @param __lhs The left \c transform_iterator
427
- // ! @param __rhs The right \c transform_iterator
428
- // ! @return The three-way ordering of stored iterators
362
+ // ! @brief Three-way-compares two \c transform_iterator, directly three-way-comparing the stored iterators
429
363
template <class _Iter2 = _Iter>
430
364
[[nodiscard]] _LIBCUDACXX_HIDE_FROM_ABI friend constexpr auto
431
365
operator <=>(const transform_iterator& __lhs, const transform_iterator& __rhs) noexcept (
0 commit comments