|
6497 | 6497 | is_reference_v<range_reference_t<@\exposidnc{Base}@>>;
|
6498 | 6498 |
|
6499 | 6499 | @\exposidnc{OuterIter}@ @\exposid{outer_}@ = @\exposidnc{OuterIter}@(); // \expos
|
6500 |
| - @\exposidnc{InnerIter}@ @\exposid{inner_}@ = @\exposidnc{InnerIter}@(); // \expos |
| 6500 | + optional<@\exposidnc{InnerIter}@> @\exposid{inner_}@; // \expos |
6501 | 6501 | @\exposidnc{Parent}@* @\exposid{parent_}@ = nullptr; // \expos
|
6502 | 6502 |
|
6503 | 6503 | constexpr void @\exposidnc{satisfy}@(); // \expos
|
|
6508 | 6508 | using value_type = range_value_t<range_reference_t<@\exposid{Base}@>>;
|
6509 | 6509 | using difference_type = @\seebelow@;
|
6510 | 6510 |
|
6511 |
| - @\exposid{iterator}@() requires @\libconcept{default_initializable}@<@\exposid{OuterIter}@> && |
6512 |
| - @\itcorr[-2]\libconcept{default_initializable}@<@\exposid{InnerIter}@> = default; |
| 6511 | + @\exposid{iterator}@() requires @\libconcept{default_initializable}@<@\exposid{OuterIter}@> = default; |
6513 | 6512 | constexpr @\exposid{iterator}@(@\exposid{Parent}@& parent, @\exposid{OuterIter}@ outer);
|
6514 | 6513 | constexpr @\exposid{iterator}@(@\exposid{iterator}@<!Const> i)
|
6515 | 6514 | requires Const &&
|
6516 | 6515 | @\libconcept{convertible_to}@<iterator_t<V>, @\exposid{OuterIter}@> &&
|
6517 | 6516 | @\libconcept{convertible_to}@<iterator_t<@\exposid{InnerRng}@>, @\exposid{InnerIter}@>;
|
6518 | 6517 |
|
6519 |
| - constexpr decltype(auto) operator*() const { return *@\exposid{inner_}@; } |
| 6518 | + constexpr decltype(auto) operator*() const { return **@\exposid{inner_}@; } |
6520 | 6519 |
|
6521 | 6520 | constexpr @\exposid{InnerIter}@ operator->() const
|
6522 | 6521 | requires @\exposconcept{has-arrow}@<@\exposid{InnerIter}@> && @\libconcept{copyable}@<@\exposid{InnerIter}@>;
|
|
6542 | 6541 | @\libconcept{equality_comparable}@<iterator_t<range_reference_t<@\exposid{Base}@>>>;
|
6543 | 6542 |
|
6544 | 6543 | friend constexpr decltype(auto) iter_move(const @\exposid{iterator}@& i)
|
6545 |
| - noexcept(noexcept(ranges::iter_move(i.@\exposid{inner_}@))) { |
6546 |
| - return ranges::iter_move(i.@\exposid{inner_}@); |
| 6544 | + noexcept(noexcept(ranges::iter_move(*i.@\exposid{inner_}@))) { |
| 6545 | + return ranges::iter_move(*i.@\exposid{inner_}@); |
6547 | 6546 | }
|
6548 | 6547 |
|
6549 | 6548 | friend constexpr void iter_swap(const @\exposid{iterator}@& x, const @\exposid{iterator}@& y)
|
6550 |
| - noexcept(noexcept(ranges::iter_swap(x.@\exposid{inner_}@, y.@\exposid{inner_}@))) |
| 6549 | + noexcept(noexcept(ranges::iter_swap(*x.@\exposid{inner_}@, *y.@\exposid{inner_}@))) |
6551 | 6550 | requires @\libconcept{indirectly_swappable}@<@\exposid{InnerIter}@>;
|
6552 | 6551 | };
|
6553 | 6552 | }
|
|
6624 | 6623 | for (; @\exposid{outer_}@ != ranges::end(@\exposid{parent_}@->@\exposid{base_}@); ++@\exposid{outer_}@) {
|
6625 | 6624 | auto&& inner = update_inner(@\exposid{outer_}@);
|
6626 | 6625 | @\exposid{inner_}@ = ranges::begin(inner);
|
6627 |
| - if (@\exposid{inner_}@ != ranges::end(inner)) |
| 6626 | + if (*@\exposid{inner_}@ != ranges::end(inner)) |
6628 | 6627 | return;
|
6629 | 6628 | }
|
6630 | 6629 | if constexpr (@\exposid{ref-is-glvalue}@)
|
6631 |
| - @\exposid{inner_}@ = @\exposid{InnerIter}@(); |
| 6630 | + @\exposid{inner_}@.reset(); |
6632 | 6631 | \end{codeblock}
|
6633 | 6632 | \end{itemdescr}
|
6634 | 6633 |
|
|
6669 | 6668 | \begin{itemdescr}
|
6670 | 6669 | \pnum
|
6671 | 6670 | \effects
|
6672 |
| -Equivalent to \tcode{return \exposid{inner_};} |
| 6671 | +Equivalent to: \tcode{return *\exposid{inner_};} |
6673 | 6672 | \end{itemdescr}
|
6674 | 6673 |
|
6675 | 6674 | \indexlibrarymember{operator++}{join_view::\exposid{iterator}}%
|
|
6690 | 6689 | Equivalent to:
|
6691 | 6690 | \begin{codeblock}
|
6692 | 6691 | auto&& inner_rng = @\placeholder{inner-range}@;
|
6693 |
| -if (++@\exposid{inner_}@ == ranges::end(inner_rng)) { |
| 6692 | +if (++*@\exposid{inner_}@ == ranges::end(inner_rng)) { |
6694 | 6693 | ++@\exposid{outer_}@;
|
6695 | 6694 | @\exposid{satisfy}@();
|
6696 | 6695 | }
|
|
6742 | 6741 | \begin{codeblock}
|
6743 | 6742 | if (@\exposid{outer_}@ == ranges::end(@\exposid{parent_}@->@\exposid{base_}@))
|
6744 | 6743 | @\exposid{inner_}@ = ranges::end(*--@\exposid{outer_}@);
|
6745 |
| -while (@\exposid{inner_}@ == ranges::begin(*@\exposid{outer_}@)) |
6746 |
| - @\exposid{inner_}@ = ranges::end(*--@\exposid{outer_}@); |
6747 |
| ---@\exposid{inner_}@; |
| 6744 | +while (*@\exposid{inner_}@ == ranges::begin(*@\exposid{outer_}@)) |
| 6745 | + *@\exposid{inner_}@ = ranges::end(*--@\exposid{outer_}@); |
| 6746 | +--*@\exposid{inner_}@; |
6748 | 6747 | return *this;
|
6749 | 6748 | \end{codeblock}
|
6750 | 6749 | \end{itemdescr}
|
|
6785 | 6784 | \indexlibrarymember{iter_swap}{join_view::\exposid{iterator}}%
|
6786 | 6785 | \begin{itemdecl}
|
6787 | 6786 | friend constexpr void iter_swap(const @\exposid{iterator}@& x, const @\exposid{iterator}@& y)
|
6788 |
| - noexcept(noexcept(ranges::iter_swap(x.@\exposid{inner_}@, y.@\exposid{inner_}@))) |
| 6787 | + noexcept(noexcept(ranges::iter_swap(*x.@\exposid{inner_}@, *y.@\exposid{inner_}@))) |
6789 | 6788 | requires @\libconcept{indirectly_swappable}@<@\exposid{InnerIter}@>;
|
6790 | 6789 | \end{itemdecl}
|
6791 | 6790 |
|
6792 | 6791 | \begin{itemdescr}
|
6793 | 6792 | \pnum
|
6794 | 6793 | \effects
|
6795 |
| -Equivalent to: \tcode{return ranges::iter_swap(x.\exposid{inner_}, y.\exposid{inner_});} |
| 6794 | +Equivalent to: \tcode{return ranges::iter_swap(*x.\exposid{inner_}, *y.\exposid{inner_});} |
6796 | 6795 | \end{itemdescr}
|
6797 | 6796 |
|
6798 | 6797 | \rSec3[range.join.sentinel]{Class template \tcode{join_view::\exposid{sentinel}}}
|
|
0 commit comments