// Copyright (c) OpenMMLab. All rights reserved. // Modified from // https://github.com/brycelelbach/wg21_p2300_std_execution/blob/main/include/__utility.hpp #ifndef MMDEPLOY_CSRC_EXPERIMENTAL_EXECUTION_UTILITY_H_ #define MMDEPLOY_CSRC_EXPERIMENTAL_EXECUTION_UTILITY_H_ #include #include #include "core/mpl/detected.h" #include "tag_invoke.h" #define MMDEPLOY_REQUIRES(...) std::enable_if_t<__VA_ARGS__, int> = 0 namespace mmdeploy { template using _decays_to = std::enable_if_t, E>::value, U>; template using __decayed_tuple = std::tuple...>; template using __call_result_t = decltype(std::declval()(std::declval()...)); template struct __conv { F f_; using type = __call_result_t; operator type() && { return ((F &&) f_)(); } }; template __conv(F)->__conv; template >> struct __conv_proxy { T v_; template explicit __conv_proxy(F&& f) : v_(((F &&) f)()) {} T& operator*() noexcept { return v_; } }; template _Member _Self::*__memptr(const _Self&); template using __member_t = decltype((std::declval<_Self>().*__memptr<_Member>(std::declval<_Self>()))); template using _copy_cvref_t = __member_t; template using connect_result_t = decltype(Connect(std::declval(), std::declval())); template struct _types #if defined(__GNUC__) && !defined(__clang__) { } #endif ; namespace __schedule { struct schedule_t { template , int> = 0> auto operator()(Scheduler&& scheduler) const -> tag_invoke_result_t { return tag_invoke(schedule_t{}, (Scheduler &&) scheduler); } }; } // namespace __schedule using __schedule::schedule_t; inline constexpr schedule_t Schedule{}; template using schedule_result_t = decltype(std::declval()(std::declval())); } // namespace mmdeploy #endif // MMDEPLOY_CSRC_EXPERIMENTAL_EXECUTION_UTILITY_H_