From Jason Turner

[indirectcallable]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmph8t7w48h/{from.md → to.md} +14 -18
tmp/tmph8t7w48h/{from.md → to.md} RENAMED
@@ -26,84 +26,80 @@ namespace std {
26
  concept indirectly_unary_invocable =
27
  indirectly_readable<I> &&
28
  copy_constructible<F> &&
29
  invocable<F&, indirect-value-t<I>> &&
30
  invocable<F&, iter_reference_t<I>> &&
31
- invocable<F&, iter_common_reference_t<I>> &&
32
  common_reference_with<
33
  invoke_result_t<F&, indirect-value-t<I>>,
34
  invoke_result_t<F&, iter_reference_t<I>>>;
35
 
36
  template<class F, class I>
37
  concept indirectly_regular_unary_invocable =
38
  indirectly_readable<I> &&
39
  copy_constructible<F> &&
40
  regular_invocable<F&, indirect-value-t<I>> &&
41
  regular_invocable<F&, iter_reference_t<I>> &&
42
- regular_invocable<F&, iter_common_reference_t<I>> &&
43
  common_reference_with<
44
  invoke_result_t<F&, indirect-value-t<I>>,
45
  invoke_result_t<F&, iter_reference_t<I>>>;
46
 
47
  template<class F, class I>
48
  concept indirect_unary_predicate =
49
  indirectly_readable<I> &&
50
  copy_constructible<F> &&
51
  predicate<F&, indirect-value-t<I>> &&
52
- predicate<F&, iter_reference_t<I>> &&
53
- predicate<F&, iter_common_reference_t<I>>;
54
 
55
  template<class F, class I1, class I2>
56
  concept indirect_binary_predicate =
57
  indirectly_readable<I1> && indirectly_readable<I2> &&
58
  copy_constructible<F> &&
59
  predicate<F&, indirect-value-t<I1>, indirect-value-t<I2>> &&
60
  predicate<F&, indirect-value-t<I1>, iter_reference_t<I2>> &&
61
  predicate<F&, iter_reference_t<I1>, indirect-value-t<I2>> &&
62
- predicate<F&, iter_reference_t<I1>, iter_reference_t<I2>> &&
63
- predicate<F&, iter_common_reference_t<I1>, iter_common_reference_t<I2>>;
64
 
65
  template<class F, class I1, class I2 = I1>
66
  concept indirect_equivalence_relation =
67
  indirectly_readable<I1> && indirectly_readable<I2> &&
68
  copy_constructible<F> &&
69
  equivalence_relation<F&, indirect-value-t<I1>, indirect-value-t<I2>> &&
70
  equivalence_relation<F&, indirect-value-t<I1>, iter_reference_t<I2>> &&
71
  equivalence_relation<F&, iter_reference_t<I1>, indirect-value-t<I2>> &&
72
- equivalence_relation<F&, iter_reference_t<I1>, iter_reference_t<I2>> &&
73
- equivalence_relation<F&, iter_common_reference_t<I1>, iter_common_reference_t<I2>>;
74
 
75
  template<class F, class I1, class I2 = I1>
76
  concept indirect_strict_weak_order =
77
  indirectly_readable<I1> && indirectly_readable<I2> &&
78
  copy_constructible<F> &&
79
  strict_weak_order<F&, indirect-value-t<I1>, indirect-value-t<I2>> &&
80
  strict_weak_order<F&, indirect-value-t<I1>, iter_reference_t<I2>> &&
81
  strict_weak_order<F&, iter_reference_t<I1>, indirect-value-t<I2>> &&
82
- strict_weak_order<F&, iter_reference_t<I1>, iter_reference_t<I2>> &&
83
- strict_weak_order<F&, iter_common_reference_t<I1>, iter_common_reference_t<I2>>;
84
  }
85
  ```
86
 
87
- #### Class template `projected` <a id="projected">[[projected]]</a>
88
 
89
- Class template `projected` is used to constrain algorithms that accept
90
  callable objects and projections [[defns.projection]]. It combines an
91
  `indirectly_readable` type `I` and a callable object type `Proj` into a
92
  new `indirectly_readable` type whose `reference` type is the result of
93
  applying `Proj` to the `iter_reference_t` of `I`.
94
 
95
  ``` cpp
