Skip to content

Commit 3d38032

Browse files
committed
use a named concept for statically-querable types
1 parent 4c96156 commit 3d38032

1 file changed

Lines changed: 13 additions & 17 deletions

File tree

include/stdexec/__detail/__env.hpp

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,11 @@ namespace stdexec {
377377
template <class _Env, class _Query, class... _Args>
378378
concept __nothrow_queryable = nothrow_tag_invocable<_Query, const _Env&, _Args...>;
379379

380+
template <class _Env, class _Query, class... _Args>
381+
concept __statically_queryable = requires {
382+
std::remove_reference_t<_Env>::query(std::declval<_Query>(), std::declval<_Args>()...);
383+
};
384+
380385
template <class _Env, class _Query, class... _Args>
381386
using __query_result_t = tag_invoke_result_t<_Query, const _Env&, _Args...>;
382387

@@ -457,15 +462,11 @@ namespace stdexec {
457462
// This is useful for constexpr evaluation of queries.
458463
template <class _Query, class... _Args>
459464
requires(__queryable<_Envs, _Query, _Args...> || ...)
465+
&& __statically_queryable<__1st_env_t<_Query, _Args...>, _Query, _Args...>
460466
STDEXEC_ATTRIBUTE(nodiscard, always_inline)
461467
static constexpr auto query(_Query __q, _Args&&... __args)
462468
noexcept(__nothrow_queryable<__1st_env_t<_Query, _Args...>, _Query, _Args...>)
463-
-> decltype(auto)
464-
requires requires {
465-
std::remove_reference_t<__1st_env_t<_Query, _Args...>>::query(
466-
__q, static_cast<_Args &&>(__args)...);
467-
}
468-
{
469+
-> decltype(auto) {
469470
return std::remove_reference_t<__1st_env_t<_Query, _Args...>>::query(
470471
__q, static_cast<_Args&&>(__args)...);
471472
}
@@ -508,17 +509,12 @@ namespace stdexec {
508509
// NOT TO SPEC: a static query memfn for those envs that have a static query memfn.
509510
// This is useful for constexpr evaluation of queries.
510511
template <class _Query, class... _Args>
511-
requires __queryable<_Env0, _Query, _Args...>
512-
|| __queryable<_Env1, _Query, _Args...>
513-
STDEXEC_ATTRIBUTE(nodiscard, always_inline)
514-
static constexpr auto query(_Query __q, _Args&&... __args)
515-
noexcept(__nothrow_queryable<__1st_env_t<_Query, _Args...>, _Query, _Args...>)
516-
-> decltype(auto)
517-
requires requires {
518-
std::remove_reference_t<__1st_env_t<_Query, _Args...>>::query(
519-
__q, static_cast<_Args &&>(__args)...);
520-
}
521-
{
512+
requires(__queryable<_Env0, _Query, _Args...> || __queryable<_Env1, _Query, _Args...>)
513+
&& __statically_queryable<__1st_env_t<_Query, _Args...>, _Query, _Args...>
514+
STDEXEC_ATTRIBUTE(nodiscard, always_inline)
515+
static constexpr auto query(_Query __q, _Args&&... __args)
516+
noexcept(__nothrow_queryable<__1st_env_t<_Query, _Args...>, _Query, _Args...>)
517+
-> decltype(auto) {
522518
return std::remove_reference_t<__1st_env_t<_Query, _Args...>>::query(
523519
__q, static_cast<_Args&&>(__args)...);
524520
}

0 commit comments

Comments
 (0)