@@ -193,7 +193,7 @@ class cartesian_product_view<First, Vs...>::iterator {
193193 constexpr iterator (iterator<!Const> i)
194194 requires Const && (convertible_to<iterator_t <First>, iterator_t <const First>> && ... &&
195195 convertible_to<iterator_t <Vs>, iterator_t <const Vs>>)
196- : parent_(std::addressof( i.parent_) ), current_(std::move(i.current_)) {}
196+ : parent_(i.parent_), current_(std::move(i.current_)) {}
197197
198198 constexpr auto operator *() const {
199199 return __tuple_transform ([](auto & i) -> decltype (auto ) { return *i; }, current_);
@@ -204,13 +204,13 @@ class cartesian_product_view<First, Vs...>::iterator {
204204 return *this ;
205205 }
206206
207- constexpr void operator ++(int ) { next () ; }
207+ constexpr void operator ++(int ) { ++* this ; }
208208
209209 constexpr iterator operator ++(int )
210210 requires forward_range<__maybe_const<Const, First>>
211211 {
212212 auto tmp = *this ;
213- next () ;
213+ ++* this ;
214214 return tmp;
215215 }
216216
@@ -225,7 +225,7 @@ class cartesian_product_view<First, Vs...>::iterator {
225225 requires cartesian_product_is_bidirectional<Const, First, Vs...>
226226 {
227227 auto tmp = *this ;
228- prev () ;
228+ --* this ;
229229 return tmp;
230230 }
231231
@@ -281,19 +281,18 @@ class cartesian_product_view<First, Vs...>::iterator {
281281 return iterator (x) -= y;
282282 }
283283
284- friend constexpr iterator operator -(const iterator& x, const iterator& y)
285- requires cartesian_product_is_random_access <Const, First, Vs...>
284+ friend constexpr difference_type operator -(const iterator& x, const iterator& y)
285+ requires cartesian_is_sized_sentinel <Const, iterator_t , First, Vs...>
286286 {
287287 return x.distance_from (y.current_ );
288288 }
289289
290290 friend constexpr difference_type operator -(const iterator& i, default_sentinel_t )
291291 requires cartesian_is_sized_sentinel<Const, sentinel_t , First, Vs...>
292292 {
293- MultiIterator end_tuple;
294- std::get<0 >(end_tuple) = ranges::end (std::get<0 >(i.parent_ ->bases_ ));
295- for (int N = 1 ; N <= sizeof ...(Vs); N++)
296- std::get<N>(end_tuple) = ranges::begin (std::get<N>(i.parent_ ->bases_ ));
293+ tuple end_tuple = [&b = i.parent_ ->bases_ ]<size_t ... I>(index_sequence<I...>) {
294+ return tuple{ranges::end (std::get<0 >(b)), ranges::begin (std::get<1 + I>(b))...};
295+ }(std::make_index_sequence<sizeof ...(Vs)>{});
297296 return i.distance_from (end_tuple);
298297 }
299298
@@ -311,19 +310,16 @@ class cartesian_product_view<First, Vs...>::iterator {
311310 requires(indirectly_swappable<iterator_t <__maybe_const<Const, First>>> && ... &&
312311 indirectly_swappable<iterator_t <__maybe_const<Const, Vs>>>)
313312 {
314- iter_swap_helper (l, r);
313+ iter_swap_impl (l, r);
315314 }
316315
317316private:
318- using Parent = __maybe_const<Const, cartesian_product_view>;
319- Parent* parent_ = nullptr ;
317+ using Parent = __maybe_const<Const, cartesian_product_view>;
318+ Parent* parent_ = nullptr ;
320319 using MultiIterator = tuple<iterator_t <__maybe_const<Const, First>>, iterator_t <__maybe_const<Const, Vs>>...>;
321320 MultiIterator current_;
322321
323- constexpr iterator (Parent& parent, decltype (current_) current)
324- : parent_(std::addressof(parent)), current_(std::move(current)) {}
325-
326- template <auto N = sizeof ...(Vs)>
322+ template <size_t N = sizeof ...(Vs)>
327323 constexpr void next () {
328324 auto & it = std::get<N>(current_);
329325 ++it;
@@ -335,7 +331,7 @@ class cartesian_product_view<First, Vs...>::iterator {
335331 }
336332 }
337333
338- template <auto N = sizeof ...(Vs)>
334+ template <size_t N = sizeof ...(Vs)>
339335 constexpr void prev () {
340336 auto & it = std::get<N>(current_);
341337 if constexpr (N > 0 ) {
@@ -347,7 +343,7 @@ class cartesian_product_view<First, Vs...>::iterator {
347343 --it;
348344 }
349345
350- template <std:: size_t N = sizeof ...(Vs)>
346+ template <auto N = sizeof ...(Vs)>
351347 constexpr void advance (difference_type x) {
352348 if (x == 0 )
353349 return ;
@@ -416,11 +412,14 @@ class cartesian_product_view<First, Vs...>::iterator {
416412 return static_cast <difference_type>(0 );
417413 }
418414
415+ constexpr iterator (Parent& parent, MultiIterator current)
416+ : parent_(std::addressof(parent)), current_(std::move(current)) {}
417+
419418 template <auto N = sizeof ...(Vs)>
420- static constexpr void iter_swap_helper (const iterator& l, const iterator& r) {
419+ static constexpr void iter_swap_impl (const iterator& l, const iterator& r) {
421420 ranges::iter_swap (std::get<N>(l.current_ ), std::get<N>(r.current_ ));
422421 if constexpr (N > 0 )
423- iter_swap_helper <N - 1 >(l, r);
422+ iter_swap_impl <N - 1 >(l, r);
424423 }
425424};
426425
0 commit comments