From 503dc563287ad76309464409ddfadfad8f77b0ee Mon Sep 17 00:00:00 2001 From: Max Wash Date: Sat, 18 Oct 2025 21:41:40 +0100 Subject: [PATCH] core: add macros for performing non-virtual class method dispatch --- core/include/blue/core/macros.h | 53 +++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/core/include/blue/core/macros.h b/core/include/blue/core/macros.h index 3e5a42d..d9c26ca 100644 --- a/core/include/blue/core/macros.h +++ b/core/include/blue/core/macros.h @@ -7,8 +7,10 @@ #include #include -#define __B_IFACE_I0(p, x) p##x -#define __B_IFACE_I1(p, x) __B_IFACE_I0(p, x) +#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) */ @@ -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