1616#pragma once
1717
1818#include " ../stdexec/__detail/__any.hpp"
19+ #include " ../stdexec/__detail/__concepts.hpp"
1920#include " ../stdexec/__detail/__receiver_ref.hpp"
2021#include " ../stdexec/__detail/__receivers.hpp"
2122
@@ -28,8 +29,35 @@ STDEXEC_PRAGMA_IGNORE_GNU("-Woverloaded-virtual")
2829
2930namespace experimental::execution
3031{
32+ namespace _qry_detail
33+ {
34+ template <class Sig , bool Nothrow>
35+ struct _env_archetype ;
36+
37+ template <class Return , class Query , class ... Args, bool Nothrow>
38+ struct _env_archetype <Return(Query, Args...), Nothrow>
39+ {
40+ Return query (Query, Args &&...) const noexcept (Nothrow);
41+ };
42+
43+ using namespace STDEXEC ;
44+
45+ template <class Sig >
46+ inline constexpr bool is_query_function_v = false ;
47+
48+ template <class Return , class Query , class ... Args>
49+ inline constexpr bool is_query_function_v<Return(Query, Args...)> =
50+ __callable<Query, _env_archetype<Return(Query, Args...), false > const &, Args...>;
51+
52+ template <class Return , class Query , class ... Args>
53+ inline constexpr bool is_query_function_v<Return(Query, Args...) noexcept > =
54+ __nothrow_callable<Query, _env_archetype<Return(Query, Args...), true > const &, Args...>;
55+ } // namespace _qry_detail
56+
3157 template <class ... Sigs>
32- struct queries ;
58+ requires (_qry_detail::is_query_function_v<Sigs> && ...)
59+ struct queries
60+ {};
3361
3462 template <class Sigs , class Queries = queries<>>
3563 struct any_receiver ;
0 commit comments