core: add macros for performing non-virtual class method dispatch

This commit is contained in:
2025-10-18 21:41:40 +01:00
parent 4d75a572c4
commit 503dc56328

View File

@@ -10,6 +10,8 @@
#define __B_IFACE_I0(p, x) 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) */
#define B_TYPE_CLASS_DEFINITION_BEGIN(type_name) \
@@ -85,8 +87,16 @@
/* Type declaration macros (for use in .h header file) */
#define B_DECLARE_TYPE(name) \
typedef struct _b_object name; \
typedef struct _##name##_class name##_class;
typedef B_TYPE_FWDREF(name) name; \
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_END(name) \
@@ -101,11 +111,6 @@
{ \
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 */
@@ -126,5 +131,35 @@
return; \
} \
} 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