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

@@ -7,8 +7,10 @@
#include <blue/core/type.h> #include <blue/core/type.h>
#include <stdlib.h> #include <stdlib.h>
#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) */
@@ -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