Skip to content

LWG Poll 1: P2315R0 LWG Tentatively Ready issues #4523

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Mar 8, 2021
16 changes: 4 additions & 12 deletions source/iterators.tex
Original file line number Diff line number Diff line change
Expand Up @@ -4096,7 +4096,7 @@
template<class U> constexpr move_iterator(const move_iterator<U>& u);
template<class U> constexpr move_iterator& operator=(const move_iterator<U>& u);

constexpr iterator_type base() const &;
constexpr const iterator_type& base() const &;
constexpr iterator_type base() &&;
constexpr reference operator*() const;

Expand Down Expand Up @@ -4226,18 +4226,10 @@

\indexlibrarymember{base}{move_iterator}%
\begin{itemdecl}
constexpr Iterator base() const &;
constexpr const Iterator& base() const &;
\end{itemdecl}

\begin{itemdescr}
\pnum
\constraints
\tcode{Iterator} satisfies \libconcept{copy_constructible}.

\pnum
\expects
\tcode{Iterator} models \libconcept{copy_constructible}.

\pnum
\returns
\tcode{current}.
Expand Down Expand Up @@ -5170,7 +5162,7 @@
requires @\libconcept{assignable_from}@<I&, const I2&>
constexpr counted_iterator& operator=(const counted_iterator<I2>& x);

constexpr I base() const & requires copy_constructible<I>;
constexpr const I& base() const &;
constexpr I base() &&;
constexpr iter_difference_t<I> count() const noexcept;
constexpr decltype(auto) operator*();
Expand Down Expand Up @@ -5297,7 +5289,7 @@

\indexlibrarymember{base}{counted_iterator}%
\begin{itemdecl}
constexpr I base() const & requires copy_constructible<I>;
constexpr const I& base() const &;
\end{itemdecl}

\begin{itemdescr}
Expand Down
116 changes: 76 additions & 40 deletions source/ranges.tex
Original file line number Diff line number Diff line change
Expand Up @@ -1765,22 +1765,21 @@
\pnum
\effects
Equivalent to:
\begin{itemize}
\item If \exposid{StoreSize} is \tcode{true},
\begin{codeblock}
if constexpr (bidirectional_iterator<I>) {
if (n < 0) {
ranges::advance(@\exposid{begin_}@, n);
if constexpr (@\exposid{StoreSize}@)
@\exposid{size_}@ += @\placeholdernc{to-unsigned-like}@(-n);
return *this;
}
}

auto d = n - ranges::advance(@\exposid{begin_}@, n, @\exposid{end_}@);
if (d >= 0)
if constexpr (@\exposid{StoreSize}@)
@\exposid{size_}@ -= @\placeholdernc{to-unsigned-like}@(d);
else
@\exposid{size_}@ += @\placeholdernc{to-unsigned-like}@(-d);
return *this;
\end{codeblock}
\item Otherwise,
\begin{codeblock}
ranges::advance(@\exposid{begin_}@, n, @\exposid{end_}@);
return *this;
\end{codeblock}
\end{itemize}
\end{itemdescr}

\indexlibrarymember{get}{subrange}%
Expand Down Expand Up @@ -4914,6 +4913,10 @@
\end{itemdecl}

\begin{itemdescr}
\pnum
\expects
\tcode{\exposid{pred_}.has_value()} is \tcode{true}.

