// Copyright (c) OpenMMLab. All rights reserved. #ifndef MMDEPLOY_CSRC_EXECUTION_EXPAND_H_ #define MMDEPLOY_CSRC_EXECUTION_EXPAND_H_ #include "closure.h" #include "concepts.h" #include "utility.h" namespace mmdeploy { namespace _expand { template struct _Operation { struct type; }; template using operation_t = typename _Operation>::type; template struct _Receiver { struct type; }; template using receiver_t = typename _Receiver::type; template struct _Receiver::type { operation_t* op_state_; template friend void tag_invoke(set_value_t, type&& self, Tuple&& tup) noexcept { std::apply( [&](auto&&... args) { SetValue((Receiver &&) self.op_state_->receiver_, (decltype(args)&&)args...); }, (Tuple &&) tup); } }; template struct _Operation::type { connect_result_t> op_state2_; Receiver receiver_; template type(Sender2&& sender, Receiver&& receiver) : op_state2_(Connect((Sender2 &&) sender, receiver_t{this})), receiver_((Receiver &&) receiver) {} friend void tag_invoke(start_t, type& op_state) { Start(op_state.op_state2_); } }; template struct _Sender { struct type; }; template using sender_t = typename _Sender>::type; template struct _Sender::type { using value_types = std::tuple_element_t<0, completion_signatures_of_t>; Sender sender_; template = true> friend auto tag_invoke(connect_t, Self&& self, Receiver&& receiver) -> operation_t { return operation_t(((Self &&) self).sender_, (Receiver &&) receiver); } }; struct expand_t { template , int> = 0> auto operator()(Sender&& sender) const { return sender_t{(Sender &&) sender}; } _BinderBack operator()() const { return {{}, {}, {}}; } }; } // namespace _expand using _expand::expand_t; inline constexpr expand_t Expand{}; } // namespace mmdeploy #endif // MMDEPLOY_CSRC_EXECUTION_EXPAND_H_