Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
9d7581a
LWG3662 basic_string::append/assign(NTBS, pos, n) suboptimal
burblebee Apr 8, 2026
581d0cb
LWG3777 Common cartesian_product_view produces an invalid range if th…
burblebee Apr 8, 2026
a50b69c
LWG3797 elements_view insufficiently constrained
burblebee Apr 8, 2026
4fa9e57
LWG3891 LWG 3870 breaks std::expected<cv T, E>
burblebee Apr 8, 2026
13b42a2
LWG4026 Assignment operators of std::expected should propagate trivia…
burblebee Apr 8, 2026
328a4ba
LWG4122 Ill-formed operator<=> can cause hard error when instantiatin…
burblebee Apr 8, 2026
bdf1618
LWG4133 awaitable-receiver's members are potentially throwing
burblebee Apr 8, 2026
0e20a6f
LWG4143 execution::set_value/set_error/set_stopped/start should alway…
burblebee Apr 8, 2026
3660fae
LWG4151 Precondition of inplace_vector::swap
burblebee Apr 8, 2026
e48c085
LWG4223 Deduction guides for maps are mishandling tuples and references
burblebee Apr 8, 2026
a5f6c0a
LWG4314 Missing move in mdspan layout mapping::operator()
burblebee Apr 8, 2026
833d635
LWG4325 std::indirect's operator== still does not support incomplete …
burblebee Apr 8, 2026
0f85741
LWG4339 task's coroutine frame may be released late
burblebee Apr 8, 2026
c17bca7
LWG4347 task's stop source is always created
burblebee Apr 8, 2026
8d7c659
LWG4354 Reconsider weakly_parallel as the default forward_progress_gu…
burblebee Apr 8, 2026
f58eab0
LWG4361 awaitable-receiver::set_value should use Mandates instead of …
burblebee Apr 8, 2026
97afbaf
LWG4379 hive::reserve() needs Throws: element adjusted to match block…
burblebee Apr 9, 2026
a74041f
LWG4476 run_loop should not have a set_error completion
burblebee Apr 9, 2026
02f14fa
LWG4478 meta::has_identifier is not specified for annotations
burblebee Apr 9, 2026
be54f1d
LWG4485 Move specification for task::stop_token_type
burblebee Apr 9, 2026
df6b8a7
LWG4497 std::nullopt_t should be comparable
burblebee Apr 9, 2026
016c5d0
LWG4504 Wording problem in {simple_}counting_scope
burblebee Apr 9, 2026
053c967
LWG4506 source_location is explicitly unspecified if is constexpr or not
burblebee Apr 9, 2026
17eeaae
LWG4532 Imprecise std::polymorphic wording seems to imply slicing
burblebee Apr 9, 2026
b1fe775
LWG4533 not_fn<f> is unimplementable
burblebee Apr 9, 2026
7428f28
LWG4537 Improve define_static_array
burblebee Apr 9, 2026
6592e5d
LWG4540 future-senders returned from spawn_future do not forward stop…
burblebee Apr 9, 2026
6f32a23
LWG4544 Parallel overload of ranges::set_difference should return in_…
burblebee Apr 9, 2026
9fb8e24
LWG4548 Parallel ranges::set_intersection should not do unnecessary work
burblebee Apr 9, 2026
e02c5da
LWG4549 vprint_nonunicode_buffered ignores its stream parameter
burblebee Apr 9, 2026
93ef426
LWG4550 Need new feature test macros for <stdckdint.h> and <stdbit.h>
burblebee Apr 9, 2026
6344104
LWG4552 compare_exchange_weak writes a value on spurious failure, not…
burblebee Apr 9, 2026
9bee954
LWG4553 Wording for FR-025-246 25.7.18.2 Add a reserve_hint function …
burblebee Apr 9, 2026
0dce0d5
LWG4554 Remove undefined behaviour from hive for invalid limits
burblebee Apr 9, 2026
979854d
LWG4555 Remove is_consteval_only
burblebee Apr 9, 2026
d1cc2da
LWG4556 Unclear properties of reflection strings
burblebee Apr 9, 2026
4c8da02
LWG4557 Remove constexpr from owner_less and owner_before
burblebee Apr 9, 2026
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
50 changes: 32 additions & 18 deletions source/algorithms.tex
Original file line number Diff line number Diff line change
Expand Up @@ -3633,6 +3633,8 @@
namespace ranges {
template<class I, class O>
using @\libglobal{set_difference_result}@ = in_out_result<I, O>;
template<class I1, class, I2, class O>
using @\libglobal{set_difference_truncated_result}@ = in_in_out_result<I1, I2, O>;

template<@\libconcept{input_iterator}@ I1, @\libconcept{sentinel_for}@<I1> S1, @\libconcept{input_iterator}@ I2, @\libconcept{sentinel_for}@<I2> S2,
@\libconcept{weakly_incrementable}@ O, class Comp = ranges::less,
Expand All @@ -3653,15 +3655,16 @@
@\libconcept{random_access_iterator}@ O, @\libconcept{sized_sentinel_for}@<O> OutS, class Comp = ranges::less,
class Proj1 = identity, class Proj2 = identity>
requires @\libconcept{mergeable}@<I1, I2, O, Comp, Proj1, Proj2>
set_difference_result<I1, O>
set_difference_truncated_result<I1, I2, O>
set_difference(Ep&& exec, I1 first1, S1 last1, I2 first2, S2 last2,
O result, OutS result_last, Comp comp = {}, Proj1 proj1 = {},
Proj2 proj2 = {}); // freestanding-deleted
template<@\exposconcept{execution-policy}@ Ep, @\exposconcept{sized-random-access-range}@ R1, @\exposconcept{sized-random-access-range}@ R2,
@\exposconcept{sized-random-access-range}@ OutR, class Comp = ranges::less,
class Proj1 = identity, class Proj2 = identity>
requires @\libconcept{mergeable}@<iterator_t<R1>, iterator_t<R2>, iterator_t<OutR>, Comp, Proj1, Proj2>
set_difference_result<borrowed_iterator_t<R1>, borrowed_iterator_t<OutR>>
set_difference_truncated_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>,
borrowed_iterator_t<OutR>>
set_difference(Ep&& exec, R1&& r1, R2&& r2, OutR&& result_r, Comp comp = {},
Proj1 proj1 = {}, Proj2 proj2 = {}); // freestanding-deleted
}
Expand Down Expand Up @@ -10584,9 +10587,9 @@
If, of those elements, $k$ elements from the first range
are copied to the output range,
then the first $k$ elements from the second range
are considered \term{skipped}.
If $N < M$, a non-copied element is also considered skipped
if it compares less than the $(N + 1)^\text{th}$ element
are considered \defn{skipped}.
A non-copied element is also considered skipped
if it compares less than the $\min(M, N + 1)^\text{th}$ element
of the sorted intersection.
Copies the first $N$ elements of the sorted intersection
to the range \range{result}{result + $N$}.
Expand All @@ -10599,11 +10602,10 @@
for the overloads in namespace \tcode{std}.
\item
\tcode{\{last1, last2, result + $N$\}}
for the overloads in namespace \tcode{ranges},
if $N$ is equal to $M$.
for the non-parallel algorithm overloads in namespace \tcode{ranges}.
\item
Otherwise, \tcode{\{first1 + $A$, first2 + $B$, result_last\}}
for the overloads in namespace \tcode{ranges},
Otherwise, \tcode{\{first1 + $A$, first2 + $B$, result + $N$\}}
for the parallel algorithm overloads in namespace \tcode{ranges},
where $A$ and $B$ are the numbers of copied or skipped elements
in \range{first1}{last1} and \range{first2}{last2}, respectively.
\end{itemize}
Expand Down Expand Up @@ -10669,15 +10671,16 @@
@\libconcept{random_access_iterator}@ O, @\libconcept{sized_sentinel_for}@<O> OutS, class Comp = ranges::less,
class Proj1 = identity, class Proj2 = identity>
requires @\libconcept{mergeable}@<I1, I2, O, Comp, Proj1, Proj2>
ranges::set_difference_result<I1, O>
ranges::set_difference_truncated_result<I1, I2, O>
ranges::set_difference(Ep&& exec, I1 first1, S1 last1,
I2 first2, S2 last2, O result, OutS result_last,
Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {});
template<@\exposconcept{execution-policy}@ Ep, @\exposconcept{sized-random-access-range}@ R1, @\exposconcept{sized-random-access-range}@ R2,
@\exposconcept{sized-random-access-range}@ OutR, class Comp = ranges::less,
class Proj1 = identity, class Proj2 = identity>
requires @\libconcept{mergeable}@<iterator_t<R1>, iterator_t<R2>, iterator_t<OutR>, Comp, Proj1, Proj2>
ranges::set_difference_result<borrowed_iterator_t<R1>, borrowed_iterator_t<OutR>>
ranges::set_difference_truncated_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>,
borrowed_iterator_t<OutR>>
ranges::set_difference(Ep&& exec, R1&& r1, R2&& r2, OutR&& result_r, Comp comp = {},
Proj1 proj1 = {}, Proj2 proj2 = {});
\end{itemdecl}
Expand Down Expand Up @@ -10716,6 +10719,12 @@
that are equivalent to them,
the last $\max(m - n, 0)$ elements from \range{first1}{last1}
are included in the sorted difference, in order.
Of those equivalent elements,
the first $\min(m, n)$ elements in both ranges
are considered \defn{skipped}.
An element from the second range is also considered skipped
if it compares less than the $\min(N + 1, M)^\text{th}$ element
of the sorted difference.
Copies the first $N$ elements of the sorted difference
to the range \range{result}{result + $N$}.