96
  namespace std {
97
- template<indirectly_readable I, indirectly_regular_unary_invocable<I> Proj>
98
- struct projected {
 
99
  using value_type = remove_cvref_t<indirect_result_t<Proj&, I>>;
 
 
100
  indirect_result_t<Proj&, I> operator*() const; // not defined
101
  };
102
-
103
- template<weakly_incrementable I, class Proj>
104
- struct incrementable_traits<projected<I, Proj>> {
105
- using difference_type = iter_difference_t<I>;
106
  };
 
 
 
107
  }
108
  ```
109
 
 
26
  concept indirectly_unary_invocable =
27
  indirectly_readable<I> &&
28
  copy_constructible<F> &&
29
  invocable<F&, indirect-value-t<I>> &&
30
  invocable<F&, iter_reference_t<I>> &&
 
31
  common_reference_with<
32
  invoke_result_t<F&, indirect-value-t<I>>,
33
  invoke_result_t<F&, iter_reference_t<I>>>;
34
 
35
  template<class F, class I>
36
  concept indirectly_regular_unary_invocable =
37
  indirectly_readable<I> &&
38
  copy_constructible<F> &&
39
  regular_invocable<F&, indirect-value-t<I>> &&
40
  regular_invocable<F&, iter_reference_t<I>> &&
 
41
  common_reference_with<
42
  invoke_result_t<F&, indirect-value-t<I>>,
43
  invoke_result_t<F&, iter_reference_t<I>>>;
44
 
45
  template<class F, class I>
46
  concept indirect_unary_predicate =
47
  indirectly_readable<I> &&
48
  copy_constructible<F> &&
49
  predicate<F&, indirect-value-t<I>> &&
50
+ predicate<F&, iter_reference_t<I>>;
 
51
 
52
  template<class F, class I1, class I2>
53
  concept indirect_binary_predicate =
54
  indirectly_readable<I1> && indirectly_readable<I2> &&
55
  copy_constructible<F> &&
56
  predicate<F&, indirect-value-t<I1>, indirect-value-t<I2>> &&
57
  predicate<F&, indirect-value-t<I1>, iter_reference_t<I2>> &&
58
  predicate<F&, iter_reference_t<I1>, indirect-value-t<I2>> &&
59
+ predicate<F&, iter_reference_t<I1>, iter_reference_t<I2>>;
 
60
 
61
  template<class F, class I1, class I2 = I1>
62
  concept indirect_equivalence_relation =
63
  indirectly_readable<I1> && indirectly_readable<I2> &&
64
  copy_constructible<F> &&
65
  equivalence_relation<F&, indirect-value-t<I1>, indirect-value-t<I2>> &&
66
  equivalence_relation<F&, indirect-value-t<I1>, iter_reference_t<I2>> &&
67
  equivalence_relation<F&, iter_reference_t<I1>, indirect-value-t<I2>> &&
68
+ equivalence_relation<F&, iter_reference_t<I1>, iter_reference_t<I2>>;
 
69
 
70
  template<class F, class I1, class I2 = I1>
71
  concept indirect_strict_weak_order =
72
  indirectly_readable<I1> && indirectly_readable<I2> &&
73
  copy_constructible<F> &&
74
  strict_weak_order<F&, indirect-value-t<I1>, indirect-value-t<I2>> &&
75
  strict_weak_order<F&, indirect-value-t<I1>, iter_reference_t<I2>> &&
76
  strict_weak_order<F&, iter_reference_t<I1>, indirect-value-t<I2>> &&
77
+ strict_weak_order<F&, iter_reference_t<I1>, iter_reference_t<I2>>;
 
78
  }
79
  ```
80
 
81
+ #### Alias template `projected` <a id="projected">[[projected]]</a>
82
 
83
+ Alias template `projected` is used to constrain algorithms that accept
84
  callable objects and projections [[defns.projection]]. It combines an
85
  `indirectly_readable` type `I` and a callable object type `Proj` into a
86
  new `indirectly_readable` type whose `reference` type is the result of
87
  applying `Proj` to the `iter_reference_t` of `I`.
88
 
89
  ``` cpp
90
  namespace std {
91
+ template<class I, class Proj>
92
+ struct projected-impl { // exposition only
93
+ struct type { // exposition only
94
  using value_type = remove_cvref_t<indirect_result_t<Proj&, I>>;
95
+ using difference_type = iter_difference_t<I>; // present only if I
96
+ // models weakly_incrementable
97
  indirect_result_t<Proj&, I> operator*() const; // not defined
98
  };
 
 
 
 
99
  };
100
+
101
+ template<indirectly_readable I, indirectly_regular_unary_invocable<I> Proj>
102
+ using projected = projected-impl<I, Proj>::type;
103
  }
104
  ```
105