diff --git a/core/src/mirror.c b/core/src/mirror.c index 3482aff..7a02766 100644 --- a/core/src/mirror.c +++ b/core/src/mirror.c @@ -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; +} diff --git a/core/src/mirror.h b/core/src/mirror.h index 0ec937c..8f4a2af 100644 --- a/core/src/mirror.h +++ b/core/src/mirror.h @@ -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);