Skip to content

Commit 3e04431

Browse files
authored
Merge 2023-02 LWG Motion 8
P2609R3 Relaxing Ranges Just A Smidge
2 parents 97bd5a6 + 7119853 commit 3e04431

File tree

2 files changed

+34
-16
lines changed

2 files changed

+34
-16
lines changed

source/iterators.tex

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,12 @@
8484
template<class In>
8585
concept indirectly_readable = @\seebelow@; // freestanding
8686

87+
template<@\libconcept{indirectly_readable}@ T>
88+
using @\exposidnc{indirect-value-t}@ = @\seebelow@; // \expos
89+
8790
template<@\libconcept{indirectly_readable}@ T>
8891
using @\libglobal{iter_common_reference_t}@ = // freestanding
89-
common_reference_t<iter_reference_t<T>, iter_value_t<T>&>;
92+
common_reference_t<iter_reference_t<T>, @\exposid{indirect-value-t}@<T>>;
9093

9194
// \ref{iterator.concept.writable}, concept \libconcept{indirectly_writable}
9295
template<class Out, class T>
@@ -2411,6 +2414,21 @@
24112414
There are several concepts that group requirements of algorithms that
24122415
take callable objects\iref{func.def} as arguments.
24132416

2417+
\rSec3[indirectcallable.traits]{Indirect callable traits}
2418+
2419+
\pnum
2420+
To implement algorithms taking projections,
2421+
it is necessary to determine the projected type of an iterator's value type.
2422+
For the exposition-only alias template \exposid{indirect-value-t},
2423+
\tcode{\exposid{indirect-value-t}<T>} denotes
2424+
\begin{itemize}
2425+
\item
2426+
\tcode{invoke_result_t<Proj\&, \exposid{indirect-value-t}<I>>}
2427+
if \tcode{T} names \tcode{projected<I, Proj>}, and
2428+
\item
2429+
\tcode{iter_value_t<T>\&} otherwise.
2430+
\end{itemize}
2431+
24142432
\rSec3[indirectcallable.indirectinvocable]{Indirect callables}
24152433

24162434
\pnum
@@ -2423,59 +2441,59 @@
24232441
concept @\deflibconcept{indirectly_unary_invocable}@ =
24242442
@\libconcept{indirectly_readable}@<I> &&
24252443
@\libconcept{copy_constructible}@<F> &&
2426-
@\libconcept{invocable}@<F&, iter_value_t<I>&> &&
2444+
@\libconcept{invocable}@<F&, @\exposid{indirect-value-t}@<I>> &&
24272445
@\libconcept{invocable}@<F&, iter_reference_t<I>> &&
24282446
@\libconcept{invocable}@<F&, iter_common_reference_t<I>> &&
24292447
@\libconcept{common_reference_with}@<
2430-
invoke_result_t<F&, iter_value_t<I>&>,
2448+
invoke_result_t<F&, @\exposid{indirect-value-t}@<I>>,
24312449
invoke_result_t<F&, iter_reference_t<I>>>;
24322450

24332451
template<class F, class I>
24342452
concept @\deflibconcept{indirectly_regular_unary_invocable}@ =
24352453
@\libconcept{indirectly_readable}@<I> &&
24362454
@\libconcept{copy_constructible}@<F> &&
2437-
@\libconcept{regular_invocable}@<F&, iter_value_t<I>&> &&
2455+
@\libconcept{regular_invocable}@<F&, @\exposid{indirect-value-t}@<I>> &&
24382456
@\libconcept{regular_invocable}@<F&, iter_reference_t<I>> &&
24392457
@\libconcept{regular_invocable}@<F&, iter_common_reference_t<I>> &&
24402458
@\libconcept{common_reference_with}@<
2441-
invoke_result_t<F&, iter_value_t<I>&>,
2459+
invoke_result_t<F&, @\exposid{indirect-value-t}@<I>>,
24422460
invoke_result_t<F&, iter_reference_t<I>>>;
24432461

24442462
template<class F, class I>
24452463
concept @\deflibconcept{indirect_unary_predicate}@ =
24462464
@\libconcept{indirectly_readable}@<I> &&
24472465
@\libconcept{copy_constructible}@<F> &&
2448-
@\libconcept{predicate}@<F&, iter_value_t<I>&> &&
2466+
@\libconcept{predicate}@<F&, @\exposid{indirect-value-t}@<I>> &&
24492467
@\libconcept{predicate}@<F&, iter_reference_t<I>> &&
24502468
@\libconcept{predicate}@<F&, iter_common_reference_t<I>>;
24512469

