"ScL Feature"/
SCL Feature 0.0.1
C++20 composable proxy wrapper with pluggable executor strategy
Loading...
Searching...
No Matches
method.h
Go to the documentation of this file.
1#pragma once
2
37
41#include <scl/utility/preprocessor/forward.h>
42
43#include <type_traits>
44#include <utility>
45
53#define SCL_VALUE_DECLVAL(cv_ref) \
54 S_c_L_executor_type_::value(::std::declval<S_c_L_executor_type_ cv_ref>())
55
64#define SCL_VALUE_ACCESS(cv_ref) \
65 S_c_L_executor_type_::value(::scl::feature::executor_trait<S_c_L_type_>::executor( \
66 ::std::forward<S_c_L_type_ cv_ref>(*this)))
67
70#define SCL_REFLECT_METHOD_BASE(method, cv_ref) \
71 requires requires { SCL_VALUE_DECLVAL(cv_ref).method(::std::declval<A_r_g_s__>()...); } && \
72 method##_S_c_L_quals_<decltype(SCL_VALUE_DECLVAL(cv_ref)), A_r_g_s__...> \
73 { \
74 return SCL_VALUE_ACCESS(cv_ref).method(::std::forward<A_r_g_s__>(a_r_g_s__)...); \
75 }
76
90#define SCL_REFLECT_TEMPLATE_METHOD_BASE(method, CALLER, cv_ref) \
91 requires requires { \
92 CALLER::template call<P_a_r_a_m__, P_a_r_a_m_s__...>(SCL_VALUE_DECLVAL(cv_ref), \
93 ::std::declval<A_r_g_s__>()...); \
94 } { \
95 return CALLER::template call<P_a_r_a_m__, P_a_r_a_m_s__...>(SCL_VALUE_ACCESS(cv_ref), \
96 ::std::forward<A_r_g_s__>(a_r_g_s__)...); \
97 }
98
102#define SCL_REFLECT_METHOD_HELPER(method, CALLER, cv_ref) \
103 template <typename... A_r_g_s__> \
104 constexpr decltype(auto) method(A_r_g_s__ &&... a_r_g_s__) cv_ref SCL_REFLECT_METHOD_BASE(method, \
105 SCL_FORWARD(cv_ref)) template <typename P_a_r_a_m__, typename... P_a_r_a_m_s__, typename... A_r_g_s__> \
106 constexpr decltype(auto) method(A_r_g_s__ &&... a_r_g_s__) \
107 cv_ref SCL_REFLECT_TEMPLATE_METHOD_BASE(SCL_FORWARD(method), CALLER, SCL_FORWARD(cv_ref))
108
223#define SCL_REFLECT_METHOD(method) \
224 struct method##_S_c_L_caller_ \
225 { \
226 template <typename P_a_r_a_m___, typename... P_a_r_a_m_s___, typename O_b_j___, typename... A_r_g_s___> \
227 static constexpr auto call(O_b_j___ && o_b_j___, A_r_g_s___ &&... a_r_g_s___) \
228 -> decltype(::std::forward<O_b_j___>(o_b_j___).template method<P_a_r_a_m___, P_a_r_a_m_s___...>( \
229 ::std::forward<A_r_g_s___>(a_r_g_s___)...)) \
230 { \
231 return ::std::forward<O_b_j___>(o_b_j___).template method<P_a_r_a_m___, P_a_r_a_m_s___...>( \
232 ::std::forward<A_r_g_s___>(a_r_g_s___)...); \
233 } \
234 }; \
235 template <typename S_c_L_V___, typename... S_c_L_A___> \
236 static constexpr bool method##_S_c_L_quals_ = SCL_HAS_QUALIFIED_METHOD(SCL_FORWARD(method), \
237 S_c_L_V___, S_c_L_A___...); \
238 SCL_REFLECT_METHOD_HELPER(SCL_FORWARD(method), method##_S_c_L_caller_, &) \
239 SCL_REFLECT_METHOD_HELPER(SCL_FORWARD(method), method##_S_c_L_caller_, &&) \
240 SCL_REFLECT_METHOD_HELPER(SCL_FORWARD(method), method##_S_c_L_caller_, const &) \
241 SCL_REFLECT_METHOD_HELPER(SCL_FORWARD(method), method##_S_c_L_caller_, const &&) \
242 SCL_REFLECT_METHOD_HELPER(SCL_FORWARD(method), method##_S_c_L_caller_, volatile &) \
243 SCL_REFLECT_METHOD_HELPER(SCL_FORWARD(method), method##_S_c_L_caller_, volatile &&) \
244 SCL_REFLECT_METHOD_HELPER(SCL_FORWARD(method), method##_S_c_L_caller_, const volatile &) \
245 SCL_REFLECT_METHOD_HELPER(SCL_FORWARD(method), method##_S_c_L_caller_, const volatile &&)
Customization point for locating the executor inside a wrapper type.
Compile-time predicate macro for cv-ref qualifier detection.
Macro for declaring the wrapper type used by reflection macros.