Skip to content

Commit 3b7653d

Browse files
committed
iterator: iter_swap(iterator, iterator)
1 parent 251219d commit 3b7653d

File tree

1 file changed

+14
-0
lines changed

1 file changed

+14
-0
lines changed

libcxx/include/__ranges/cartesian_product_view.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,13 @@ class cartesian_product_view<First, Vs...>::iterator {
239239
return __tuple_transform(ranges::iter_move, i.current_);
240240
}
241241

242+
friend constexpr void iter_swap(const iterator& l, const iterator& r) /*fixme: noexcept(...) */
243+
requires(indirectly_swappable<iterator_t<__maybe_const<Const, First>>> && ... &&
244+
indirectly_swappable<iterator_t<__maybe_const<Const, Vs>>>)
245+
{
246+
iter_swap_helper(l, r);
247+
}
248+
242249
private:
243250
using Parent = __maybe_const<Const, cartesian_product_view>;
244251
Parent* parent_ = nullptr;
@@ -340,6 +347,13 @@ class cartesian_product_view<First, Vs...>::iterator {
340347
return scaled_distance<N>(t) + scaled_sum<N + 1>(t);
341348
return static_cast<difference_type>(0);
342349
}
350+
351+
template <auto N = sizeof...(Vs)>
352+
static constexpr void iter_swap_helper(const iterator& l, const iterator& r) {
353+
ranges::iter_swap(std::get<N>(l.current_), std::get<N>(r.current_));
354+
if constexpr (N > 0)
355+
iter_swap_helper<N - 1>(l, r);
356+
}
343357
};
344358

345359
} // namespace ranges

0 commit comments

Comments
 (0)