diff --git a/csrc/mmdeploy/execution/expand.h b/csrc/mmdeploy/execution/expand.h index d9a278cbf..734f9946a 100644 --- a/csrc/mmdeploy/execution/expand.h +++ b/csrc/mmdeploy/execution/expand.h @@ -11,66 +11,39 @@ namespace mmdeploy { namespace _expand { -template -struct _Operation { - struct type; -}; -template -using operation_t = typename _Operation>::type; - template struct _Receiver { - struct type; + struct type { + Receiver receiver_; + template + friend void tag_invoke(set_value_t, type&& self, Tuple&& tup) noexcept { + std::apply( + [&](auto&&... args) { + SetValue((Receiver &&) self.receiver_, (decltype(args)&&)args...); + }, + (Tuple &&) tup); + } + }; }; 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_); } -}; +using receiver_t = typename _Receiver>::type; template struct _Sender { - struct type; + struct 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) { + return Connect(((Self &&) self).sender_, + receiver_t{(Receiver &&) receiver}); + } + }; }; 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 {