diff --git a/include/rtti/typeinfo.h b/include/rtti/typeinfo.h index d9711f4..2489f23 100644 --- a/include/rtti/typeinfo.h +++ b/include/rtti/typeinfo.h @@ -173,18 +173,26 @@ struct meta_obj_ { void* data; }; -extern var makeInstance(typeinfo_t*, ...); -extern void destroy(var); -extern int is_rtti_obj(var); -extern int lock(var, uint64_t); -extern void unlock(var); -extern char* toString(var, ...); -extern int iter_make(iterator_t*, var, ...); -extern int iter_next(iterator_t*, void**); -extern int iter_reset(iterator_t*); -extern void iter_destroy(iterator_t*); +extern var makeInstance(typeinfo_t*, ...); +extern void destroy(var); +extern int is_rtti_obj(var); +extern typeinfo_t* typeOf(var); +extern int instanceOf(var, typeinfo_t*); + +extern int lock(var, uint64_t); +extern void unlock(var); + +extern char* toString(var, ...); + +extern int iter_make(iterator_t*, var, ...); +extern int iter_next(iterator_t*, void**); +extern int iter_reset(iterator_t*); +extern void iter_destroy(iterator_t*); + extern int32_t hash(var); + extern int64_t length(var); + extern int32_t reference(var); extern void dereference(var); diff --git a/src/meson.build b/src/meson.build index 276c77d..1bb4508 100644 --- a/src/meson.build +++ b/src/meson.build @@ -2,6 +2,7 @@ pkg = import('pkgconfig') librtti_c_srcs=[ 'create.c', + 'typeinfo.c', 'lock.c', 'iter.c', 'ref.c', diff --git a/src/typeinfo.c b/src/typeinfo.c new file mode 100644 index 0000000..a551039 --- /dev/null +++ b/src/typeinfo.c @@ -0,0 +1,27 @@ +#include +#include + +#include "rtti.h" + +typeinfo_t *typeOf(var v) { + meta_obj_t *obj = NULL; + + obj = RTTI_DATA_TO_OBJ(v); + if (RTTI_OBJ_INVALID(obj)) { + return NULL; + } + + return obj->type; +} + +int instanceOf(var v, typeinfo_t *t) { + if ((v == NULL) || (t == NULL)) { + return -EINVAL; + } + + if (typeOf(v) == t) { + return 1; + } + + return 0; +} diff --git a/testsuite/test.c b/testsuite/test.c index 83b1eed..e1f9989 100644 --- a/testsuite/test.c +++ b/testsuite/test.c @@ -14,6 +14,7 @@ void tearDown(void) return; } +extern void test_type(void); extern void test_iter(void); extern void test_invalid(void); @@ -23,6 +24,7 @@ int main(int argc, char* argv[]) { UNITY_BEGIN(); + TEST(test_type); TEST(test_iter); TEST(test_invalid); diff --git a/testsuite/test_iter.c b/testsuite/test_iter.c index c12f2f4..4867b82 100644 --- a/testsuite/test_iter.c +++ b/testsuite/test_iter.c @@ -89,6 +89,21 @@ static typeinfo_t myintArray .reset = (iter_reset_fn_t)my_array_iter_reset, .destroy = (iter_destroy_fn_t)my_array_iter_destroy } } }; +static void test_typeof(void) +{ + var array = makeInstance(&myintArray, 5, 0, 1, 2, 3, 4); + int rc; + typeinfo_t* t = NULL; + + t = typeOf(array); + TEST_ASSERT_TRUE(t == &myintArray); + + rc = instanceOf(array, &myintArray); + TEST_ASSERT_TRUE(rc == 1); + + destroy(array); +} + static void test_array_iter(void) { var array = makeInstance(&myintArray, 5, 0, 1, 2, 3, 4); @@ -147,6 +162,12 @@ static void test_array_iter(void) return; } +void test_type(void) { + printf("\n type info test\n\n"); + + RUN_TEST(test_typeof); +} + void test_iter(void) { printf("\n iterator test\n\n");