core: add macros for performing non-virtual class method dispatch
This commit is contained in:
@@ -7,8 +7,10 @@
|
||||
#include <blue/core/type.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#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
|
||||
|
||||
Reference in New Issue
Block a user