Expand All @@ -10727,14 +10736,19 @@
for the overloads in namespace \tcode{std}.
\item
\tcode{\{last1, result + $N$\}}
for the overloads in namespace \tcode{ranges},
if $N$ is equal to $M$.
for the non-parallel overloads in namespace \tcode{ranges}.
\item
Otherwise, \tcode{\{j1, result_last\}}
for the overloads in namespace \tcode{ranges},
where the iterator \tcode{j1}
points to the position of the element in \range{first1}{last1}
corresponding to the $(N + 1)^\text{th}$ element of the sorted difference.
For the parallel algorithm overloads in namespace \tcode{ranges}:
\begin{itemize}
\item
\tcode{\{last1, first2 + $B$, result + $N$\}},
if $N$ is equal to $M$,
where $B$ is the number of skipped elements in \range{first2}{last2}.
\item
Otherwise, \tcode{\{first1 + $A$, first2 + $B$, result_last\}},
where $A$ and $B$ are the numbers of copied or skipped elements
in \range{first1}{last1} and \range{first2}{last2}, respectively.
\end{itemize}
\end{itemize}

\pnum
Expand Down
109 changes: 83 additions & 26 deletions source/containers.tex
Original file line number Diff line number Diff line change
Expand Up @@ -7980,9 +7980,15 @@
The maximum hard limit shall be no larger than
\tcode{std::allocator_traits<Allocator>::max_size()}.
\item
If user-specified limits are not within hard limits, or
If user-specified limits passed to
a \tcode{hive} constructor or \tcode{reshape}
are not within hard limits, or
if the specified minimum limit is greater than the specified maximum limit,
the behavior is undefined.
the behavior is erroneous and the effects are
\impldef{effects of invalid \tcode{hive} limits}.
\begin{tailnote}
This condition can be checked using \tcode{is_within_hard_limits}.
\end{tailnote}
\item
An element block is said to be \defnx{within the bounds}{element block!bounds}
of a pair of minimum/maximum limits
Expand Down Expand Up @@ -8089,6 +8095,7 @@
constexpr hive_limits block_capacity_limits() const noexcept;
static constexpr hive_limits block_capacity_default_limits() noexcept;
static constexpr hive_limits block_capacity_hard_limits() noexcept;
static constexpr bool is_within_hard_limits(hive_limits) noexcept;
void reshape(hive_limits block_limits);

