ZFFramework
 
Loading...
Searching...
No Matches
ZFMethodGenericInvoker.h
Go to the documentation of this file.
1
5
6#ifndef _ZFI_ZFMethodGenericInvoker_h_
7#define _ZFI_ZFMethodGenericInvoker_h_
8
9#include "ZFTypeIdFwd.h"
10#include "ZFArgs.h"
12
16#define ZFMETHOD_MAX_PARAM 8
17
18// ============================================================
20/* ZFMETHOD_MAX_PARAM */
24typedef void (*ZFMethodGenericInvoker)(ZF_IN_OUT const ZFArgs &zfargs);
25
26extern ZFLIB_ZFCore ZFObject *_ZFP_ZFMP_DEF;
30#define ZFMP_DEF() ((ZFObject * const &)_ZFP_ZFMP_DEF)
31
42
43// ============================================================
44template<typename T_Dummy, int n>
45zfclassNotPOD _ZFP_MtdGICk { // check whether type registered
46};
47template<typename T_Dummy>
48zfclassNotPOD _ZFP_MtdGICk<T_Dummy, 1> {
49public:
50 typedef zfindex TypeNotRegisteredBy_ZFTYPEID;
51};
52extern ZFLIB_ZFCore zfbool _ZFP_MtdGIParamCheck(
53 ZF_IN_OUT const ZFArgs &zfargs
54 , ZF_IN zfbool zfvAccessAvailable
55 , ZF_IN zfindex paramIndex
56 , ZF_IN const zfchar *paramType
57 );
58#define _ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_DECLARE_EXPAND(N, ParamType) \
59 typedef ParamType _T##N; \
60 typedef zftTraits<ParamType>::TrNoRef _TR##N; \
61 typedef _ZFP_MtdGICk< \
62 _TR##N, \
63 ZFTypeId<_TR##N>::TypeIdRegistered \
64 >::TypeNotRegisteredBy_ZFTYPEID _Ck##N;
65#define _ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_PREPARE_EXPAND(N, DefaultExpandOrEmpty, ParamType) \
66 _ZFP_MtdGIParamCheck( \
67 zfargs \
68 , ZFTypeId<_TR##N>::Value<_T##N>::zfvAccessAvailable(zfargs.paramAt(N)) \
69 , (_Ck##N)N \
70 , #ParamType \
71 )
72template<typename T_Type, typename T_Access>
73zfclassNotPOD _ZFP_MtdGIPA { // Param Access
74public:
75 typedef zfauto (Cb_pDef)(void);
76 zfauto obj;
77public:
78 explicit _ZFP_MtdGIPA(ZF_IN const zfauto &obj) : obj(obj) {}
79 T_Access a(void) {
80 return ZFTypeId<T_Type>::template Value<T_Access>::zfvAccess(this->obj);
81 }
82 T_Access a(ZF_IN Cb_pDef pDef) {
83 if(this->obj == ZFMP_DEF()) {
84 this->obj = pDef();
85 }
86 return ZFTypeId<T_Type>::template Value<T_Access>::zfvAccess(this->obj);
87 }
88public:
89 ~_ZFP_MtdGIPA(void) {
90 ZFTypeId<T_Type>::template Value<T_Access>::zfvAccessFinish(this->obj);
91 }
92};
93#define _ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_ACCESS_EXPAND(N, DefaultExpandOrEmpty, ParamType) \
94 _ZFP_MtdGIPA<_TR##N, _T##N>(zfargs.paramAt(N)).a(DefaultExpandOrEmpty(pDef##N))
95#define _ZFP_ZFMETHOD_GENERIC_PARAM_DEFAULT_ACCESS(N, DefaultExpandOrEmpty, ParamType, DefaultValueFix) \
96 DefaultExpandOrEmpty( \
97 static zfauto pDef##N(void) { \
98 zftValue<zftTraits<ParamType>::TrNoRef> paramDefault; \
99 zfauto ret; \
100 ZFTypeId<zftTraits<ParamType>::TrNoRef>::ValueStore( \
101 ret, \
102 (paramDefault.zfv DefaultValueFix())); \
103 return ret; \
104 } \
105 static void pDefGI##N(ZF_IN const ZFArgs &zfargs) { \
106 zfargs.result(pDef##N()); \
107 } \
108 )
109
110// ============================================================
111template<typename T_ReturnType>
112zfclassNotPOD _ZFP_MtdGIA { // Access with raw invoker
113public:
114 typedef T_ReturnType (*Ivk)(ZF_IN_OUT const ZFArgs &zfargs);
115public:
116 static void A(
117 ZF_IN Ivk invoke
118 , ZF_IN_OUT const ZFArgs &zfargs
119 ) {
120 T_ReturnType retTmp = invoke(zfargs);
122 typedef typename zftTraits<T_ReturnType>::TrNoRef T_ReturnTypeTmp;
123 zfauto ret;
125 zfargs.result(ret);
126 }
127 else {
128 zfargs.success(zffalse);
129 if(!zfargs.ignoreError()) {
130 zfargs.errorHint(zfstr("unable to convert return value as type \"%s\""
132 ));
133 }
134 }
135 }
136};
137template<>
138zfclassNotPOD _ZFP_MtdGIA<void> {
139public:
140 typedef void (*Ivk)(ZF_IN_OUT const ZFArgs &zfargs);
141public:
142 static void A(
143 ZF_IN Ivk invoke
144 , ZF_IN_OUT const ZFArgs &zfargs
145 ) {
146 invoke(zfargs);
147 }
148};
149
150// ============================================================
151#define _ZFP_ZFMETHOD_GENERIC_INVOKER_DECLARE( \
152 ReturnType \
153 , ParamExpandOrEmpty0, ParamType0, param0_, DefaultExpandOrEmpty0, DefaultValueFix0 \
154 , ParamExpandOrEmpty1, ParamType1, param1_, DefaultExpandOrEmpty1, DefaultValueFix1 \
155 , ParamExpandOrEmpty2, ParamType2, param2_, DefaultExpandOrEmpty2, DefaultValueFix2 \
156 , ParamExpandOrEmpty3, ParamType3, param3_, DefaultExpandOrEmpty3, DefaultValueFix3 \
157 , ParamExpandOrEmpty4, ParamType4, param4_, DefaultExpandOrEmpty4, DefaultValueFix4 \
158 , ParamExpandOrEmpty5, ParamType5, param5_, DefaultExpandOrEmpty5, DefaultValueFix5 \
159 , ParamExpandOrEmpty6, ParamType6, param6_, DefaultExpandOrEmpty6, DefaultValueFix6 \
160 , ParamExpandOrEmpty7, ParamType7, param7_, DefaultExpandOrEmpty7, DefaultValueFix7 \
161 ) \
162 private: \
163 ParamExpandOrEmpty0(_ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_DECLARE_EXPAND(0, ParamType0)) \
164 ParamExpandOrEmpty1(_ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_DECLARE_EXPAND(1, ParamType1)) \
165 ParamExpandOrEmpty2(_ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_DECLARE_EXPAND(2, ParamType2)) \
166 ParamExpandOrEmpty3(_ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_DECLARE_EXPAND(3, ParamType3)) \
167 ParamExpandOrEmpty4(_ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_DECLARE_EXPAND(4, ParamType4)) \
168 ParamExpandOrEmpty5(_ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_DECLARE_EXPAND(5, ParamType5)) \
169 ParamExpandOrEmpty6(_ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_DECLARE_EXPAND(6, ParamType6)) \
170 ParamExpandOrEmpty7(_ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_DECLARE_EXPAND(7, ParamType7)) \
171 public: \
172 ParamExpandOrEmpty0(_ZFP_ZFMETHOD_GENERIC_PARAM_DEFAULT_ACCESS(0, DefaultExpandOrEmpty0, ParamType0, DefaultValueFix0)) \
173 ParamExpandOrEmpty1(_ZFP_ZFMETHOD_GENERIC_PARAM_DEFAULT_ACCESS(1, DefaultExpandOrEmpty1, ParamType1, DefaultValueFix1)) \
174 ParamExpandOrEmpty2(_ZFP_ZFMETHOD_GENERIC_PARAM_DEFAULT_ACCESS(2, DefaultExpandOrEmpty2, ParamType2, DefaultValueFix2)) \
175 ParamExpandOrEmpty3(_ZFP_ZFMETHOD_GENERIC_PARAM_DEFAULT_ACCESS(3, DefaultExpandOrEmpty3, ParamType3, DefaultValueFix3)) \
176 ParamExpandOrEmpty4(_ZFP_ZFMETHOD_GENERIC_PARAM_DEFAULT_ACCESS(4, DefaultExpandOrEmpty4, ParamType4, DefaultValueFix4)) \
177 ParamExpandOrEmpty5(_ZFP_ZFMETHOD_GENERIC_PARAM_DEFAULT_ACCESS(5, DefaultExpandOrEmpty5, ParamType5, DefaultValueFix5)) \
178 ParamExpandOrEmpty6(_ZFP_ZFMETHOD_GENERIC_PARAM_DEFAULT_ACCESS(6, DefaultExpandOrEmpty6, ParamType6, DefaultValueFix6)) \
179 ParamExpandOrEmpty7(_ZFP_ZFMETHOD_GENERIC_PARAM_DEFAULT_ACCESS(7, DefaultExpandOrEmpty7, ParamType7, DefaultValueFix7)) \
180 public: \
181 static void GI(ZF_IN_OUT const ZFArgs &zfargs) { \
182 ParamExpandOrEmpty0( \
183 if( \
184 !_ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_PREPARE_EXPAND(0, DefaultExpandOrEmpty0, ParamType0) \
185 ParamExpandOrEmpty1(|| !_ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_PREPARE_EXPAND(1, DefaultExpandOrEmpty1, ParamType1)) \
186 ParamExpandOrEmpty2(|| !_ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_PREPARE_EXPAND(2, DefaultExpandOrEmpty2, ParamType2)) \
187 ParamExpandOrEmpty3(|| !_ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_PREPARE_EXPAND(3, DefaultExpandOrEmpty3, ParamType3)) \
188 ParamExpandOrEmpty4(|| !_ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_PREPARE_EXPAND(4, DefaultExpandOrEmpty4, ParamType4)) \
189 ParamExpandOrEmpty5(|| !_ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_PREPARE_EXPAND(5, DefaultExpandOrEmpty5, ParamType5)) \
190 ParamExpandOrEmpty6(|| !_ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_PREPARE_EXPAND(6, DefaultExpandOrEmpty6, ParamType6)) \
191 ParamExpandOrEmpty7(|| !_ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_PREPARE_EXPAND(7, DefaultExpandOrEmpty7, ParamType7)) \
192 ) { \
193 return; \
194 } \
195 ) \
196 _ZFP_MtdGIA<ReturnType>::A(I, zfargs); \
197 } \
198 private: \
199 static ReturnType I(ZF_IN_OUT const ZFArgs &zfargs) { \
200 return zfargs.ownerMethod()->_ZFP_execute<ReturnType \
201 ParamExpandOrEmpty0(ZFM_COMMA() ParamType0) \
202 ParamExpandOrEmpty1(ZFM_COMMA() ParamType1) \
203 ParamExpandOrEmpty2(ZFM_COMMA() ParamType2) \
204 ParamExpandOrEmpty3(ZFM_COMMA() ParamType3) \
205 ParamExpandOrEmpty4(ZFM_COMMA() ParamType4) \
206 ParamExpandOrEmpty5(ZFM_COMMA() ParamType5) \
207 ParamExpandOrEmpty6(ZFM_COMMA() ParamType6) \
208 ParamExpandOrEmpty7(ZFM_COMMA() ParamType7) \
209 >(zfargs.sender() \
210 ParamExpandOrEmpty0(ZFM_COMMA() _ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_ACCESS_EXPAND(0, DefaultExpandOrEmpty0, ParamType0)) \
211 ParamExpandOrEmpty1(ZFM_COMMA() _ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_ACCESS_EXPAND(1, DefaultExpandOrEmpty1, ParamType1)) \
212 ParamExpandOrEmpty2(ZFM_COMMA() _ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_ACCESS_EXPAND(2, DefaultExpandOrEmpty2, ParamType2)) \
213 ParamExpandOrEmpty3(ZFM_COMMA() _ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_ACCESS_EXPAND(3, DefaultExpandOrEmpty3, ParamType3)) \
214 ParamExpandOrEmpty4(ZFM_COMMA() _ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_ACCESS_EXPAND(4, DefaultExpandOrEmpty4, ParamType4)) \
215 ParamExpandOrEmpty5(ZFM_COMMA() _ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_ACCESS_EXPAND(5, DefaultExpandOrEmpty5, ParamType5)) \
216 ParamExpandOrEmpty6(ZFM_COMMA() _ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_ACCESS_EXPAND(6, DefaultExpandOrEmpty6, ParamType6)) \
217 ParamExpandOrEmpty7(ZFM_COMMA() _ZFP_ZFMETHOD_GENERIC_INVOKER_PARAM_ACCESS_EXPAND(7, DefaultExpandOrEmpty7, ParamType7)) \
218 ); \
219 } \
220 public:
221#define _ZFP_ZFMETHOD_GENERIC_INVOKER_ADDR(owner) \
222 owner::GI
223#define _ZFP_ZFMETHOD_GENERIC_PARAM_DEFAULT_ACCESS_ADDR(owner, DefaultExpandOrEmpty, N) \
224 ZFListener(DefaultExpandOrEmpty(ZFCallbackForFunc(owner::pDefGI##N)))
225
226// ============================================================
227extern ZFLIB_ZFCore void _ZFP_ZFMethodGenericInvoke(ZF_IN_OUT const ZFArgs &zfargs);
228extern ZFLIB_ZFCore void _ZFP_ZFMethodGenericInvokeError(
229 ZF_IN zfint pos
230 , ZF_IN const ZFArgs &zfargs
231 );
232
233#define _ZFP_ZFMethodGenericInvoke_REPEAT1(N) \
234 { \
235 zfauto tmp; \
236 typedef typename zftTraits<Type##N>::TrNoRef _Type##N; \
237 if(!ZFTypeId<_Type##N>::ValueStore(tmp, param##N)) { \
238 _ZFP_ZFMethodGenericInvokeError(N, zfargs); \
239 } \
240 else { \
241 zfargs.param(N, tmp); \
242 } \
243 }
244#define _ZFP_ZFMethodGenericInvoke_REPEAT2(N) \
245 _ZFP_MtdGII_P<Type##N, zftIsZFObject(typename zftTraits<Type##N>::TrType)>::p(param##N, zfargs.paramAt(N));
246
247#define _ZFP_ZFMethodGenericInvoke_DECLARE(N) \
248 template<typename T_ReturnType ZFM_REPEAT(N, ZFM_REPEAT_TEMPLATE, ZFM_COMMA, ZFM_COMMA)> \
249 T_ReturnType _ZFP_MtdGII( \
250 ZF_IN const ZFMethod *method \
251 , ZF_IN zfany const &obj \
252 ZFM_REPEAT(N, ZFM_REPEAT_PARAM, ZFM_COMMA, ZFM_COMMA) \
253 ) { \
254 ZFArgs zfargs; \
255 zfargs \
256 .sender(obj) \
257 .ownerMethod(method) \
258 .paramInit() \
259 ; \
260 ZFM_REPEAT(N, _ZFP_ZFMethodGenericInvoke_REPEAT1, ZFM_EMPTY, ZFM_EMPTY) \
261 _ZFP_ZFMethodGenericInvoke(zfargs); \
262 if(!zfargs.success()) { \
263 _ZFP_ZFMethodGenericInvokeError(-1, zfargs); \
264 } \
265 ZFM_REPEAT(N, _ZFP_ZFMethodGenericInvoke_REPEAT2, ZFM_EMPTY, ZFM_EMPTY) \
266 return _ZFP_MtdGII_R<T_ReturnType>::r(zfargs); \
267 }
268
269template<typename T_ParamType, int isZFObject>
270zfclassNotPOD _ZFP_MtdGII_P; // Param access
271template<typename T_ParamType>
272zfclassNotPOD _ZFP_MtdGII_P<T_ParamType, 0> {
273public:
274 static inline void p(
275 ZF_IN_OUT T_ParamType p
276 , ZF_IN_OUT zfauto &h
277 ) {
278 }
279};
280template<typename T_ParamType>
281zfclassNotPOD _ZFP_MtdGII_P<T_ParamType, 1> {
282public:
283 static inline void p(
284 ZF_IN_OUT T_ParamType p
285 , ZF_IN_OUT zfauto &h
286 ) {
287 }
288};
289template<typename T_ParamType>
290zfclassNotPOD _ZFP_MtdGII_P<T_ParamType const &, 0> {
291public:
292 static inline void p(
293 ZF_IN_OUT T_ParamType const &p
294 , ZF_IN_OUT zfauto &h
295 ) {
296 }
297};
298template<typename T_ParamType>
299zfclassNotPOD _ZFP_MtdGII_P<const T_ParamType *, 0> {
300public:
301 static inline void p(
302 ZF_IN_OUT const T_ParamType *p
303 , ZF_IN_OUT zfauto &h
304 ) {
305 }
306};
307template<>
308zfclassNotPOD _ZFP_MtdGII_P<const void *, 0> {
309public:
310 static inline void p(
311 ZF_IN_OUT const void *p
312 , ZF_IN_OUT zfauto &h
313 ) {
314 }
315};
316template<>
317zfclassNotPOD _ZFP_MtdGII_P<void *, 0> {
318public:
319 static inline void p(
320 ZF_IN_OUT void *p
321 , ZF_IN_OUT zfauto &h
322 ) {
323 }
324};
325template<typename T_ParamType>
326zfclassNotPOD _ZFP_MtdGII_P<T_ParamType &, 0> {
327public:
328 static void p(
329 ZF_IN_OUT T_ParamType &p
330 , ZF_IN_OUT zfauto &h
331 ) {
332 typedef typename zftTraits<T_ParamType &>::TrNoRef _Type;
333 p = ZFTypeId<_Type>::template Value<T_ParamType &>::zfvAccess(h);
334 ZFTypeId<_Type>::template Value<T_ParamType &>::zfvAccessFinish(h);
335 }
336};
337template<typename T_ParamType>
338zfclassNotPOD _ZFP_MtdGII_P<T_ParamType *, 0> {
339public:
340 static void p(
341 ZF_IN_OUT T_ParamType *p
342 , ZF_IN_OUT zfauto &h
343 ) {
344 typedef typename zftTraits<T_ParamType *>::TrNoRef _Type;
345 if(p) {
346 *p = ZFTypeId<_Type>::template Value<T_ParamType const &>::zfvAccess(h);
347 ZFTypeId<_Type>::template Value<T_ParamType const &>::zfvAccessFinish(h);
348 }
349 }
350};
351
352template<typename T_ReturnType>
353zfclassNotPOD _ZFP_MtdGII_R { // Return access
354public:
355 static T_ReturnType r(ZF_IN const ZFArgs &zfargs) {
356 typedef typename zftTraits<T_ReturnType>::TrNoRef _T_ReturnType;
357 if(!ZFTypeId<_T_ReturnType>::template Value<T_ReturnType>::zfvAccessAvailable(zfargs.result())) {
358 _ZFP_ZFMethodGenericInvokeError(-2, zfargs);
359 }
360 return ZFTypeId<_T_ReturnType>::template Value<T_ReturnType>::zfvAccess(zfargs.result());
361 }
362};
363template<>
364zfclassNotPOD _ZFP_MtdGII_R<void> {
365public:
366 static void r(ZF_IN const ZFArgs &zfargs) {
367 }
368};
369
370_ZFP_ZFMethodGenericInvoke_DECLARE(0)
371_ZFP_ZFMethodGenericInvoke_DECLARE(1)
372_ZFP_ZFMethodGenericInvoke_DECLARE(2)
373_ZFP_ZFMethodGenericInvoke_DECLARE(3)
374_ZFP_ZFMethodGenericInvoke_DECLARE(4)
375_ZFP_ZFMethodGenericInvoke_DECLARE(5)
376_ZFP_ZFMethodGenericInvoke_DECLARE(6)
377_ZFP_ZFMethodGenericInvoke_DECLARE(7)
378_ZFP_ZFMethodGenericInvoke_DECLARE(8)
379
381#endif // #ifndef _ZFI_ZFMethodGenericInvoker_h_
382
params for ZFListener
#define ZFLIB_ZFCore
used to export symbols
Definition ZFCoreEnvDef.h:30
#define ZFCoreMutexLocker()
util method to lock current block
Definition ZFCoreMutex.h:95
_ZFT_t_zfchar zfchar
char wrapper
Definition ZFCoreTypeDef_CharType.h:17
#define ZF_IN
dummy macro that shows the param used as required input
Definition ZFCoreTypeDef_ClassType.h:180
#define zfclassNotPOD
shows the class is not a POD type, you should not memset it or declare it in stack or copy value by c...
Definition ZFCoreTypeDef_ClassType.h:48
#define ZF_IN_OUT
dummy macro that shows the param used as required input and output
Definition ZFCoreTypeDef_ClassType.h:196
#define zfclassFwd
forward declaration of a class type
Definition ZFCoreTypeDef_ClassType.h:31
_ZFT_t_zfbool zfbool
bool type
Definition ZFCoreTypeDef_CoreType.h:103
_ZFT_t_zfindex zfindex
similar to size_t, used for index and size only
Definition ZFCoreTypeDef_CoreType.h:154
_ZFT_t_zfint zfint
same as int, see zfindex
Definition ZFCoreTypeDef_CoreType.h:165
#define zffalse
bool false type
Definition ZFCoreTypeDef_CoreType.h:111
void(* ZFMethodGenericInvoker)(const ZFArgs &zfargs)
generic invoker for advanced reflection, see ZFMethod::methodGenericInvoker
Definition ZFMethodGenericInvoker.h:24
#define ZFMP_DEF()
mark the object as default param
Definition ZFMethodGenericInvoker.h:30
zfbool ZFMethodGenericInvokerParamsCheck(const ZFArgs &zfargs)
util method for ZFMethodGenericInvoker to check whether all param type match
#define ZF_NAMESPACE_GLOBAL_BEGIN
begin namespace ZFFramework
Definition ZFNamespace.h:97
#define ZF_NAMESPACE_GLOBAL_END
end namespace ZFFramework
Definition ZFNamespace.h:98
reflectable type define
listener data used by ZFListener
Definition ZFArgs.h:20
reflectable method for ZFObject
Definition ZFMethod.h:252
base class of all objects
Definition ZFObjectCore.h:209
type data traits for ZFTYPEID_DECLARE
Definition ZFTypeIdFwd.h:117
static const zfstring & TypeId(void)
get type id, or return ZFTypeId_none if not registered
static zfbool ValueStore(zfauto &obj, T_Type const &v)
store the value to wrapper object
a ZFObject holder which would release content object automatically when destroyed
Definition zfautoFwd.h:34
T_Type TrNoRef
remove reference
Definition ZFCoreUtilTemplate.h:110
zfstring zfstr(const zfchar *fmt=zft_zfnull)
string format util
Definition zfstr.h:59