// Copyright (c) OpenMMLab. All rights reserved. #ifndef MMDEPLOY_CSRC_EXPERIMENTAL_EXECUTION_CONCEPTS_H_ #define MMDEPLOY_CSRC_EXPERIMENTAL_EXECUTION_CONCEPTS_H_ #include "tag_invoke.h" namespace mmdeploy { namespace _get_completion_signatures { struct get_completion_signatures_t { template ::value_types> constexpr identity operator()(Sender&& sender) const noexcept { return {}; } }; } // namespace _get_completion_signatures using _get_completion_signatures::get_completion_signatures_t; inline constexpr get_completion_signatures_t GetCompletionSignatures{}; template inline constexpr bool _is_sender = std::is_invocable_v&& std::is_move_constructible_v>; // GetCompletionSignatures is expected to return identity>; template using completion_signatures_of_t = typename std::invoke_result_t::type; namespace _set_value { struct set_value_t { template , int> = 0> void operator()(Receiver&& receiver, Args&&... args) const noexcept { static_assert(is_nothrow_tag_invocable_v); (void)tag_invoke(set_value_t{}, (Receiver &&) receiver, (Args &&) args...); } }; } // namespace _set_value using _set_value::set_value_t; inline constexpr set_value_t SetValue{}; namespace _start { struct start_t { template , int> = 0> void operator()(Operation& op_state) const noexcept(is_nothrow_tag_invocable_v) { (void)tag_invoke(start_t{}, op_state); } }; } // namespace _start using _start::start_t; inline constexpr start_t Start{}; namespace _connect { struct connect_t { template , int> = 0> auto operator()(Sender&& sender, Receiver&& receiver) const -> tag_invoke_result_t { return tag_invoke(connect_t{}, (Sender &&) sender, (Receiver &&) receiver); } }; } // namespace _connect using _connect::connect_t; inline constexpr connect_t Connect{}; namespace _get_completion_scheduler { struct get_completion_scheduler_t { template < typename Sender, std::enable_if_t, int> = 0> auto operator()(const Sender& sender) const noexcept -> tag_invoke_result_t { return tag_invoke(get_completion_scheduler_t{}, sender); } }; } // namespace _get_completion_scheduler using _get_completion_scheduler::get_completion_scheduler_t; inline constexpr get_completion_scheduler_t GetCompletionScheduler{}; template inline constexpr bool _has_completion_scheduler_v = std::is_invocable_v; template struct _has_completion_scheduler : std::bool_constant<_has_completion_scheduler_v> {}; template using _completion_scheduler_for = std::invoke_result_t; namespace impl { template struct _tag_invocable_with_completion_scheduler : std::false_type {}; template struct _tag_invocable_with_completion_scheduler< Func, Sender, std::tuple, std::enable_if_t<_has_completion_scheduler_v>> : is_tag_invocable, Sender, Args...> {}; } // namespace impl template inline constexpr bool _tag_invocable_with_completion_scheduler = impl::_tag_invocable_with_completion_scheduler>::value; template struct _is_range : std::false_type {}; template struct _is_range()), std::end(std::declval()))>> : std::true_type {}; template inline constexpr bool _is_range_v = _is_range::value; } // namespace mmdeploy #endif // MMDEPLOY_CSRC_EXPERIMENTAL_EXECUTION_CONCEPTS_H_