10
10
// Project include(s)
11
11
#include " detray/definitions/detail/qualifiers.hpp"
12
12
#include " detray/definitions/indexing.hpp"
13
+ #include " detray/utils/ranges/empty.hpp"
13
14
#include " detray/utils/ranges/ranges.hpp"
14
15
#include " detray/utils/ranges/subrange.hpp"
15
16
@@ -203,16 +204,15 @@ class enumerate_view : public detray::ranges::view_interface<
203
204
// / Construct from a @param range that will be enumerated beginning at 0
204
205
template <detray::ranges::range range_t >
205
206
DETRAY_HOST_DEVICE constexpr explicit enumerate_view (range_t &&rng)
206
- : m_begin{detray::ranges::begin (std::forward<range_t >(rng))},
207
- m_end{detray::ranges::end (std::forward<range_t >(rng)),
208
- static_cast <incr_t >(rng.size ())} {}
207
+ : m_begin{detray::ranges::begin (rng)},
208
+ m_end{detray::ranges::end (rng), static_cast <incr_t >(rng.size ())} {}
209
209
210
210
// / Construct from a @param range that will be enumerated beginning at
211
211
// / @param start.
212
212
template <detray::ranges::range range_t >
213
213
DETRAY_HOST_DEVICE constexpr enumerate_view (range_t &&rng, incr_t start)
214
- : m_begin{detray::ranges::begin (std::forward< range_t >( rng) ), start},
215
- m_end{detray::ranges::end (std::forward< range_t >( rng) ),
214
+ : m_begin{detray::ranges::begin (rng), start},
215
+ m_end{detray::ranges::end (rng),
216
216
start + static_cast <incr_t >(rng.size ())} {}
217
217
218
218
// / @return start position of range on container.
@@ -237,8 +237,16 @@ requires std::convertible_to<std::iter_difference_t<range_itr_t>,
237
237
238
238
using base_type = enumerate_view<range_itr_t , incr_t >;
239
239
240
+ // / Partial construction for range composition
241
+ // / @{
240
242
constexpr enumerate() = default ;
241
243
244
+ DETRAY_HOST_DEVICE constexpr explicit enumerate(incr_t start)
245
+ : m_incr{start} {}
246
+ // / @}
247
+
248
+ // / Direct view construction
249
+ // / @{
242
250
template <detray::ranges::range range_t >
243
251
DETRAY_HOST_DEVICE constexpr explicit enumerate(range_t &&rng)
244
252
: base_type(std::forward<range_t >(rng)) {}
@@ -253,22 +261,46 @@ requires std::convertible_to<std::iter_difference_t<range_itr_t>,
253
261
: enumerate(detray::ranges::subrange(
254
262
std::forward<deduced_range_t >(range), vol),
255
263
detray::detail::get<0 >(vol.full_range())) {}
264
+ // / @}
265
+
266
+ // / Call operator for range composition
267
+ template <detray::ranges::range range_t >
268
+ DETRAY_HOST_DEVICE constexpr auto operator ()(range_t &&rng) {
269
+ using itr_t = detray::ranges::const_iterator_t <std::decay_t <range_t >>;
270
+ return detray::ranges::enumerate_view<itr_t , incr_t >(
271
+ std::forward<range_t >(rng), m_incr);
272
+ }
273
+
274
+ private:
275
+ incr_t m_incr{0 };
256
276
};
257
277
258
278
// deduction guides
279
+ DETRAY_HOST_DEVICE enumerate()
280
+ ->enumerate<
281
+ detray::ranges::const_iterator_t <detray::ranges::views::empty<int >>,
282
+ dindex>;
283
+
284
+ DETRAY_HOST_DEVICE enumerate(dindex start)
285
+ ->enumerate<
286
+ detray::ranges::const_iterator_t <detray::ranges::views::empty<int >>,
287
+ dindex>;
259
288
260
289
template <detray::ranges::range range_t >
261
290
DETRAY_HOST_DEVICE enumerate(range_t &&rng)
262
- ->enumerate<detray::ranges::const_iterator_t <range_t >, dindex>;
291
+ ->enumerate<detray::ranges::const_iterator_t <std::decay_t <range_t >>,
292
+ dindex>;
263
293
264
294
template <detray::ranges::range range_t , typename volume_t ,
265
295
typename = typename std::remove_reference_t <volume_t >::volume_def>
266
296
DETRAY_HOST_DEVICE enumerate(range_t &&range, const volume_t &vol)
267
- ->enumerate<detray::ranges::const_iterator_t <range_t >, dindex>;
297
+ ->enumerate<detray::ranges::const_iterator_t <std::decay_t <range_t >>,
298
+ dindex>;
268
299
269
300
template <detray::ranges::range range_t >
270
301
DETRAY_HOST_DEVICE enumerate(range_t &&rng, dindex start)
271
- ->enumerate<detray::ranges::const_iterator_t <range_t >, dindex>;
302
+ ->enumerate<detray::ranges::const_iterator_t <std::decay_t <range_t >>,
303
+ dindex>;
272
304
273
305
} // namespace views
274
306
0 commit comments