feat: added function getter to mirror
This commit is contained in:
parent
fc76049fc6
commit
986ab06478
|
@ -1,10 +1,26 @@
|
|||
#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);
|
||||
list_foreach(MirroredTypeclass*, class, tc->get_typeclasses(self)) {
|
||||
if(target_hash == class->name_hash && strcmp(typeclass, class->typeclass_name) == 0)
|
||||
return class->typeclass;
|
||||
return class;
|
||||
}
|
||||
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;
|
||||
uintptr_t name_hash;
|
||||
const void* typeclass;
|
||||
void* function;
|
||||
} MirroredTypeclass;
|
||||
|
||||
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);
|
||||
// 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_){\
|
||||
MirroredTypeclassWrapFunc fn_ = mirror_get_typeclass(Mirror_, #Typeclass_);\
|
||||
|
@ -90,7 +95,8 @@ List* T##_get_typeclasses(T* self) {\
|
|||
tc = (MirroredTypeclass){\
|
||||
.name_hash = strhash(#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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue