// Copyright (c) OpenMMLab. All rights reserved. #ifndef MMDEPLOY_CSRC_EXPERIMENTAL_EXECUTION_INLINED_SCHEDULER_H_ #define MMDEPLOY_CSRC_EXPERIMENTAL_EXECUTION_INLINED_SCHEDULER_H_ #include "execution/execution.h" namespace mmdeploy { namespace _inline_sched { template struct _Operation { struct type; }; template using operation_t = typename _Operation>::type; template struct _Operation::type { Receiver receiver_; friend void tag_invoke(start_t, type& op) noexcept { SetValue(std::move(op.receiver_)); } }; struct _Sender { using value_types = std::tuple<>; template friend auto tag_invoke(connect_t, _Sender, Receiver&& receiver) -> operation_t { return {(Receiver &&) receiver}; } }; struct InlineScheduler { friend _inline_sched::_Sender tag_invoke(schedule_t, const InlineScheduler&) noexcept { return {}; } }; inline InlineScheduler tag_invoke(get_completion_scheduler_t, const _Sender&) { return {}; } template struct _Receiver { struct type; }; template using receiver_t = typename _Receiver>::type; template struct _Receiver::type { std::optional>* data_; template friend void tag_invoke(set_value_t, type&& r, As&&... as) noexcept { r.data_->emplace((As &&) as...); } }; template completion_signatures_of_t tag_invoke(sync_wait_t, InlineScheduler, Sender&& sender) { std::optional> data; auto op_state = Connect(((Sender &&) sender), _inline_sched::receiver_t{&data}); Start(op_state); return std::move(data).value(); } } // namespace _inline_sched using _inline_sched::InlineScheduler; inline constexpr InlineScheduler inline_scheduler{}; } // namespace mmdeploy #endif // MMDEPLOY_CSRC_EXPERIMENTAL_EXECUTION_INLINED_SCHEDULER_H_