\pnum
\returns
\tcode{ranges::find_if_not(\exposid{base_}, cref(*\exposid{pred_}))}.
Expand Down Expand Up @@ -5053,16 +5056,17 @@
template<bool Const>
struct join_view<V>::@\exposid{iterator}@ {
private:
using @\exposid{Parent}@ = @\exposid{maybe-const}@<Const, join_view>; // \expos
using @\exposid{Base}@ = @\exposid{maybe-const}@<Const, V>; // \expos
using @\exposid{Parent}@ = @\exposid{maybe-const}@<Const, join_view>; // \expos
using @\exposid{Base}@ = @\exposid{maybe-const}@<Const, V>; // \expos
using @\exposid{OuterIter}@ = iterator_t<@\exposid{Base}@>; // \expos
using @\exposid{InnerIter}@ = iterator_t<range_reference_t<@\exposid{Base}@>>; // \expos

static constexpr bool @\exposid{ref-is-glvalue}@ = // \expos
is_reference_v<range_reference_t<@\exposid{Base}@>>;

iterator_t<@\exposid{Base}@> @\exposid{outer_}@ = iterator_t<@\exposid{Base}@>(); // \expos
iterator_t<range_reference_t<@\exposid{Base}@>> @\exposid{inner_}@ = // \expos
iterator_t<range_reference_t<@\exposid{Base}@>>();
@\exposid{Parent}@* @\exposid{parent_}@ = nullptr; // \expos
@\exposid{OuterIter}@ @\exposid{outer_}@ = @\exposid{OuterIter}@(); // \expos
@\exposid{InnerIter}@ @\exposid{inner_}@ = @\exposid{InnerIter}@(); // \expos
@\exposid{Parent}@* @\exposidnc{parent_}@ = nullptr; // \expos

constexpr void @\exposid{satisfy}@(); // \expos
public:
Expand All @@ -5072,17 +5076,16 @@
using difference_type = @\seebelow@;

@\exposid{iterator}@() = default;
constexpr @\exposid{iterator}@(@\exposid{Parent}@& parent, iterator_t<@\exposid{Base}@> outer);
constexpr @\exposid{iterator}@(@\exposid{Parent}@& parent, @\exposid{OuterIter}@ outer);
constexpr @\exposid{iterator}@(@\exposid{iterator}@<!Const> i)
requires Const &&
@\libconcept{convertible_to}@<iterator_t<V>, iterator_t<@\exposid{Base}@>> &&
@\libconcept{convertible_to}@<iterator_t<@\exposid{InnerRng}@>,
iterator_t<range_reference_t<@\exposid{Base}@>>>;
@\libconcept{convertible_to}@<iterator_t<V>, @\exposid{OuterIter}@> &&
@\libconcept{convertible_to}@<iterator_t<@\exposid{InnerRng}@>, @\exposid{InnerIter}@>;

constexpr decltype(auto) operator*() const { return *@\exposid{inner_}@; }

constexpr iterator_t<@\exposid{Base}@> operator->() const
requires @\exposconcept{has-arrow}@<iterator_t<@\exposid{Base}@>> && @\libconcept{copyable}@<iterator_t<@\exposid{Base}@>>;
constexpr @\exposid{InnerIter}@ operator->() const
requires @\exposconcept{has-arrow}@<@\exposid{InnerIter}@> && @\libconcept{copyable}@<@\exposid{InnerIter}@>;

constexpr @\exposid{iterator}@& operator++();
constexpr void operator++(int);
Expand Down Expand Up @@ -5185,13 +5188,13 @@
return;
}
if constexpr (@\exposid{ref-is-glvalue}@)
@\exposid{inner_}@ = iterator_t<range_reference_t<@\exposid{Base}@>>();
@\exposid{inner_}@ = @\exposid{InnerIter}@();
\end{codeblock}
\end{itemdescr}

\indexlibraryctor{join_view::iterator}%
\begin{itemdecl}
constexpr @\exposid{iterator}@(@\exposid{Parent}@& parent, iterator_t<@\exposid{Base}@> outer);
constexpr @\exposid{iterator}@(@\exposid{Parent}@& parent, @\exposid{OuterIter}@ outer);
\end{itemdecl}

\begin{itemdescr}
Expand All @@ -5205,9 +5208,8 @@
\begin{itemdecl}
constexpr @\exposid{iterator}@(@\exposid{iterator}@<!Const> i)
requires Const &&
@\libconcept{convertible_to}@<iterator_t<V>, iterator_t<@\exposid{Base}@>> &&
@\libconcept{convertible_to}@<iterator_t<@\exposid{InnerRng}@>,
iterator_t<range_reference_t<@\exposid{Base}@>>>;
@\libconcept{convertible_to}@<iterator_t<V>, @\exposid{OuterIter}@> &&
@\libconcept{convertible_to}@<iterator_t<@\exposid{InnerRng}@>, @\exposid{InnerIter}@>;
\end{itemdecl}

