core: object: add more virtual function dispatch macros

This commit is contained in:
2025-10-24 12:31:51 +01:00
parent ed105307c7
commit 8840971d83

View File

@@ -10,8 +10,6 @@
#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) \
@@ -65,6 +63,7 @@
&type_info->t_interfaces[type_info->t_nr_interfaces++]) &type_info->t_interfaces[type_info->t_nr_interfaces++])
#define B_TYPE_CLASS(class_struct) \ #define B_TYPE_CLASS(class_struct) \
type_info->t_class_size = sizeof(class_struct) type_info->t_class_size = sizeof(class_struct)
#define B_TYPE_FLAGS(flags) type_info->t_flags = (flags)
#define B_TYPE_INSTANCE_INIT(func) type_info->t_instance_init = (func) #define B_TYPE_INSTANCE_INIT(func) type_info->t_instance_init = (func)
#define B_TYPE_INSTANCE_FINI(func) type_info->t_instance_fini = (func) #define B_TYPE_INSTANCE_FINI(func) type_info->t_instance_fini = (func)
@@ -114,23 +113,46 @@
/* Other macros */ /* Other macros */
#define B_CLASS_DISPATCH_VIRTUAL(type_name, type_id, object, func, ...) \ #define B_CLASS_DISPATCH_VIRTUAL( \
type_name, type_id, default_value, func, object, ...) \
do { \ do { \
type_name##_class *iface \ type_name##_class *iface \
= b_object_get_interface(object, type_id); \ = b_object_get_interface(object, type_id); \
if (iface && iface->func) { \ if (iface && iface->func) { \
return iface->func(__VA_ARGS__); \ return iface->func(object, __VA_ARGS__); \
} else { \
return default_value; \
} \ } \
} while (0) } while (0)
#define B_CLASS_DISPATCH_VIRTUAL_V(type_name, type_id, object, func, ...) \ #define B_CLASS_DISPATCH_VIRTUAL_0(type_name, type_id, default_value, func, object) \
do { \ do { \
type_name##_class *iface \ type_name##_class *iface \
= b_object_get_interface(object, type_id); \ = b_object_get_interface(object, type_id); \
if (iface && iface->func) { \ if (iface && iface->func) { \
iface->func(__VA_ARGS__); \ return iface->func(object); \
} else { \
return default_value; \
} \
} while (0)
#define B_CLASS_DISPATCH_VIRTUAL_V(type_name, type_id, func, object, ...) \
do { \
type_name##_class *iface \
= b_object_get_interface(object, type_id); \
if (iface && iface->func) { \
iface->func(object, __VA_ARGS__); \
return; \ return; \
} \ } \
} while (0) } while (0)
#define B_CLASS_DISPATCH_VIRTUAL_V0(type_name, type_id, func, object) \
do { \
type_name##_class *iface \
= b_object_get_interface(object, type_id); \
if (iface && iface->func) { \
iface->func(object); \
return; \
} \
} while (0)
#define B_CLASS_DISPATCH_STATIC(type_id, func_name, obj, ...) \ #define B_CLASS_DISPATCH_STATIC(type_id, func_name, obj, ...) \
do { \ do { \
void *priv = b_object_get_private(obj, type_id); \ void *priv = b_object_get_private(obj, type_id); \