Skip to content

Commit 948ae96

Browse files
committed
iterator: multiple smaller fixes/cleanups
1 parent e94372d commit 948ae96

File tree

1 file changed

+20
-21
lines changed

1 file changed

+20
-21
lines changed

libcxx/include/__ranges/cartesian_product_view.h

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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

317316
private:
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

Comments
 (0)