mirror of
https://github.com/open-mmlab/mmdeploy.git
synced 2025-01-14 08:09:43 +08:00
simplify Expand
(#617)
This commit is contained in:
parent
da8c02e2b4
commit
82a74d8717
@ -11,66 +11,39 @@ namespace mmdeploy {
|
||||
|
||||
namespace _expand {
|
||||
|
||||
template <typename Sender, typename Receiver>
|
||||
struct _Operation {
|
||||
struct type;
|
||||
};
|
||||
template <typename Sender, typename Receiver>
|
||||
using operation_t = typename _Operation<Sender, remove_cvref_t<Receiver>>::type;
|
||||
|
||||
template <typename Sender, typename Receiver>
|
||||
struct _Receiver {
|
||||
struct type;
|
||||
struct type {
|
||||
Receiver receiver_;
|
||||
template <class Tuple>
|
||||
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 <typename Sender, typename Receiver>
|
||||
using receiver_t = typename _Receiver<Sender, Receiver>::type;
|
||||
|
||||
template <typename Sender, typename Receiver>
|
||||
struct _Receiver<Sender, Receiver>::type {
|
||||
operation_t<Sender, Receiver>* op_state_;
|
||||
|
||||
template <class Tuple>
|
||||
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 <typename Sender, typename Receiver>
|
||||
struct _Operation<Sender, Receiver>::type {
|
||||
connect_result_t<Sender, receiver_t<Sender, Receiver>> op_state2_;
|
||||
Receiver receiver_;
|
||||
|
||||
template <typename Sender2>
|
||||
type(Sender2&& sender, Receiver&& receiver)
|
||||
: op_state2_(Connect((Sender2 &&) sender, receiver_t<Sender, Receiver>{this})),
|
||||
receiver_((Receiver &&) receiver) {}
|
||||
|
||||
friend void tag_invoke(start_t, type& op_state) { Start(op_state.op_state2_); }
|
||||
};
|
||||
using receiver_t = typename _Receiver<Sender, remove_cvref_t<Receiver>>::type;
|
||||
|
||||
template <typename Sender>
|
||||
struct _Sender {
|
||||
struct type;
|
||||
struct type {
|
||||
using value_types = std::tuple_element_t<0, completion_signatures_of_t<Sender>>;
|
||||
Sender sender_;
|
||||
|
||||
template <typename Self, typename Receiver, _decays_to<Self, type, bool> = true>
|
||||
friend auto tag_invoke(connect_t, Self&& self, Receiver&& receiver) {
|
||||
return Connect(((Self &&) self).sender_,
|
||||
receiver_t<Sender, Receiver>{(Receiver &&) receiver});
|
||||
}
|
||||
};
|
||||
};
|
||||
template <typename Sender>
|
||||
using sender_t = typename _Sender<remove_cvref_t<Sender>>::type;
|
||||
|
||||
template <typename Sender>
|
||||
struct _Sender<Sender>::type {
|
||||
using value_types = std::tuple_element_t<0, completion_signatures_of_t<Sender>>;
|
||||
Sender sender_;
|
||||
|
||||
template <typename Self, typename Receiver, _decays_to<Self, type, bool> = true>
|
||||
friend auto tag_invoke(connect_t, Self&& self, Receiver&& receiver)
|
||||
-> operation_t<Sender, Receiver> {
|
||||
return operation_t<Sender, Receiver>(((Self &&) self).sender_, (Receiver &&) receiver);
|
||||
}
|
||||
};
|
||||
|
||||
struct expand_t {
|
||||
template <typename Sender, std::enable_if_t<_is_sender<Sender>, int> = 0>
|
||||
auto operator()(Sender&& sender) const {
|
||||
|
Loading…
x
Reference in New Issue
Block a user