From Jason Turner

[indirectcallable]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmp2p86k9wz/{from.md → to.md} +99 -0
tmp/tmp2p86k9wz/{from.md → to.md} RENAMED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ### Indirect callable requirements <a id="indirectcallable">[[indirectcallable]]</a>
2
+
3
+ #### General <a id="indirectcallable.general">[[indirectcallable.general]]</a>
4
+
5
+ There are several concepts that group requirements of algorithms that
6
+ take callable objects ([[func.def]]) as arguments.
7
+
8
+ #### Indirect callables <a id="indirectcallable.indirectinvocable">[[indirectcallable.indirectinvocable]]</a>
9
+
10
+ The indirect callable concepts are used to constrain those algorithms
11
+ that accept callable objects ([[func.def]]) as arguments.
12
+
13
+ ``` cpp
14
+ namespace std {
15
+ template<class F, class I>
16
+ concept indirectly_unary_invocable =
17
+ indirectly_readable<I> &&
18
+ copy_constructible<F> &&
19
+ invocable<F&, iter_value_t<I>&> &&
20
+ invocable<F&, iter_reference_t<I>> &&
21
+ invocable<F&, iter_common_reference_t<I>> &&
22
+ common_reference_with<
23
+ invoke_result_t<F&, iter_value_t<I>&>,
24
+ invoke_result_t<F&, iter_reference_t<I>>>;
25
+
26
+ template<class F, class I>
27
+ concept indirectly_regular_unary_invocable =
28
+ indirectly_readable<I> &&
29
+ copy_constructible<F> &&
30
+ regular_invocable<F&, iter_value_t<I>&> &&
31
+ regular_invocable<F&, iter_reference_t<I>> &&
32
+ regular_invocable<F&, iter_common_reference_t<I>> &&
33
+ common_reference_with<
34
+ invoke_result_t<F&, iter_value_t<I>&>,
35
+ invoke_result_t<F&, iter_reference_t<I>>>;
36
+
37
+ template<class F, class I>
38
+ concept indirect_unary_predicate =
39
+ indirectly_readable<I> &&
40
+ copy_constructible<F> &&
41
+ predicate<F&, iter_value_t<I>&> &&
42
+ predicate<F&, iter_reference_t<I>> &&
43
+ predicate<F&, iter_common_reference_t<I>>;
44
+
45
+ template<class F, class I1, class I2>
46
+ concept indirect_binary_predicate =
47
+ indirectly_readable<I1> && indirectly_readable<I2> &&
48
+ copy_constructible<F> &&
49
+ predicate<F&, iter_value_t<I1>&, iter_value_t<I2>&> &&
50
+ predicate<F&, iter_value_t<I1>&, iter_reference_t<I2>> &&
51
+ predicate<F&, iter_reference_t<I1>, iter_value_t<I2>&> &&
52
+ predicate<F&, iter_reference_t<I1>, iter_reference_t<I2>> &&
53
+ predicate<F&, iter_common_reference_t<I1>, iter_common_reference_t<I2>>;
54
+
55
+ template<class F, class I1, class I2 = I1>
56
+ concept indirect_equivalence_relation =
57
+ indirectly_readable<I1> && indirectly_readable<I2> &&
58
+ copy_constructible<F> &&
59
+ equivalence_relation<F&, iter_value_t<I1>&, iter_value_t<I2>&> &&
60
+ equivalence_relation<F&, iter_value_t<I1>&, iter_reference_t<I2>> &&
61
+ equivalence_relation<F&, iter_reference_t<I1>, iter_value_t<I2>&> &&
62
+ equivalence_relation<F&, iter_reference_t<I1>, iter_reference_t<I2>> &&
63
+ equivalence_relation<F&, iter_common_reference_t<I1>, iter_common_reference_t<I2>>;
64
+
65
+ template<class F, class I1, class I2 = I1>
66
+ concept indirect_strict_weak_order =
67
+ indirectly_readable<I1> && indirectly_readable<I2> &&
68
+ copy_constructible<F> &&
69
+ strict_weak_order<F&, iter_value_t<I1>&, iter_value_t<I2>&> &&
70
+ strict_weak_order<F&, iter_value_t<I1>&, iter_reference_t<I2>> &&
71
+ strict_weak_order<F&, iter_reference_t<I1>, iter_value_t<I2>&> &&
72
+ strict_weak_order<F&, iter_reference_t<I1>, iter_reference_t<I2>> &&
73
+ strict_weak_order<F&, iter_common_reference_t<I1>, iter_common_reference_t<I2>>;
74
+ }
75
+ ```
76
+
77
+ #### Class template `projected` <a id="projected">[[projected]]</a>
78
+
79
+ Class template `projected` is used to constrain algorithms that accept
80
+ callable objects and projections [[defns.projection]]. It combines a
81
+ `indirectly_readable` type `I` and a callable object type `Proj` into a
82
+ new `indirectly_readable` type whose `reference` type is the result of
83
+ applying `Proj` to the `iter_reference_t` of `I`.
84
+
85
+ ``` cpp
86
+ namespace std {
87
+ template<indirectly_readable I, indirectly_regular_unary_invocable<I> Proj>
88
+ struct projected {
89
+ using value_type = remove_cvref_t<indirect_result_t<Proj&, I>>;
90
+ indirect_result_t<Proj&, I> operator*() const; // not defined
91
+ };
92
+
93
+ template<weakly_incrementable I, class Proj>
94
+ struct incrementable_traits<projected<I, Proj>> {
95
+ using difference_type = iter_difference_t<I>;
96
+ };
97
+ }
98
+ ```
99
+