diff --git a/source/ranges.tex b/source/ranges.tex index 7d7116b1d3..09fe4d9629 100644 --- a/source/ranges.tex +++ b/source/ranges.tex @@ -6036,11 +6036,17 @@ constexpr auto begin() const requires @\placeholder{simple-view}@ { return @\exposid{iterator}@(ranges::begin(@\exposid{base_}@)); } - constexpr auto end() requires (!@\placeholder{simple-view}@) - { return ranges::end(@\exposid{base_}@); } + constexpr auto end() + { return @\exposid{sentinel}@{ranges::end(@\exposid{base_}@)}; } - constexpr auto end() const requires @\placeholder{simple-view}@ - { return ranges::end(@\exposid{base_}@); } + constexpr auto end() requires common_range + { return @\exposid{iterator}@{ranges::end(@\exposid{base_}@)}; } + + constexpr auto end() const requires range + { return @\exposid{sentinel}@{ranges::end(@\exposid{base_}@)}; } + + constexpr auto end() const requires common_range + { return @\exposid{iterator}@{ranges::end(@\exposid{base_}@)}; } constexpr auto size() requires sized_range { return ranges::size(@\exposid{base_}@); } @@ -6050,6 +6056,8 @@ private: template struct @\exposid{iterator}@; // \expos + // \ref{range.elements.sentinel}, class template \tcode{elements_view::\exposid{sentinel}} + template struct @\exposid{sentinel}@; // \expos V @\exposid{base_}@ = V(); // \expos }; } @@ -6112,7 +6120,6 @@ friend constexpr bool operator==(const @\exposid{iterator}@& x, const @\exposid{iterator}@& y) requires equality_comparable>; - friend constexpr bool operator==(const @\exposid{iterator}@& x, const sentinel_t<@\exposid{base-t}@>& y); friend constexpr bool operator<(const @\exposid{iterator}@& x, const @\exposid{iterator}@& y) requires random_access_range<@\exposid{base-t}@>; @@ -6133,13 +6140,6 @@ requires random_access_range<@\exposid{base-t}@>; friend constexpr difference_type operator-(const @\exposid{iterator}@& x, const @\exposid{iterator}@& y) requires random_access_range<@\exposid{base-t}@>; - - friend constexpr difference_type - operator-(const @\exposid{iterator}@& x, const sentinel_t<@\exposid{base-t}@>& y) - requires sized_sentinel_for, iterator_t<@\exposid{base-t}@>>; - friend constexpr difference_type - operator-(const sentinel_t<@\exposid{base-t}@>& x, const @\exposid{iterator}@& y) - requires sized_sentinel_for, iterator_t<@\exposid{base-t}@>>; }; } \end{codeblock} @@ -6307,17 +6307,6 @@ Equivalent to: \tcode{return x.\exposid{current_} == y.\exposid{current_};} \end{itemdescr} -\indexlibrarymember{operator==}{elements_view::iterator}% -\begin{itemdecl} -friend constexpr bool operator==(const @\exposid{iterator}@& x, const sentinel_t<@\exposid{base-t}@>& y); -\end{itemdecl} - -\begin{itemdescr} -\pnum -\effects -Equivalent to: \tcode{return x.\exposid{current_} == y;} -\end{itemdescr} - \indexlibrarymember{operator<}{elements_view::iterator}% \begin{itemdecl} friend constexpr bool operator<(const @\exposid{iterator}@& x, const @\exposid{iterator}@& y) @@ -6426,28 +6415,107 @@ Equivalent to: \tcode{return x.\exposid{current_} - y.\exposid{current_};} \end{itemdescr} -\indexlibrarymember{operator-}{elements_view::iterator}% +\rSec3[range.elements.sentinel]{Class template \tcode{elements_view::\exposid{sentinel}}} + +\indexlibraryglobal{elements_view::sentinel}% +\begin{codeblock} +namespace std::ranges { + template + requires view && @\placeholder{has-tuple-element}@, N> && + @\placeholder{has-tuple-element}@>, N> + template + class elements_view::@\exposid{sentinel}@ { // \expos + private: + using @\exposid{Base}@ = conditional_t; // \expos + sentinel_t<@\exposid{Base}@> @\exposid{end_}@ = sentinel_t<@\exposid{Base}@>(); // \expos + public: + @\exposid{sentinel}@() = default; + constexpr explicit @\exposid{sentinel}@(sentinel_t<@\exposid{Base}@> end); + constexpr @\exposid{sentinel}@(@\exposid{sentinel}@ other) + requires Const && convertible_to, sentinel_t<@\exposid{Base}@>>; + + constexpr sentinel_t<@\exposid{Base}@> base() const; + + friend constexpr bool operator==(const @\exposid{iterator}@& x, const @\exposid{sentinel}@& y); + + friend constexpr range_difference_t<@\exposid{Base}@> + operator-(const @\exposid{iterator}@& x, const @\exposid{sentinel}@& y) + requires sized_sentinel_for, iterator_t<@\exposid{Base}@>>; + + friend constexpr range_difference_t<@\exposid{Base}@> + operator-(const @\exposid{sentinel}@& x, const @\exposid{iterator}@& y) + requires sized_sentinel_for, iterator_t<@\exposid{Base}@>>; + }; +} +\end{codeblock} + +\indexlibraryctor{elements_view::sentinel}% \begin{itemdecl} -friend constexpr difference_type - operator-(const @\exposid{iterator}@& x, const sentinel_t<@\exposid{base-t}@>& y) - requires sized_sentinel_for, iterator_t<@\exposid{base-t}@>>; +constexpr explicit @\exposid{sentinel}@(sentinel_t<@\exposid{Base}@> end); \end{itemdecl} \begin{itemdescr} \pnum \effects -Equivalent to: \tcode{return x.\exposid{current_} - y;} +Initializes \exposid{end_} with \tcode{end}. \end{itemdescr} -\indexlibrarymember{operator-}{elements_view::iterator}% +\indexlibraryctor{elements_view::sentinel}% \begin{itemdecl} -friend constexpr difference_type - operator-(const sentinel_t<@\exposid{base-t}@>& x, const @\exposid{iterator}@& y) - requires sized_sentinel_for, iterator_t<@\exposid{base-t}@>>; +constexpr @\exposid{sentinel}@(@\exposid{sentinel}@ other) + requires Const && convertible_to, sentinel_t<@\exposid{Base}@>>; \end{itemdecl} \begin{itemdescr} \pnum \effects -Equivalent to: \tcode{return -(y - x);} +Initializes \exposid{end_} with \tcode{std::move(other.\exposid{end_})}. +\end{itemdescr} + +\indexlibrarymember{base}{elements_view::sentinel}% +\begin{itemdecl} +constexpr sentinel_t<@\exposid{Base}@> base() const; +\end{itemdecl} + +\begin{itemdescr} +\pnum +\effects +Equivalent to: \tcode{return \exposid{end_};} +\end{itemdescr} + +\indexlibrarymember{operator==}{elements_view::sentinel}% +\begin{itemdecl} +friend constexpr bool operator==(const @\exposid{iterator}@& x, const @\exposid{sentinel}@& y); +\end{itemdecl} + +\begin{itemdescr} +\pnum +\effects +Equivalent to: \tcode{return x.\exposid{current_} == y.\exposid{end_};} +\end{itemdescr} + +\indexlibrarymember{operator-}{elements_view::sentinel}% +\begin{itemdecl} +friend constexpr range_difference_t<@\exposid{Base}@> + operator-(const @\exposid{iterator}@& x, const @\exposid{sentinel}@& y) + requires sized_sentinel_for, iterator_t<@\exposid{Base}@>>; +\end{itemdecl} + +\begin{itemdescr} +\pnum +\effects +Equivalent to: \tcode{return x.\exposid{current_} - y.\exposid{end_};} +\end{itemdescr} + +\indexlibrarymember{operator-}{elements_view::sentinel}% +\begin{itemdecl} +friend constexpr range_difference_t<@\exposid{Base}@> + operator-(const @\exposid{sentinel}@& x, const @\exposid{iterator}@& y) + requires sized_sentinel_for, iterator_t<@\exposid{Base}@>>; +\end{itemdecl} + +\begin{itemdescr} +\pnum +\effects +Equivalent to: \tcode{return x.\exposid{end_} - y.\exposid{current_};} \end{itemdescr}