@@ -39,7 +39,7 @@ struct cartesian_product_view : public detray::ranges::view_interface<
39
39
using iterator_t = detray::ranges::detail::cartesian_product_iterator<
40
40
detray::ranges::iterator_t <range_ts>...>;
41
41
using value_type = detray::tuple<typename std::iterator_traits<
42
- detray::ranges::iterator_t <range_ts>>::value_type & ...>;
42
+ detray::ranges::iterator_t <range_ts>>::reference ...>;
43
43
44
44
// / Default constructor
45
45
constexpr cartesian_product_view () = default;
@@ -121,9 +121,10 @@ struct cartesian_product_iterator {
121
121
122
122
using difference_type = std::ptrdiff_t ;
123
123
using value_type =
124
- std::tuple<typename std::iterator_traits<iterator_ts>::value_type ...>;
124
+ std::tuple<typename std::iterator_traits<iterator_ts>::reference ...>;
125
125
using pointer = value_type *;
126
- using reference = value_type &;
126
+ using reference = value_type;
127
+ // TODO: Adapt to the weakest iterator category in pack
127
128
using iterator_category = detray::ranges::bidirectional_iterator_tag;
128
129
129
130
// / Default constructor required by LegacyIterator trait
@@ -219,7 +220,9 @@ struct cartesian_product_iterator {
219
220
template <std::size_t ... I>
220
221
DETRAY_HOST_DEVICE constexpr auto unroll_values (
221
222
std::index_sequence<I...>) const {
222
- return std::tuple (*detray::get<I>(m_itrs)...);
223
+ return std::tuple<
224
+ typename std::iterator_traits<iterator_ts>::reference...>(
225
+ *detray::get<I>(m_itrs)...);
223
226
}
224
227
225
228
// / Global range collection of begin and end iterators
0 commit comments