// Copyright (c) OpenMMLab. All rights reserved. // Modified from // https://github.com/brycelelbach/wg21_p2300_std_execution/blob/main/include/execution.hpp #include #include "concepts.h" #include "utility.h" #ifndef MMDEPLOY_CSRC_EXPERIMENTAL_EXECUTION_CLOSURE_H_ #define MMDEPLOY_CSRC_EXPERIMENTAL_EXECUTION_CLOSURE_H_ namespace mmdeploy { namespace __closure { template struct SenderAdaptorClosure; } // namespace __closure using __closure::SenderAdaptorClosure; namespace __closure { template struct _Compose : SenderAdaptorClosure<_Compose> { T0 t0_; T1 t1_; template , int> = 0> std::invoke_result_t> operator()(Sender&& sender) && { return ((T1 &&) t1_)(((T0 &&) t0_)((Sender &&) sender)); } template , int> = 0> std::invoke_result_t> operator()(Sender&& sender) const& { return t1_(t0_((Sender &&) sender)); } }; template struct SenderAdaptorClosure {}; template >, remove_cvref_t> && std::is_base_of_v>, remove_cvref_t>>> _Compose, remove_cvref_t> operator|(T0&& t0, T1&& t1) { return {(T0 &&) t0, (T1 &&) t1}; } template && std::is_base_of_v>, remove_cvref_t>>> std::invoke_result_t operator|(Sender&& sender, Closure&& closure) { return ((Closure &&) closure)((Sender &&) sender); } template struct _BinderBack : SenderAdaptorClosure<_BinderBack> { Func func_; std::tuple as_; template , int> = 0> std::invoke_result_t operator()(Sender&& sender) && { return std::apply( [&sender, this](As&... as) { return ((Func &&) func_)((Sender &&) sender, (As &&) as...); }, as_); } template , int> = 0> std::invoke_result_t operator()(Sender&& sender) const& { return std::apply([&sender, this](const As&... as) { return func_((Sender &&) sender, as...); }, as_); } }; } // namespace __closure using __closure::_BinderBack; } // namespace mmdeploy #endif // MMDEPLOY_CSRC_EXPERIMENTAL_EXECUTION_CLOSURE_H_