|
35 | 35 | #include <__type_traits/add_pointer.h> |
36 | 36 | #include <__type_traits/common_reference.h> |
37 | 37 | #include <__type_traits/is_pointer.h> |
| 38 | +#include <__type_traits/is_primary_template.h> |
38 | 39 | #include <__type_traits/is_reference.h> |
39 | 40 | #include <__type_traits/remove_cv.h> |
40 | 41 | #include <__type_traits/remove_cvref.h> |
@@ -64,8 +65,33 @@ concept __indirectly_readable_impl = |
64 | 65 | template <class _In> |
65 | 66 | concept indirectly_readable = __indirectly_readable_impl<remove_cvref_t<_In>>; |
66 | 67 |
|
| 68 | +template <class _Tp> |
| 69 | +using __projected_iterator_t = typename _Tp::__projected_iterator; |
| 70 | + |
| 71 | +template <class _Tp> |
| 72 | +using __projected_projection_t = typename _Tp::__projected_projection; |
| 73 | + |
| 74 | +template <class _Tp> |
| 75 | +concept __specialization_of_projected = requires { |
| 76 | + typename __projected_iterator_t<_Tp>; |
| 77 | + typename __projected_projection_t<_Tp>; |
| 78 | +} && __is_primary_template<_Tp>::value; |
| 79 | + |
| 80 | +template <class _Tp> |
| 81 | +struct __indirect_value_t_impl { |
| 82 | + using type = iter_value_t<_Tp>&; |
| 83 | +}; |
| 84 | +template <__specialization_of_projected _Tp> |
| 85 | +struct __indirect_value_t_impl<_Tp> { |
| 86 | + using type = invoke_result_t<__projected_projection_t<_Tp>&, |
| 87 | + typename __indirect_value_t_impl<__projected_iterator_t<_Tp>>::type>; |
| 88 | +}; |
| 89 | + |
| 90 | +template <indirectly_readable _Tp> |
| 91 | +using __indirect_value_t = typename __indirect_value_t_impl<_Tp>::type; |
| 92 | + |
67 | 93 | template <indirectly_readable _Tp> |
68 | | -using iter_common_reference_t = common_reference_t<iter_reference_t<_Tp>, iter_value_t<_Tp>&>; |
| 94 | +using iter_common_reference_t = common_reference_t<iter_reference_t<_Tp>, __indirect_value_t<_Tp>>; |
69 | 95 |
|
70 | 96 | // [iterator.concept.writable] |
71 | 97 | template <class _Out, class _Tp> |
@@ -176,43 +202,45 @@ concept __has_arrow = input_iterator<_Ip> && (is_pointer_v<_Ip> || requires(_Ip |
176 | 202 | // [indirectcallable.indirectinvocable] |
177 | 203 | template <class _Fp, class _It> |
178 | 204 | concept indirectly_unary_invocable = |
179 | | - indirectly_readable<_It> && copy_constructible<_Fp> && invocable<_Fp&, iter_value_t<_It>&> && |
| 205 | + indirectly_readable<_It> && copy_constructible<_Fp> && invocable<_Fp&, __indirect_value_t<_It>> && |
180 | 206 | invocable<_Fp&, iter_reference_t<_It>> && |
181 | | - common_reference_with< invoke_result_t<_Fp&, iter_value_t<_It>&>, invoke_result_t<_Fp&, iter_reference_t<_It>>>; |
| 207 | + common_reference_with< invoke_result_t<_Fp&, __indirect_value_t<_It>>, |
| 208 | + invoke_result_t<_Fp&, iter_reference_t<_It>>>; |
182 | 209 |
|
183 | 210 | template <class _Fp, class _It> |
184 | 211 | concept indirectly_regular_unary_invocable = |
185 | | - indirectly_readable<_It> && copy_constructible<_Fp> && regular_invocable<_Fp&, iter_value_t<_It>&> && |
| 212 | + indirectly_readable<_It> && copy_constructible<_Fp> && regular_invocable<_Fp&, __indirect_value_t<_It>> && |
186 | 213 | regular_invocable<_Fp&, iter_reference_t<_It>> && |
187 | | - common_reference_with< invoke_result_t<_Fp&, iter_value_t<_It>&>, invoke_result_t<_Fp&, iter_reference_t<_It>>>; |
| 214 | + common_reference_with< invoke_result_t<_Fp&, __indirect_value_t<_It>>, |
| 215 | + invoke_result_t<_Fp&, iter_reference_t<_It>>>; |
188 | 216 |
|
189 | 217 | template <class _Fp, class _It> |
190 | 218 | concept indirect_unary_predicate = |
191 | | - indirectly_readable<_It> && copy_constructible<_Fp> && predicate<_Fp&, iter_value_t<_It>&> && |
| 219 | + indirectly_readable<_It> && copy_constructible<_Fp> && predicate<_Fp&, __indirect_value_t<_It>> && |
192 | 220 | predicate<_Fp&, iter_reference_t<_It>>; |
193 | 221 |
|
194 | 222 | template <class _Fp, class _It1, class _It2> |
195 | 223 | concept indirect_binary_predicate = |
196 | 224 | indirectly_readable<_It1> && indirectly_readable<_It2> && copy_constructible<_Fp> && |
197 | | - predicate<_Fp&, iter_value_t<_It1>&, iter_value_t<_It2>&> && |
198 | | - predicate<_Fp&, iter_value_t<_It1>&, iter_reference_t<_It2>> && |
199 | | - predicate<_Fp&, iter_reference_t<_It1>, iter_value_t<_It2>&> && |
| 225 | + predicate<_Fp&, __indirect_value_t<_It1>, __indirect_value_t<_It2>> && |
| 226 | + predicate<_Fp&, __indirect_value_t<_It1>, iter_reference_t<_It2>> && |
| 227 | + predicate<_Fp&, iter_reference_t<_It1>, __indirect_value_t<_It2>> && |
200 | 228 | predicate<_Fp&, iter_reference_t<_It1>, iter_reference_t<_It2>>; |
201 | 229 |
|
202 | 230 | template <class _Fp, class _It1, class _It2 = _It1> |
203 | 231 | concept indirect_equivalence_relation = |
204 | 232 | indirectly_readable<_It1> && indirectly_readable<_It2> && copy_constructible<_Fp> && |
205 | | - equivalence_relation<_Fp&, iter_value_t<_It1>&, iter_value_t<_It2>&> && |
206 | | - equivalence_relation<_Fp&, iter_value_t<_It1>&, iter_reference_t<_It2>> && |
207 | | - equivalence_relation<_Fp&, iter_reference_t<_It1>, iter_value_t<_It2>&> && |
| 233 | + equivalence_relation<_Fp&, __indirect_value_t<_It1>, __indirect_value_t<_It2>> && |
| 234 | + equivalence_relation<_Fp&, __indirect_value_t<_It1>, iter_reference_t<_It2>> && |
| 235 | + equivalence_relation<_Fp&, iter_reference_t<_It1>, __indirect_value_t<_It2>> && |
208 | 236 | equivalence_relation<_Fp&, iter_reference_t<_It1>, iter_reference_t<_It2>>; |
209 | 237 |
|
210 | 238 | template <class _Fp, class _It1, class _It2 = _It1> |
211 | 239 | concept indirect_strict_weak_order = |
212 | 240 | indirectly_readable<_It1> && indirectly_readable<_It2> && copy_constructible<_Fp> && |
213 | | - strict_weak_order<_Fp&, iter_value_t<_It1>&, iter_value_t<_It2>&> && |
214 | | - strict_weak_order<_Fp&, iter_value_t<_It1>&, iter_reference_t<_It2>> && |
215 | | - strict_weak_order<_Fp&, iter_reference_t<_It1>, iter_value_t<_It2>&> && |
| 241 | + strict_weak_order<_Fp&, __indirect_value_t<_It1>, __indirect_value_t<_It2>> && |
| 242 | + strict_weak_order<_Fp&, __indirect_value_t<_It1>, iter_reference_t<_It2>> && |
| 243 | + strict_weak_order<_Fp&, iter_reference_t<_It1>, __indirect_value_t<_It2>> && |
216 | 244 | strict_weak_order<_Fp&, iter_reference_t<_It1>, iter_reference_t<_It2>>; |
217 | 245 |
|
218 | 246 | template <class _Fp, class... _Its> |
|
0 commit comments