core: add macros for performing non-virtual class method dispatch
This commit is contained in:
@@ -10,6 +10,8 @@
|
|||||||
#define __B_IFACE_I0(p, x) p##x
|
#define __B_IFACE_I0(p, x) p##x
|
||||||
#define __B_IFACE_I1(p, x) __B_IFACE_I0(p, x)
|
#define __B_IFACE_I1(p, x) __B_IFACE_I0(p, x)
|
||||||
|
|
||||||
|
#define B_TYPE_FWDREF(name) struct _b_object
|
||||||
|
|
||||||
/* Type definitions macros (for use in .c source file) */
|
/* Type definitions macros (for use in .c source file) */
|
||||||
|
|
||||||
#define B_TYPE_CLASS_DEFINITION_BEGIN(type_name) \
|
#define B_TYPE_CLASS_DEFINITION_BEGIN(type_name) \
|
||||||
@@ -85,8 +87,16 @@
|
|||||||
/* Type declaration macros (for use in .h header file) */
|
/* Type declaration macros (for use in .h header file) */
|
||||||
|
|
||||||
#define B_DECLARE_TYPE(name) \
|
#define B_DECLARE_TYPE(name) \
|
||||||
typedef struct _b_object name; \
|
typedef B_TYPE_FWDREF(name) name; \
|
||||||
typedef struct _##name##_class name##_class;
|
typedef struct _##name##_class name##_class; \
|
||||||
|
static inline name *name##_ref(name *p) \
|
||||||
|
{ \
|
||||||
|
return b_object_ref(p); \
|
||||||
|
} \
|
||||||
|
static inline name *name##_unref(name *p) \
|
||||||
|
{ \
|
||||||
|
b_object_unref(p); \
|
||||||
|
}
|
||||||
|
|
||||||
#define B_TYPE_CLASS_DECLARATION_BEGIN(name) struct _##name##_class {
|
#define B_TYPE_CLASS_DECLARATION_BEGIN(name) struct _##name##_class {
|
||||||
#define B_TYPE_CLASS_DECLARATION_END(name) \
|
#define B_TYPE_CLASS_DECLARATION_END(name) \
|
||||||
@@ -101,11 +111,6 @@
|
|||||||
{ \
|
{ \
|
||||||
return b_object_create(type_id); \
|
return b_object_create(type_id); \
|
||||||
}
|
}
|
||||||
#define B_TYPE_DEFAULT_DESTRUCTOR(type_name) \
|
|
||||||
static inline void type_name##_release(type_name *p) \
|
|
||||||
{ \
|
|
||||||
b_release(p); \
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Other macros */
|
/* Other macros */
|
||||||
|
|
||||||
@@ -126,5 +131,35 @@
|
|||||||
return; \
|
return; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
#define B_CLASS_DISPATCH_STATIC(type_id, func_name, obj, ...) \
|
||||||
|
do { \
|
||||||
|
void *priv = b_object_get_private(obj, type_id); \
|
||||||
|
return func_name(priv, __VA_ARGS__); \
|
||||||
|
} while (0)
|
||||||
|
#define B_CLASS_DISPATCH_STATIC_V(type_id, func_name, obj, ...) \
|
||||||
|
do { \
|
||||||
|
void *priv = b_object_get_private(obj, type_id); \
|
||||||
|
func_name(priv, __VA_ARGS__); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define B_CLASS_DISPATCH_STATIC_0(type_id, func_name, obj) \
|
||||||
|
do { \
|
||||||
|
void *priv = b_object_get_private(obj, type_id); \
|
||||||
|
return func_name(priv); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define B_CLASS_DISPATCH_STATIC_V0(type_id, func_name, obj) \
|
||||||
|
do { \
|
||||||
|
void *priv = b_object_get_private(obj, type_id); \
|
||||||
|
func_name(priv); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#define B_DECLS_BEGIN extern "C" {
|
||||||
|
#define B_DECLS_END }
|
||||||
|
#else
|
||||||
|
#define B_DECLS_BEGIN
|
||||||
|
#define B_DECLS_END
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user