\begin{itemdescr}
Expand All @@ -5220,8 +5222,8 @@

\indexlibrarymember{operator->}{join_view::iterator}%
\begin{itemdecl}
constexpr iterator_t<@\exposid{Base}@> operator->() const
requires @\exposconcept{has-arrow}@<iterator_t<@\exposid{Base}@>> && copyable<iterator_t<@\exposid{Base}@>>;
constexpr @\exposid{InnerIter}@ operator->() const
requires @\exposconcept{has-arrow}@<@\exposid{InnerIter}@> && @\libconcept{copyable}@<@\exposid{InnerIter}@>;
\end{itemdecl}

\begin{itemdescr}
Expand Down Expand Up @@ -5672,11 +5674,17 @@
if (@\placeholder{current}@ == end) return *this;
const auto [pbegin, pend] = subrange{@\exposid{parent_}@->@\exposid{pattern_}@};
if (pbegin == pend) ++@\placeholder{current}@;
else if constexpr (@\exposconcept{tiny-range}@<Pattern>) {
@\placeholder{current}@ = ranges::find(std::move(@\placeholder{current}@), end, *pbegin);
if (@\placeholder{current}@ != end) {
++@\placeholder{current}@;
}
}
else {
do {
auto [b, p] = ranges::mismatch(std::move(@\placeholder{current}@), end, pbegin, pend);
@\placeholder{current}@ = std::move(b);
auto [b, p] = ranges::mismatch(@\placeholder{current}@, end, pbegin, pend);
if (p == pend) {
@\placeholder{current}@ = b;
break; // The pattern matched; skip it
}
} while (++@\placeholder{current}@ != end);
Expand Down Expand Up @@ -6308,10 +6316,14 @@
{ get<N>(t) } -> convertible_to<const tuple_element_t<N, T>&>;
};

template<class T, size_t N>
concept @\defexposconcept{returnable-element}@ = // \expos
is_reference_v<T> || move_constructible<tuple_element_t<N, T>>;

