"ScL Feature"/
ScL Feature 0.0.1
C++20 composable proxy wrapper with pluggable executor strategy
Loading...
Searching...
No Matches
access.h
Go to the documentation of this file.
1#pragma once
2
6
8
9#include <type_traits>
10
29#define SCL_EXECUTOR_ACCESS(cv_ref) \
30 ::scl::feature::executor_trait<s_c_l_type>::executor(static_cast<s_c_l_type cv_ref>(*this))
31
40#define SCL_ACCESS_DECLVAL(cv_ref) \
41 s_c_l_executor_type::access(::std::declval<s_c_l_executor_type cv_ref>())
42
56#define SCL_EXECUTE_OVERRIDED(name, cv_ref) \
57 s_c_l_executor_type::execute(SCL_EXECUTOR_ACCESS(cv_ref), \
58 [](auto && scl_e, ScLArgs &&... values) -> decltype(auto) { \
59 return s_c_l_executor_type::access(::std::forward<decltype(scl_e)>(scl_e)) \
60 .name(::scl::wrapper_cast(::std::forward<ScLArgs>(values))...); \
61 }, SCL_EXECUTOR_ACCESS(cv_ref), ::std::forward<ScLArgs>(scl_args)...)
62
73#define SCL_EXECUTE_TEMPLATE_OVERRIDED(caller, cv_ref) \
74 s_c_l_executor_type::execute(SCL_EXECUTOR_ACCESS(cv_ref), \
75 [](auto && scl_e, ScLArgs &&... values) -> decltype(auto) { \
76 return caller::template call<ScLParam, ScLParams...>( \
77 s_c_l_executor_type::access(::std::forward<decltype(scl_e)>(scl_e)), \
78 ::std::forward<ScLArgs>(values)...); \
79 }, SCL_EXECUTOR_ACCESS(cv_ref), ::std::forward<ScLArgs>(scl_args)...)
80
93#define SCL_FRIEND_EXECUTOR_ACCESS(scl_self, cv_ref) \
94 ::scl::feature::executor_trait<s_c_l_type>::executor(::std::forward<s_c_l_type cv_ref>(scl_self))
95
107#define SCL_FRIEND_EXECUTE_OVERRIDED(name, scl_self, cv_ref) \
108 s_c_l_executor_type::execute(SCL_FRIEND_EXECUTOR_ACCESS(scl_self, cv_ref), \
109 [](auto && scl_e, ScLArgs &&... values) -> decltype(auto) { \
110 return s_c_l_executor_type::access(::std::forward<decltype(scl_e)>(scl_e)) \
111 .name(::scl::wrapper_cast(::std::forward<ScLArgs>(values))...); \
112 }, SCL_FRIEND_EXECUTOR_ACCESS(scl_self, cv_ref), ::std::forward<ScLArgs>(scl_args)...)
113
124#define SCL_FRIEND_EXECUTE_TEMPLATE_OVERRIDED(caller, scl_self, cv_ref) \
125 s_c_l_executor_type::execute(SCL_FRIEND_EXECUTOR_ACCESS(scl_self, cv_ref), \
126 [](auto && scl_e, ScLArgs &&... values) -> decltype(auto) { \
127 return caller::template call<ScLParam, ScLParams...>( \
128 s_c_l_executor_type::access(::std::forward<decltype(scl_e)>(scl_e)), \
129 ::std::forward<ScLArgs>(values)...); \
130 }, SCL_FRIEND_EXECUTOR_ACCESS(scl_self, cv_ref), ::std::forward<ScLArgs>(scl_args)...)
131
144#define SCL_FRIEND_EXECUTE_OVERRIDED_NX(op, cv_ref) \
145 s_c_l_executor_type::execute(::std::declval<s_c_l_executor_type cv_ref>(), \
146 [](auto && scl_e, ScLArgs &&... values) -> decltype(auto) { \
147 return s_c_l_executor_type::access(::std::forward<decltype(scl_e)>(scl_e)) \
148 .op(::scl::wrapper_cast(::std::forward<ScLArgs>(values))...); \
149 }, ::std::declval<s_c_l_executor_type cv_ref>(), ::std::forward<ScLArgs>(scl_args)...)
150
160#define SCL_FRIEND_EXECUTE_TEMPLATE_OVERRIDED_NX(caller, cv_ref) \
161 s_c_l_executor_type::execute(::std::declval<s_c_l_executor_type cv_ref>(), \
162 [](auto && scl_e, ScLArgs &&... values) -> decltype(auto) { \
163 return caller::template call<ScLParam, ScLParams...>( \
164 s_c_l_executor_type::access(::std::forward<decltype(scl_e)>(scl_e)), \
165 ::std::forward<ScLArgs>(values)...); \
166 }, ::std::declval<s_c_l_executor_type cv_ref>(), ::std::forward<ScLArgs>(scl_args)...)
167
182#define SCL_FRIEND_REVERSE_EXECUTE(op, scl_self, scl_lhs, cv_ref) \
183 s_c_l_executor_type::execute(SCL_FRIEND_EXECUTOR_ACCESS(scl_self, cv_ref), \
184 [](auto && scl_e, auto && scl_l) -> decltype(auto) { \
185 return ::std::forward<decltype(scl_l)>(scl_l) \
186 op s_c_l_executor_type::access(::std::forward<decltype(scl_e)>(scl_e)); \
187 }, SCL_FRIEND_EXECUTOR_ACCESS(scl_self, cv_ref), ::std::forward<ScLLhs>(scl_lhs))
188
200#define SCL_FRIEND_REVERSE_EXECUTE_NX(op, cv_ref) \
201 s_c_l_executor_type::execute(::std::declval<s_c_l_executor_type cv_ref>(), \
202 [](auto && scl_e, auto && scl_l) -> decltype(auto) { \
203 return ::std::forward<decltype(scl_l)>(scl_l) \
204 op s_c_l_executor_type::access(::std::forward<decltype(scl_e)>(scl_e)); \
205 }, ::std::declval<s_c_l_executor_type cv_ref>(), ::std::declval<ScLLhs>())
Executor type traits: interface detection and noexcept helpers.