@@ -171,6 +171,71 @@ concept contiguous_iterator =
171171template <class _Ip >
172172concept __has_arrow = input_iterator<_Ip> && (is_pointer_v<_Ip> || requires (_Ip __i) { __i.operator ->(); });
173173
174+ // [indirectcallable.indirectinvocable]
175+ template <class _Fp , class _It >
176+ concept indirectly_unary_invocable =
177+ indirectly_readable<_It> &&
178+ copy_constructible<_Fp> &&
179+ invocable<_Fp&, iter_value_t <_It>&> &&
180+ invocable<_Fp&, iter_reference_t <_It>> &&
181+ invocable<_Fp&, iter_common_reference_t <_It>> &&
182+ common_reference_with<
183+ invoke_result_t <_Fp&, iter_value_t <_It>&>,
184+ invoke_result_t <_Fp&, iter_reference_t <_It>>>;
185+
186+ template <class _Fp , class _It >
187+ concept indirectly_regular_unary_invocable =
188+ indirectly_readable<_It> &&
189+ copy_constructible<_Fp> &&
190+ regular_invocable<_Fp&, iter_value_t <_It>&> &&
191+ regular_invocable<_Fp&, iter_reference_t <_It>> &&
192+ regular_invocable<_Fp&, iter_common_reference_t <_It>> &&
193+ common_reference_with<
194+ invoke_result_t <_Fp&, iter_value_t <_It>&>,
195+ invoke_result_t <_Fp&, iter_reference_t <_It>>>;
196+
197+ template <class _Fp , class _It >
198+ concept indirect_unary_predicate =
199+ indirectly_readable<_It> &&
200+ copy_constructible<_Fp> &&
201+ predicate<_Fp&, iter_value_t <_It>&> &&
202+ predicate<_Fp&, iter_reference_t <_It>> &&
203+ predicate<_Fp&, iter_common_reference_t <_It>>;
204+
205+ template <class _Fp , class _It1 , class _It2 >
206+ concept indirect_binary_predicate =
207+ indirectly_readable<_It1> && indirectly_readable<_It2> &&
208+ copy_constructible<_Fp> &&
209+ predicate<_Fp&, iter_value_t <_It1>&, iter_value_t <_It2>&> &&
210+ predicate<_Fp&, iter_value_t <_It1>&, iter_reference_t <_It2>> &&
211+ predicate<_Fp&, iter_reference_t <_It1>, iter_value_t <_It2>&> &&
212+ predicate<_Fp&, iter_reference_t <_It1>, iter_reference_t <_It2>> &&
213+ predicate<_Fp&, iter_common_reference_t <_It1>, iter_common_reference_t <_It2>>;
214+
215+ template <class _Fp , class _It1 , class _It2 = _It1>
216+ concept indirect_equivalence_relation =
217+ indirectly_readable<_It1> && indirectly_readable<_It2> &&
218+ copy_constructible<_Fp> &&
219+ equivalence_relation<_Fp&, iter_value_t <_It1>&, iter_value_t <_It2>&> &&
220+ equivalence_relation<_Fp&, iter_value_t <_It1>&, iter_reference_t <_It2>> &&
221+ equivalence_relation<_Fp&, iter_reference_t <_It1>, iter_value_t <_It2>&> &&
222+ equivalence_relation<_Fp&, iter_reference_t <_It1>, iter_reference_t <_It2>> &&
223+ equivalence_relation<_Fp&, iter_common_reference_t <_It1>, iter_common_reference_t <_It2>>;
224+
225+ template <class _Fp , class _It1 , class _It2 = _It1>
226+ concept indirect_strict_weak_order =
227+ indirectly_readable<_It1> && indirectly_readable<_It2> &&
228+ copy_constructible<_Fp> &&
229+ strict_weak_order<_Fp&, iter_value_t <_It1>&, iter_value_t <_It2>&> &&
230+ strict_weak_order<_Fp&, iter_value_t <_It1>&, iter_reference_t <_It2>> &&
231+ strict_weak_order<_Fp&, iter_reference_t <_It1>, iter_value_t <_It2>&> &&
232+ strict_weak_order<_Fp&, iter_reference_t <_It1>, iter_reference_t <_It2>> &&
233+ strict_weak_order<_Fp&, iter_common_reference_t <_It1>, iter_common_reference_t <_It2>>;
234+
235+ template <class _Fp , class ... _Its>
236+ requires (indirectly_readable<_Its> && ...) && invocable<_Fp, iter_reference_t<_Its>...>
237+ using indirect_result_t = invoke_result_t<_Fp, iter_reference_t<_Its>...>;
238+
174239// clang-format on
175240
176241#endif // !defined(_LIBCPP_HAS_NO_RANGES)
0 commit comments