// \ref{hive.modifiers}, modifiers
Expand Down Expand Up @@ -8478,7 +8485,9 @@

\pnum
\throws
\tcode{length_error} if \tcode{n > max_size()},
\tcode{length_error} if
satisfying the postcondition
would cause \tcode{capacity()} to exceed \tcode{max_size()},
as well as any exceptions thrown by the allocator.

\pnum
Expand Down Expand Up @@ -8604,6 +8613,20 @@
Constant.
\end{itemdescr}

\indexlibrarymember{is_within_hard_limits}{hive}%
\begin{itemdecl}
static constexpr bool is_within_hard_limits(hive_limits lim) noexcept;
\end{itemdecl}

\begin{itemdescr}
\pnum
Let \tcode{hl} be \tcode{block_capacity_hard_limits()}.

\pnum
\returns
\tcode{hl.min <= lim.min \&\& lim.min <= lim.max \&\& lim.max <= hl.max}.
\end{itemdescr}

\indexlibrarymember{reshape}{hive}%
\begin{itemdecl}
void reshape(hive_limits block_limits);
Expand Down Expand Up @@ -10999,8 +11022,13 @@

friend constexpr bool operator==(const inplace_vector& x,
const inplace_vector& y);
friend constexpr @\exposid{synth-three-way-result}@<T>
operator<=>(const inplace_vector& x, const inplace_vector& y);
friend constexpr auto
operator<=>(const inplace_vector& x, const inplace_vector& y)
requires requires (const T t) { @\exposid{synth-three-way}@(t, t); }
{
return lexicographical_compare_three_way(x.begin(), x.end(), y.begin(), y.end(),
@\exposid{synth-three-way}@);
}
friend constexpr void swap(inplace_vector& x, inplace_vector& y)
noexcept(N == 0 || (is_nothrow_swappable_v<T> &&
is_nothrow_move_constructible_v<T>))
Expand Down Expand Up @@ -11418,6 +11446,26 @@
equal to the number of elements after the erased elements.
\end{itemdescr}