template<@\libconcept{input_range}@ V, size_t N>
requires @\libconcept{view}@<V> && @\exposconcept{has-tuple-element}@<range_value_t<V>, N> &&
@\exposconcept{has-tuple-element}@<remove_reference_t<range_reference_t<V>>, N>
@\exposconcept{has-tuple-element}@<remove_reference_t<range_reference_t<V>>, N> &&
@\exposconcept{returnable-element}@<range_reference_t<V>, N>
class elements_view : public view_interface<elements_view<V, N>> {
public:
elements_view() = default;
Expand Down Expand Up @@ -6372,12 +6384,16 @@
namespace std::ranges {
template<@\libconcept{input_range}@ V, size_t N>
requires @\libconcept{view}@<V> && @\exposconcept{has-tuple-element}@<range_value_t<V>, N> &&
@\exposconcept{has-tuple-element}@<remove_reference_t<range_reference_t<V>>, N>
@\exposconcept{has-tuple-element}@<remove_reference_t<range_reference_t<V>>, N> &&
@\exposconcept{returnable-element}@<range_reference_t<V>, N>
template<bool Const>
class elements_view<V, N>::@\exposid{iterator}@ { // \expos
using @\exposid{Base}@ = @\exposid{maybe-const}@<Const, V>; // \expos

iterator_t<@\exposid{Base}@> @\exposid{current_}@ = iterator_t<@\exposid{Base}@>();
iterator_t<@\exposid{Base}@> @\exposid{current_}@ = iterator_t<@\exposid{Base}@>(); // \expos
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

4e22857 should've been a "fixup:" commit, I think.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oops, yes, it should have been. @tkoeppe can extract it when he merges if he cares enough (we used to be a lot more lax about fly-by fixes like this)


static constexpr decltype(auto) @\exposid{get-element}@(const iterator_t<@\exposid{Base}@>& i); // \expos

public:
using iterator_category = typename iterator_traits<iterator_t<@\exposid{Base}@>>::iterator_category;
using value_type = remove_cvref_t<tuple_element_t<N, range_value_t<@\exposid{Base}@>>>;
Expand All @@ -6393,10 +6409,10 @@
constexpr iterator_t<@\exposid{Base}@> base() &&;

constexpr decltype(auto) operator*() const
{ return get<N>(*@\exposid{current_}@); }
{ return @\exposid{get-element}@(@\exposid{current_}@); }

constexpr @\exposid{iterator}@& operator++();
constexpr void operator++(int) requires (!@\libconcept{forward_range}@<@\exposid{Base}@>);
constexpr void operator++(int);
constexpr @\exposid{iterator}@ operator++(int) requires @\libconcept{forward_range}@<@\exposid{Base}@>;

constexpr @\exposid{iterator}@& operator--() requires @\libconcept{bidirectional_range}@<@\exposid{Base}@>;
Expand All @@ -6409,7 +6425,7 @@

constexpr decltype(auto) operator[](difference_type n) const
requires @\libconcept{random_access_range}@<@\exposid{Base}@>
{ return get<N>(*(@\exposid{current_}@ + n)); }
{ return @\exposid{get-element}@(@\exposid{current_}@ + n); }

friend constexpr bool operator==(const @\exposid{iterator}@& x, const @\exposid{iterator}@& y)
requires @\libconcept{equality_comparable}@<iterator_t<@\exposid{Base}@>>;
Expand Down Expand Up @@ -6437,6 +6453,25 @@
}
\end{codeblock}

\indexlibrarymember{\exposid{get-element}}{elements_view::iterator}%
\begin{itemdecl}
static constexpr decltype(auto) @\exposid{get-element}@(const iterator_t<@\exposid{Base}@>& i); // \expos
\end{itemdecl}

\begin{itemdescr}
\pnum
\effects
Equivalent to:
\begin{codeblock}
if constexpr (is_reference_v<range_reference_t<@\exposid{Base}@>>) {
return get<N>(*i);
} else {
using E = remove_cv_t<tuple_element_t<N, range_reference_t<@\exposid{Base}@>>>;
return static_cast<E>(get<N>(*i));
}
\end{codeblock}
\end{itemdescr}

\indexlibraryctor{elements_view::iterator}%
\begin{itemdecl}
constexpr explicit @\exposid{iterator}@(iterator_t<@\exposid{Base}@> current);
Expand Down Expand Up @@ -6500,7 +6535,7 @@

\indexlibrarymember{operator++}{elements_view::iterator}%
\begin{itemdecl}
constexpr void operator++(int) requires (!@\libconcept{forward_range}@<@\exposid{Base}@>);
constexpr void operator++(int);
\end{itemdecl}

\begin{itemdescr}
Expand Down Expand Up @@ -6715,7 +6750,8 @@
namespace std::ranges {
template<@\libconcept{input_range}@ V, size_t N>
requires @\libconcept{view}@<V> && @\placeholder{has-tuple-element}@<range_value_t<V>, N> &&
@\placeholder{has-tuple-element}@<remove_reference_t<range_reference_t<V>>, N>
@\placeholder{has-tuple-element}@<remove_reference_t<range_reference_t<V>>, N> &&
@\exposconcept{returnable-element}@<range_reference_t<V>, N>
template<bool Const>
class elements_view<V, N>::@\exposid{sentinel}@ { // \expos
private:
Expand Down
4 changes: 2 additions & 2 deletions source/support.tex
Original file line number Diff line number Diff line change
Expand Up @@ -3020,8 +3020,8 @@
\remarks
An invocation of this function
may be used in a core constant expression
whenever the value of its argument
may be used in a core constant expression.
if and only if the (converted) value of its argument
may be used in place of the function invocation.
A byte of storage \placeholder{b} is
reachable through a pointer value
that points to an object \placeholder{Y}
Expand Down