feat: mirror get_typeid does not require self argument
parent
faf0463e37
commit
96323d7abc
16
mirror.h
16
mirror.h
|
@ -11,7 +11,7 @@ typedef uintptr_t typeid;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const char* (*const get_typestring)(void* self);
|
const char* (*const get_typestring)(void* self);
|
||||||
typeid (*const get_typeid)(void* self);
|
typeid (*const get_typeid)();
|
||||||
Dictionary* (*const get_typeclasses)(void* self);
|
Dictionary* (*const get_typeclasses)(void* self);
|
||||||
} IMirror;
|
} IMirror;
|
||||||
|
|
||||||
|
@ -30,13 +30,13 @@ typedef struct {
|
||||||
} MirroredTypeclass;
|
} MirroredTypeclass;
|
||||||
|
|
||||||
static inline int mirror_is_typeid(const Mirror* mirror, typeid id) {
|
static inline int mirror_is_typeid(const Mirror* mirror, typeid id) {
|
||||||
return mirror->tc->get_typeid(mirror->data) == id;
|
return mirror->tc->get_typeid() == id;
|
||||||
}
|
}
|
||||||
static inline int mirror_is_typestring(const Mirror* mirror, const char* id) {
|
static inline int mirror_is_typestring(const Mirror* mirror, const char* id) {
|
||||||
return strcmp(id, mirror->tc->get_typestring(mirror->data)) == 0;
|
return strcmp(id, mirror->tc->get_typestring(mirror->data)) == 0;
|
||||||
}
|
}
|
||||||
static inline int mirror_eq(const Mirror* lhs, const Mirror* rhs) {
|
static inline int mirror_eq(const Mirror* lhs, const Mirror* rhs) {
|
||||||
return lhs->tc->get_typeid(lhs->data) == rhs->tc->get_typeid(rhs->data);
|
return lhs->tc == rhs->tc;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern const void* mirror_get_typeclass(void* data, IMirror const* tc, const char* typeclass);
|
extern const void* mirror_get_typeclass(void* data, IMirror const* tc, const char* typeclass);
|
||||||
|
@ -45,6 +45,8 @@ extern const void* mirror_get_typeclass(void* data, IMirror const* tc, const cha
|
||||||
// mirror_get_function(physics_entity.data, physics_entity.mirror, "BehaviourEntity")
|
// mirror_get_function(physics_entity.data, physics_entity.mirror, "BehaviourEntity")
|
||||||
extern void* mirror_get_function(void* data, IMirror const* tc, const char* typeclass_name);
|
extern void* mirror_get_function(void* data, IMirror const* tc, const char* typeclass_name);
|
||||||
|
|
||||||
|
#define GET_TYPEID(Type__) (Type__##_as_Mirror(NULL).tc->get_typeid())
|
||||||
|
|
||||||
// macro reexport of mirror_get_function which will cast the function so it can be called immediately
|
// macro reexport of mirror_get_function which will cast the function so it can be called immediately
|
||||||
// example:
|
// example:
|
||||||
// MIRROR_GET_WRAP_FUNC(physics_entity.data, physics_entity.mirror, BehaviourEntity)(physics_entity.data)
|
// MIRROR_GET_WRAP_FUNC(physics_entity.data, physics_entity.mirror, BehaviourEntity)(physics_entity.data)
|
||||||
|
@ -71,11 +73,11 @@ extern void* mirror_get_function(void* data, IMirror const* tc, const char* type
|
||||||
#define impl_Mirror_for(T, get_typestring_f, get_typeid_f, get_typeclasses_f)\
|
#define impl_Mirror_for(T, get_typestring_f, get_typeid_f, get_typeclasses_f)\
|
||||||
Mirror T##_as_Mirror(T* x) {\
|
Mirror T##_as_Mirror(T* x) {\
|
||||||
TC_FN_TYPECHECK(const char*, get_typestring_f, T*);\
|
TC_FN_TYPECHECK(const char*, get_typestring_f, T*);\
|
||||||
TC_FN_TYPECHECK(typeid, get_typeid_f, T*);\
|
TC_FN_TYPECHECK(typeid, get_typeid_f);\
|
||||||
TC_FN_TYPECHECK(Dictionary*, get_typeclasses_f, T*);\
|
TC_FN_TYPECHECK(Dictionary*, get_typeclasses_f, T*);\
|
||||||
static IMirror const tc = {\
|
static IMirror const tc = {\
|
||||||
.get_typestring = (const char*(*const)(void*)) get_typestring_f,\
|
.get_typestring = (const char*(*const)(void*)) get_typestring_f,\
|
||||||
.get_typeid = (typeid (*const)(void*)) get_typeid_f,\
|
.get_typeid = (typeid (*const)()) get_typeid_f,\
|
||||||
.get_typeclasses = (Dictionary* (*const)(void*)) get_typeclasses_f,\
|
.get_typeclasses = (Dictionary* (*const)(void*)) get_typeclasses_f,\
|
||||||
};\
|
};\
|
||||||
return (Mirror){.tc = &tc, .data = x};\
|
return (Mirror){.tc = &tc, .data = x};\
|
||||||
|
@ -83,7 +85,7 @@ Mirror T##_as_Mirror(T* x) {\
|
||||||
|
|
||||||
#define DECL_REFLECT(T)\
|
#define DECL_REFLECT(T)\
|
||||||
extern const char* T##_get_typestring(T* self);\
|
extern const char* T##_get_typestring(T* self);\
|
||||||
extern typeid T##_get_typeid(T* self);\
|
extern typeid T##_get_typeid();\
|
||||||
extern Dictionary* T##_get_typeclasses(T* self);\
|
extern Dictionary* T##_get_typeclasses(T* self);\
|
||||||
decl_typeclass_impl(Mirror, T)
|
decl_typeclass_impl(Mirror, T)
|
||||||
|
|
||||||
|
@ -92,7 +94,7 @@ const char* T##_get_typestring(T* self) {\
|
||||||
static const char* const typestring = #T;\
|
static const char* const typestring = #T;\
|
||||||
return typestring;\
|
return typestring;\
|
||||||
}\
|
}\
|
||||||
typeid T##_get_typeid(T* self) {\
|
typeid T##_get_typeid() {\
|
||||||
static char init_flag = 0;\
|
static char init_flag = 0;\
|
||||||
static typeid id = 0;\
|
static typeid id = 0;\
|
||||||
if(!init_flag) {\
|
if(!init_flag) {\
|
||||||
|
|
Loading…
Reference in New Issue