\indexlibrarymember{swap}{inplace_vector}%
\begin{itemdecl}
constexpr void swap(inplace_vector& x) noexcept(
N == 0 || (is_nothrow_swappable_v<T> && is_nothrow_move_constructible_v<T>));
\end{itemdecl}

\begin{itemdescr}
\pnum
\expects
\tcode{T} meets the \oldconcept{MoveConstructible} requirements.
Let $M$ be \tcode{min(size(), x.size())}.
For each non-negative integer $n < M$,
\tcode{(*this)[$n$]} is swappable
with \tcode{x[$n$]}\iref{swappable.requirements}.

\pnum
\effects
Exchanges the contents of \tcode{*this} and \tcode{x}.
\end{itemdescr}

\rSec3[inplace.vector.erasure]{Erasure}

\indexlibrarymember{erase}{inplace_vector}%
Expand Down Expand Up @@ -11472,24 +11520,25 @@
template<class InputIterator>
using @\placeholder{iter-value-type}@ = iterator_traits<InputIterator>::value_type; // \expos
template<class InputIterator>
using @\placeholder{iter-key-type}@ = remove_const_t<
using @\placeholder{iter-key-type}@ = remove_cvref_t<
tuple_element_t<0, @\exposid{iter-value-type}@<InputIterator>>>; // \expos
template<class InputIterator>
using @\placeholder{iter-mapped-type}@ =
tuple_element_t<1, @\exposid{iter-value-type}@<InputIterator>>; // \expos
using @\placeholder{iter-mapped-type}@ = remove_cvref_t<
tuple_element_t<1, @\exposid{iter-value-type}@<InputIterator>>>; // \expos
template<class InputIterator>
using @\placeholder{iter-to-alloc-type}@ = pair<
const tuple_element_t<0, @\exposid{iter-value-type}@<InputIterator>>,
tuple_element_t<1, @\exposid{iter-value-type}@<InputIterator>>>; // \expos
const @\exposid{iter-key-type}@<InputIterator>,
@\exposid{iter-mapped-type}@<InputIterator>>; // \expos
template<ranges::@\libconcept{input_range}@ Range>
using @\exposid{range-key-type}@ =
remove_const_t<typename ranges::range_value_t<Range>::first_type>; // \expos
remove_cvref_t<tuple_element_t<0, ranges::range_value_t<Range>>>; // \expos
template<ranges::@\libconcept{input_range}@ Range>
using @\exposid{range-mapped-type}@ = ranges::range_value_t<Range>::second_type; // \expos
using @\exposid{range-mapped-type}@ =
remove_cvref_t<tuple_element_t<1, ranges::range_value_t<Range>>>; // \expos
template<ranges::@\libconcept{input_range}@ Range>
using @\exposid{range-to-alloc-type}@ =
pair<const typename ranges::range_value_t<Range>::first_type,
typename ranges::range_value_t<Range>::second_type>; // \expos
pair<const @\exposid{range-key-type}@<Range>,
Comment thread
tkoeppe marked this conversation as resolved.
@\exposid{range-mapped-type}@<Range>>; // \expos
\end{codeblock}

\rSec2[associative.map.syn]{Header \tcode{<map>} synopsis}
Expand Down Expand Up @@ -21486,7 +21535,7 @@
If \tcode{remove_cvref_t<OtherIndexType>} is an integral type other than \tcode{bool},
then equivalent to \tcode{return i;},
\item
otherwise, equivalent to \tcode{return static_cast<index_type>(i);}.
otherwise, equivalent to \tcode{return static_cast<index_type>(std::forward<OtherIndexType>(\brk{}i));}.
\end{itemize}
\begin{note}
This function will always return an integral type other than \tcode{bool}.
Expand Down Expand Up @@ -22433,7 +22482,7 @@
is \tcode{true}.
Equivalent to:
\begin{codeblock}
return ((static_cast<index_type>(i) * stride(P)) + ... + 0);
return ((static_cast<index_type>(std::move(i)) * stride(P)) + ... + 0);
\end{codeblock}
\end{itemdescr}

