"ScL Feature"
/
SCL Feature
0.0.1
C++20 composable proxy wrapper with pluggable executor strategy
Toggle main menu visibility
Loading...
Searching...
No Matches
method.h
Go to the documentation of this file.
1
#pragma once
2
37
38
#include <
scl/feature/reflection/type.h
>
39
#include <
scl/feature/type_traits/executor.h
>
40
#include <
scl/feature/type_traits/has_qualified_method.h
>
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 &&)
executor.h
Customization point for locating the executor inside a wrapper type.
has_qualified_method.h
Compile-time predicate macro for cv-ref qualifier detection.
type.h
Macro for declaring the wrapper type used by reflection macros.
src
scl
feature
reflection
method.h
Generated by
1.18.0