feat: added function getter to mirror

This commit is contained in:
Sara 2024-01-18 13:05:09 +01:00
parent fc76049fc6
commit 986ab06478
2 changed files with 25 additions and 3 deletions

View file

@ -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;
}

View file

@ -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);