Expand Down Expand Up @@ -22766,7 +22815,7 @@
\end{codeblock}
is \tcode{true}. Equivalent to:
\begin{codeblock}
return ((static_cast<index_type>(i) * stride(P)) + ... + 0);
return ((static_cast<index_type>(std::move(i)) * stride(P)) + ... + 0);
\end{codeblock}
\end{itemdescr}

Expand Down Expand Up @@ -23130,7 +23179,7 @@
is \tcode{true}.
Equivalent to:
\begin{codeblock}
return ((static_cast<index_type>(i) * stride(P)) + ... + 0);
return ((static_cast<index_type>(std::move(i)) * stride(P)) + ... + 0);
\end{codeblock}
\end{itemdescr}

Expand Down Expand Up @@ -23445,10 +23494,14 @@
\indexlibraryctor{layout_left_padded::mapping}%
\begin{itemdecl}
template<class OtherIndexType>
constexpr mapping(const extents_type& ext, OtherIndexType pad);
constexpr mapping(const extents_type& ext, OtherIndexType padding);
\end{itemdecl}

\begin{itemdescr}
\pnum
Let \tcode{pad} be
\tcode{extents_type::\exposid{index-cast}(std::move(padding))}.

\pnum
\constraints
\begin{itemize}
Expand All @@ -23464,7 +23517,7 @@
\item
\tcode{pad} is representable as a value of type \tcode{index_type}.
\item
\tcode{extents_type::\exposid{index-cast}(pad)} is greater than zero.
\tcode{pad} is greater than zero.
\item
If \exposid{rank_} is greater than one,
then \tcode{\exposid{LEAST-MULTIPLE-AT-LEAST}(pad, ext.extent(0))}
Expand All @@ -23478,7 +23531,7 @@
is representable as a value of type \tcode{index_type}.
\item
If \tcode{padding_value} is not equal to \tcode{dynamic_extent},
\tcode{padding_value} equals \tcode{extents_type::\exposid{in\-dex-cast}(pad)}.
\tcode{padding_value} equals \tcode{pad}.
\end{itemize}

\pnum
Expand Down Expand Up @@ -23755,7 +23808,7 @@

\pnum
\returns
\tcode{((static_cast<index_type>(idxs) * stride(P_rank)) + ... + 0)}.
\tcode{((static_cast<index_type>(std::move(idxs)) * stride(P_rank)) + ... + 0)}.
\end{itemdescr}

\begin{itemdecl}
Expand Down Expand Up @@ -24082,10 +24135,14 @@
\indexlibraryctor{layout_right_padded::mapping}%
\begin{itemdecl}
template<class OtherIndexType>
constexpr mapping(const extents_type& ext, OtherIndexType pad);
constexpr mapping(const extents_type& ext, OtherIndexType padding);
\end{itemdecl}

\begin{itemdescr}
\pnum
Let \tcode{pad} be
\tcode{extents_type::\exposid{index-cast}(std::move(padding))}.

\pnum
\constraints
\begin{itemize}
Expand All @@ -24101,7 +24158,7 @@
\item
\tcode{pad} is representable as a value of type \tcode{index_type}.
\item
\tcode{extents_type::\exposid{index-cast}(pad)} is greater than zero.
\tcode{pad} is greater than zero.
\item
If \exposid{rank_} is greater than one,
then \tcode{\exposid{LEAST-MULTIPLE-AT-LEAST}(pad, ext.extent(\exposid{rank_} - 1))}
Expand All @@ -24115,7 +24172,7 @@
is representable as a value of type \tcode{index_type}.
\item
If \tcode{padding_value} is not equal to \tcode{dynamic_extent},
\tcode{padding_value} equals \tcode{extents_type::\linebreak \exposid{index-cast}(pad)}.
\tcode{padding_value} equals \tcode{pad}.
\end{itemize}

\pnum
Expand Down Expand Up @@ -24390,7 +24447,7 @@

\pnum
\returns
\tcode{((static_cast<index_type>(idxs) * stride(P_rank)) + ... + 0)}.
\tcode{((static_cast<index_type>(std::move(idxs)) * stride(P_rank)) + ... + 0)}.
\end{itemdescr}

\indexlibrarymember{layout_right_padded::mapping}{is_always_exhaustive}%
Expand Down
Loading
Loading