Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
134 changes: 101 additions & 33 deletions source/ranges.tex
Original file line number Diff line number Diff line change
Expand Up @@ -6036,11 +6036,17 @@
constexpr auto begin() const requires @\placeholder{simple-view}@<V>
{ return @\exposid{iterator}@<true>(ranges::begin(@\exposid{base_}@)); }

constexpr auto end() requires (!@\placeholder{simple-view}@<V>)
{ return ranges::end(@\exposid{base_}@); }
constexpr auto end()
{ return @\exposid{sentinel}@<false>{ranges::end(@\exposid{base_}@)}; }

constexpr auto end() const requires @\placeholder{simple-view}@<V>
{ return ranges::end(@\exposid{base_}@); }
constexpr auto end() requires common_range<V>
{ return @\exposid{iterator}@<false>{ranges::end(@\exposid{base_}@)}; }

constexpr auto end() const requires range<const V>
{ return @\exposid{sentinel}@<true>{ranges::end(@\exposid{base_}@)}; }

constexpr auto end() const requires common_range<const V>
{ return @\exposid{iterator}@<true>{ranges::end(@\exposid{base_}@)}; }

constexpr auto size() requires sized_range<V>
{ return ranges::size(@\exposid{base_}@); }
Expand All @@ -6050,6 +6056,8 @@

private:
template<bool> struct @\exposid{iterator}@; // \expos
// \ref{range.elements.sentinel}, class template \tcode{elements_view::\exposid{sentinel}}
template<bool> struct @\exposid{sentinel}@; // \expos
V @\exposid{base_}@ = V(); // \expos
};
}
Expand Down Expand Up @@ -6112,7 +6120,6 @@

friend constexpr bool operator==(const @\exposid{iterator}@& x, const @\exposid{iterator}@& y)
requires equality_comparable<iterator_t<@\exposid{base-t}@>>;
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}@>;
Expand All @@ -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}@<Const>& x, const sentinel_t<@\exposid{base-t}@>& y)
requires sized_sentinel_for<sentinel_t<@\exposid{base-t}@>, iterator_t<@\exposid{base-t}@>>;
friend constexpr difference_type
operator-(const sentinel_t<@\exposid{base-t}@>& x, const @\exposid{iterator}@<Const>& y)
requires sized_sentinel_for<sentinel_t<@\exposid{base-t}@>, iterator_t<@\exposid{base-t}@>>;
};
}
\end{codeblock}
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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<input_range V, size_t N>
requires view<V> && @\placeholder{has-tuple-element}@<range_value_t<V>, N> &&
@\placeholder{has-tuple-element}@<remove_reference_t<range_reference_t<V>>, N>
template<bool Const>
class elements_view<V, N>::@\exposid{sentinel}@ { // \expos
private:
using @\exposid{Base}@ = conditional_t<Const, const V, V>; // \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}@<!Const> other)
requires Const && convertible_to<sentinel_t<V>, sentinel_t<@\exposid{Base}@>>;

constexpr sentinel_t<@\exposid{Base}@> base() const;

friend constexpr bool operator==(const @\exposid{iterator}@<Const>& x, const @\exposid{sentinel}@& y);

friend constexpr range_difference_t<@\exposid{Base}@>
operator-(const @\exposid{iterator}@<Const>& x, const @\exposid{sentinel}@& y)
requires sized_sentinel_for<sentinel_t<@\exposid{Base}@>, iterator_t<@\exposid{Base}@>>;

friend constexpr range_difference_t<@\exposid{Base}@>
operator-(const @\exposid{sentinel}@& x, const @\exposid{iterator}@<Const>& y)
requires sized_sentinel_for<sentinel_t<@\exposid{Base}@>, iterator_t<@\exposid{Base}@>>;
};
}
\end{codeblock}

\indexlibraryctor{elements_view::sentinel}%
\begin{itemdecl}
friend constexpr difference_type
operator-(const @\exposid{iterator}@<Const>& x, const sentinel_t<@\exposid{base-t}@>& y)
requires sized_sentinel_for<sentinel_t<@\exposid{base-t}@>, 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}@<Const>& y)
requires sized_sentinel_for<sentinel_t<@\exposid{base-t}@>, iterator_t<@\exposid{base-t}@>>;
constexpr @\exposid{sentinel}@(@\exposid{sentinel}@<!Const> other)
requires Const && convertible_to<sentinel_t<V>, 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}@<Const>& 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}@<Const>& x, const @\exposid{sentinel}@& y)
requires sized_sentinel_for<sentinel_t<@\exposid{Base}@>, 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}@<Const>& y)
requires sized_sentinel_for<sentinel_t<@\exposid{Base}@>, iterator_t<@\exposid{Base}@>>;
\end{itemdecl}

\begin{itemdescr}
\pnum
\effects
Equivalent to: \tcode{return x.\exposid{end_} - y.\exposid{current_};}
\end{itemdescr}