24522470
template<class F, class I1, class I2>
24532471
concept @\deflibconcept{indirect_binary_predicate}@ =
24542472
@\libconcept{indirectly_readable}@<I1> && @\libconcept{indirectly_readable}@<I2> &&
24552473
@\libconcept{copy_constructible}@<F> &&
2456-
@\libconcept{predicate}@<F&, iter_value_t<I1>&, iter_value_t<I2>&> &&
2457-
@\libconcept{predicate}@<F&, iter_value_t<I1>&, iter_reference_t<I2>> &&
2458-
@\libconcept{predicate}@<F&, iter_reference_t<I1>, iter_value_t<I2>&> &&
2474+
@\libconcept{predicate}@<F&, @\exposid{indirect-value-t}@<I1>, @\exposid{indirect-value-t}@<I2>> &&
2475+
@\libconcept{predicate}@<F&, @\exposid{indirect-value-t}@<I1>, iter_reference_t<I2>> &&
2476+
@\libconcept{predicate}@<F&, iter_reference_t<I1>, @\exposid{indirect-value-t}@<I2>> &&
24592477
@\libconcept{predicate}@<F&, iter_reference_t<I1>, iter_reference_t<I2>> &&
24602478
@\libconcept{predicate}@<F&, iter_common_reference_t<I1>, iter_common_reference_t<I2>>;
24612479

24622480
template<class F, class I1, class I2 = I1>
24632481
concept @\deflibconcept{indirect_equivalence_relation}@ =
24642482
@\libconcept{indirectly_readable}@<I1> && @\libconcept{indirectly_readable}@<I2> &&
24652483
@\libconcept{copy_constructible}@<F> &&
2466-
@\libconcept{equivalence_relation}@<F&, iter_value_t<I1>&, iter_value_t<I2>&> &&
2467-
@\libconcept{equivalence_relation}@<F&, iter_value_t<I1>&, iter_reference_t<I2>> &&
2468-
@\libconcept{equivalence_relation}@<F&, iter_reference_t<I1>, iter_value_t<I2>&> &&
2484+
@\libconcept{equivalence_relation}@<F&, @\exposid{indirect-value-t}@<I1>, @\exposid{indirect-value-t}@<I2>> &&
2485+
@\libconcept{equivalence_relation}@<F&, @\exposid{indirect-value-t}@<I1>, iter_reference_t<I2>> &&
2486+
@\libconcept{equivalence_relation}@<F&, iter_reference_t<I1>, @\exposid{indirect-value-t}@<I2>&> &&
24692487
@\libconcept{equivalence_relation}@<F&, iter_reference_t<I1>, iter_reference_t<I2>> &&
24702488
@\libconcept{equivalence_relation}@<F&, iter_common_reference_t<I1>, iter_common_reference_t<I2>>;
24712489

24722490
template<class F, class I1, class I2 = I1>
24732491
concept @\deflibconcept{indirect_strict_weak_order}@ =
24742492
@\libconcept{indirectly_readable}@<I1> && @\libconcept{indirectly_readable}@<I2> &&
24752493
@\libconcept{copy_constructible}@<F> &&
2476-
@\libconcept{strict_weak_order}@<F&, iter_value_t<I1>&, iter_value_t<I2>&> &&
2477-
@\libconcept{strict_weak_order}@<F&, iter_value_t<I1>&, iter_reference_t<I2>> &&
2478-
@\libconcept{strict_weak_order}@<F&, iter_reference_t<I1>, iter_value_t<I2>&> &&
2494+
@\libconcept{strict_weak_order}@<F&, @\exposid{indirect-value-t}@<I1>, @\exposid{indirect-value-t}@<I2>> &&
2495+
@\libconcept{strict_weak_order}@<F&, @\exposid{indirect-value-t}@<I1>, iter_reference_t<I2>> &&
2496+
@\libconcept{strict_weak_order}@<F&, iter_reference_t<I1>, @\exposid{indirect-value-t}@<I2>> &&
24792497
@\libconcept{strict_weak_order}@<F&, iter_reference_t<I1>, iter_reference_t<I2>> &&
24802498
@\libconcept{strict_weak_order}@<F&, iter_common_reference_t<I1>, iter_common_reference_t<I2>>;
24812499
}

source/support.tex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -682,7 +682,7 @@
682682
#define @\defnlibxname{cpp_lib_polymorphic_allocator}@ 201902L // also in \libheader{memory_resource}
683683
#define @\defnlibxname{cpp_lib_print}@ 202207L // also in \libheader{print}, \libheader{ostream}
684684
#define @\defnlibxname{cpp_lib_quoted_string_io}@ 201304L // also in \libheader{iomanip}
685-
#define @\defnlibxname{cpp_lib_ranges}@ 202211L
685+
#define @\defnlibxname{cpp_lib_ranges}@ 202302L
686686
// also in \libheader{algorithm}, \libheader{functional}, \libheader{iterator}, \libheader{memory}, \libheader{ranges}
687687
#define @\defnlibxname{cpp_lib_ranges_as_const}@ 202207L // also in \libheader{ranges}
688688
#define @\defnlibxname{cpp_lib_ranges_as_rvalue}@ 202207L // also in \libheader{ranges}

0 commit comments

Comments
 (0)