13 #ifndef ML_WRAPPER_MACROS_H
14 #define ML_WRAPPER_MACROS_H
51 #ifndef ML_EMPTY_SPACE
52 #define ML_EMPTY_SPACE
79 #define IMPLEMENT_DIM_DISPATCHER_P0(FUNC_NAME, CLASS_NAME, RET_TYPE, RET_COMMAND) \
81 typedef RET_TYPE(*FUNC_NAME##TYPE)(CLASS_NAME *obj); \
84 FUNC_NAME##TYPE FUNC_NAME; \
87 static inline RET_TYPE FUNC_NAME##1DCB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##1D(); } \
88 static inline RET_TYPE FUNC_NAME##2DCB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##2D(); } \
89 static inline RET_TYPE FUNC_NAME##3DCB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##3D(); } \
90 static inline RET_TYPE FUNC_NAME##4DCB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##4D(); } \
91 static inline RET_TYPE FUNC_NAME##5DCB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##5D(); } \
92 static inline RET_TYPE FUNC_NAME##6DCB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##6D(); } \
95 void _init##FUNC_NAME##TYPE(MLint dim){ \
97 case 1: FUNC_NAME = FUNC_NAME##1DCB; break; \
98 case 2: FUNC_NAME = FUNC_NAME##2DCB; break; \
99 case 3: FUNC_NAME = FUNC_NAME##3DCB; break; \
100 case 4: FUNC_NAME = FUNC_NAME##4DCB; break; \
101 case 5: FUNC_NAME = FUNC_NAME##5DCB; break; \
102 case 6: FUNC_NAME = FUNC_NAME##6DCB; break; \
103 default: ML_PRINT_FATAL_ERROR("IMPLEMENT_DIM_DISPATCHER_P0", ML_PROGRAMMING_ERROR, \
104 "Using 6d implementation."); \
112 #define IMPLEMENT_DIM_DISPATCHER_P1(FUNC_NAME, CLASS_NAME, RET_TYPE, RET_COMMAND, P_TYPE) \
114 typedef RET_TYPE(*FUNC_NAME##TYPE)(CLASS_NAME *obj, P_TYPE p); \
117 FUNC_NAME##TYPE FUNC_NAME; \
120 static inline RET_TYPE FUNC_NAME##1DCB(CLASS_NAME *obj, P_TYPE p){RET_COMMAND obj->FUNC_NAME##1D(p);} \
121 static inline RET_TYPE FUNC_NAME##2DCB(CLASS_NAME *obj, P_TYPE p){RET_COMMAND obj->FUNC_NAME##2D(p);} \
122 static inline RET_TYPE FUNC_NAME##3DCB(CLASS_NAME *obj, P_TYPE p){RET_COMMAND obj->FUNC_NAME##3D(p);} \
123 static inline RET_TYPE FUNC_NAME##4DCB(CLASS_NAME *obj, P_TYPE p){RET_COMMAND obj->FUNC_NAME##4D(p);} \
124 static inline RET_TYPE FUNC_NAME##5DCB(CLASS_NAME *obj, P_TYPE p){RET_COMMAND obj->FUNC_NAME##5D(p);} \
125 static inline RET_TYPE FUNC_NAME##6DCB(CLASS_NAME *obj, P_TYPE p){RET_COMMAND obj->FUNC_NAME##6D(p);} \
128 void _init##FUNC_NAME##TYPE(MLint dim){ \
130 case 1: FUNC_NAME = FUNC_NAME##1DCB; break; \
131 case 2: FUNC_NAME = FUNC_NAME##2DCB; break; \
132 case 3: FUNC_NAME = FUNC_NAME##3DCB; break; \
133 case 4: FUNC_NAME = FUNC_NAME##4DCB; break; \
134 case 5: FUNC_NAME = FUNC_NAME##5DCB; break; \
135 case 6: FUNC_NAME = FUNC_NAME##6DCB; break; \
136 default: ML_PRINT_FATAL_ERROR("IMPLEMENT_DIM_DISPATCHER_P1", ML_PROGRAMMING_ERROR, \
137 "Using 6d implementation."); \
166 #define IMPLEMENT_EXC_DISPATCHER_P0(FUNC_NAME, CLASS_NAME, RET_TYPE, RET_COMMAND) \
168 typedef RET_TYPE(*FUNC_NAME##TYPE)(CLASS_NAME *obj); \
172 FUNC_NAME##TYPE FUNC_NAME##1; \
173 FUNC_NAME##TYPE FUNC_NAME##2; \
174 FUNC_NAME##TYPE FUNC_NAME##3; \
175 FUNC_NAME##TYPE FUNC_NAME##4; \
176 FUNC_NAME##TYPE FUNC_NAME##5; \
177 FUNC_NAME##TYPE FUNC_NAME##6; \
180 static inline RET_TYPE FUNC_NAME##1##CB (CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##1N ();} \
181 static inline RET_TYPE FUNC_NAME##2##CB (CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##2N ();} \
182 static inline RET_TYPE FUNC_NAME##3##CB (CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##3N ();} \
183 static inline RET_TYPE FUNC_NAME##4##CB (CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##4N ();} \
184 static inline RET_TYPE FUNC_NAME##5##CB (CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##5N ();} \
185 static inline RET_TYPE FUNC_NAME##6##CB (CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##6N ();} \
187 static inline RET_TYPE FUNC_NAME##1E##CB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##1E();} \
188 static inline RET_TYPE FUNC_NAME##2E##CB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##2E();} \
189 static inline RET_TYPE FUNC_NAME##3E##CB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##3E();} \
190 static inline RET_TYPE FUNC_NAME##4E##CB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##4E();} \
191 static inline RET_TYPE FUNC_NAME##5E##CB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##5E();} \
192 static inline RET_TYPE FUNC_NAME##6E##CB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##6E();} \
195 void _init##FUNC_NAME##TYPE(bool useExceptions){ \
198 FUNC_NAME##1 = useExceptions ? FUNC_NAME##1E##CB : FUNC_NAME##1##CB; \
199 FUNC_NAME##2 = useExceptions ? FUNC_NAME##2E##CB : FUNC_NAME##2##CB; \
200 FUNC_NAME##3 = useExceptions ? FUNC_NAME##3E##CB : FUNC_NAME##3##CB; \
201 FUNC_NAME##4 = useExceptions ? FUNC_NAME##4E##CB : FUNC_NAME##4##CB; \
202 FUNC_NAME##5 = useExceptions ? FUNC_NAME##5E##CB : FUNC_NAME##5##CB; \
203 FUNC_NAME##6 = useExceptions ? FUNC_NAME##6E##CB : FUNC_NAME##6##CB; \