Loading [MathJax]/extensions/tex2jax.js
 |
Free Electron
|
5 #define DERIVE_FROM_TYPE(t) t t##_parent 6 #define STATIC_CAST(to, obj) (&(obj)->to##_parent) 8 #define STATIC_UPCAST(to, from, obj) __extension__({ \ 9 static_assert(__builtin_types_compatible_p(from, __typeof(*(obj))), \ 10 "Invalid upcast object from type"); \ 11 (to*)((char*)(obj) - offsetof(to, from##_parent)); \ 14 #define STATIC_UPCAST(to, from, obj) ((to*)((char*)(obj) - offsetof(to, from##_parent))) 18 #define DECLARE_FORWARD(T1, T2, rettype, func) \ 19 rettype T1##_##func(T1 *obj) \ 20 { return T2##_##func(STATIC_CAST(T2, obj)); } 22 #define DECLARE_FORWARD1(T1, T2, rettype, func, argtype1) \ 23 rettype T1##_##func(T1 *obj, argtype1 a) \ 24 { return T2##_##func(STATIC_CAST(T2, obj), a); } 26 #define DECLARE_FORWARD2(T1, T2, rettype, func, argtype1, argtype2) \ 27 rettype T1##_##func(T1 *obj, argtype1 a, argtype2 b) \ 28 { return T2##_##func(STATIC_CAST(T2, obj), a, b); } 30 #define DECLARE_FORWARD3(T1, T2, rettype, func, argtype1, argtype2, argtype3) \ 31 rettype T1##_##func(T1 *obj, argtype1 a, argtype2 b, argtype3 c) \ 32 { return T2##_##func(STATIC_CAST(T2, obj), a, b, c); } 35 #define DECLARE_THUNK(T1, T2, rettype, func) \ 36 static rettype T1##_##T2##_##func(T2 *obj) \ 37 { return T1##_##func(STATIC_UPCAST(T1, T2, obj)); } 39 #define DECLARE_THUNK1(T1, T2, rettype, func, argtype1) \ 40 static rettype T1##_##T2##_##func(T2 *obj, argtype1 a) \ 41 { return T1##_##func(STATIC_UPCAST(T1, T2, obj), a); } 43 #define DECLARE_THUNK2(T1, T2, rettype, func, argtype1, argtype2) \ 44 static rettype T1##_##T2##_##func(T2 *obj, argtype1 a, argtype2 b) \ 45 { return T1##_##func(STATIC_UPCAST(T1, T2, obj), a, b); } 47 #define DECLARE_THUNK3(T1, T2, rettype, func, argtype1, argtype2, argtype3) \ 48 static rettype T1##_##T2##_##func(T2 *obj, argtype1 a, argtype2 b, argtype3 c) \ 49 { return T1##_##func(STATIC_UPCAST(T1, T2, obj), a, b, c); } 51 #define DECLARE_THUNK4(T1, T2, rettype, func, argtype1, argtype2, argtype3, argtype4) \ 52 static rettype T1##_##T2##_##func(T2 *obj, argtype1 a, argtype2 b, argtype3 c, argtype4 d) \ 53 { return T1##_##func(STATIC_UPCAST(T1, T2, obj), a, b, c, d); } 56 #define DECLARE_DEFAULT_ALLOCATORS(T) \ 57 static void* T##_New(size_t size) { return al_malloc(16, size); } \ 58 static void T##_Delete(void *ptr) { al_free(ptr); } 62 #define EXTRACT_VCALL_ARGS(...) __VA_ARGS__)) 65 #define V(obj, func) ((obj)->vtbl->func((obj), EXTRACT_VCALL_ARGS 67 #define V0(obj, func) ((obj)->vtbl->func((obj) EXTRACT_VCALL_ARGS 71 #define EXTRACT_NEW_ARGS(...) __VA_ARGS__); \ 76 #define NEW_OBJ(_res, T) do { \ 77 _res = T##_New(sizeof(T)); \ 80 memset(_res, 0, sizeof(T)); \ 81 T##_Construct(_res, EXTRACT_NEW_ARGS 83 #define NEW_OBJ0(_res, T) do { \ 84 _res = T##_New(sizeof(T)); \ 87 memset(_res, 0, sizeof(T)); \ 88 T##_Construct(_res EXTRACT_NEW_ARGS 91 #define DELETE_OBJ(obj) do { \ 94 V0((obj),Destruct)(); \ 101 #define GET_VTABLE2(T1, T2) (&(T1##_##T2##_vtable)) 103 #define SET_VTABLE2(T1, T2, obj) (STATIC_CAST(T2, obj)->vtbl = GET_VTABLE2(T1, T2))