feat: added function getter to mirror
This commit is contained in:
parent
fc76049fc6
commit
986ab06478
|
@ -1,10 +1,26 @@
|
||||||
#include "mirror.h"
|
#include "mirror.h"
|
||||||
|
|
||||||
const void* mirror_get_typeclass(void* self, IMirror const* tc, const char* typeclass) {
|
MirroredTypeclass* internal_mirror_get_typeclass(void* self, IMirror const* tc, const char* typeclass) {
|
||||||
uintptr_t target_hash = strhash(typeclass);
|
uintptr_t target_hash = strhash(typeclass);
|
||||||
list_foreach(MirroredTypeclass*, class, tc->get_typeclasses(self)) {
|
list_foreach(MirroredTypeclass*, class, tc->get_typeclasses(self)) {
|
||||||
if(target_hash == class->name_hash && strcmp(typeclass, class->typeclass_name) == 0)
|
if(target_hash == class->name_hash && strcmp(typeclass, class->typeclass_name) == 0)
|
||||||
return class->typeclass;
|
return class;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const void* mirror_get_typeclass(void* data, IMirror const* tc, const char* typeclass) {
|
||||||
|
MirroredTypeclass* class = internal_mirror_get_typeclass(data, tc, typeclass);
|
||||||
|
if(class != NULL)
|
||||||
|
return class->typeclass;
|
||||||
|
else
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* mirror_get_function(void* data, IMirror const* tc, const char* typeclass_name) {
|
||||||
|
MirroredTypeclass* class = internal_mirror_get_typeclass(data, tc, typeclass_name);
|
||||||
|
if(class != NULL)
|
||||||
|
return class->function;
|
||||||
|
else
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@ typedef struct {
|
||||||
const char* typeclass_name;
|
const char* typeclass_name;
|
||||||
uintptr_t name_hash;
|
uintptr_t name_hash;
|
||||||
const void* typeclass;
|
const void* typeclass;
|
||||||
|
void* function;
|
||||||
} MirroredTypeclass;
|
} MirroredTypeclass;
|
||||||
|
|
||||||
static inline int mirror_is_typeid(const Mirror* mirror, typeid id) {
|
static inline int mirror_is_typeid(const Mirror* mirror, typeid id) {
|
||||||
|
@ -37,6 +38,10 @@ static inline int mirror_eq(const Mirror* lhs, const Mirror* rhs) {
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
|
// get the wrapper function for a given typeclass name
|
||||||
|
// example:
|
||||||
|
//
|
||||||
|
extern void* mirror_get_function(void* data, IMirror const* tc, const char* typeclass_name);
|
||||||
|
|
||||||
#define MIRROR_TRY_WRAP(Into_, Mirror_, Typeclass_){\
|
#define MIRROR_TRY_WRAP(Into_, Mirror_, Typeclass_){\
|
||||||
MirroredTypeclassWrapFunc fn_ = mirror_get_typeclass(Mirror_, #Typeclass_);\
|
MirroredTypeclassWrapFunc fn_ = mirror_get_typeclass(Mirror_, #Typeclass_);\
|
||||||
|
@ -90,7 +95,8 @@ List* T##_get_typeclasses(T* self) {\
|
||||||
tc = (MirroredTypeclass){\
|
tc = (MirroredTypeclass){\
|
||||||
.name_hash = strhash(#TypeClass_),\
|
.name_hash = strhash(#TypeClass_),\
|
||||||
.typeclass_name = #TypeClass_,\
|
.typeclass_name = #TypeClass_,\
|
||||||
.typeclass = (void*)T##_as_##TypeClass_(NULL).tc\
|
.typeclass = (void*)T##_as_##TypeClass_(NULL).tc,\
|
||||||
|
.function = (void*)T##_as_##TypeClass_\
|
||||||
};\
|
};\
|
||||||
list_add(&typeclasses, &tc);
|
list_add(&typeclasses, &tc);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue