add typeOf() and instanceOf()
This commit is contained in:
parent
dffbd936db
commit
6f6bb5b4e0
5 changed files with 69 additions and 10 deletions
|
|
@ -176,15 +176,23 @@ struct meta_obj_ {
|
||||||
extern var makeInstance(typeinfo_t*, ...);
|
extern var makeInstance(typeinfo_t*, ...);
|
||||||
extern void destroy(var);
|
extern void destroy(var);
|
||||||
extern int is_rtti_obj(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 int lock(var, uint64_t);
|
||||||
extern void unlock(var);
|
extern void unlock(var);
|
||||||
|
|
||||||
extern char* toString(var, ...);
|
extern char* toString(var, ...);
|
||||||
|
|
||||||
extern int iter_make(iterator_t*, var, ...);
|
extern int iter_make(iterator_t*, var, ...);
|
||||||
extern int iter_next(iterator_t*, void**);
|
extern int iter_next(iterator_t*, void**);
|
||||||
extern int iter_reset(iterator_t*);
|
extern int iter_reset(iterator_t*);
|
||||||
extern void iter_destroy(iterator_t*);
|
extern void iter_destroy(iterator_t*);
|
||||||
|
|
||||||
extern int32_t hash(var);
|
extern int32_t hash(var);
|
||||||
|
|
||||||
extern int64_t length(var);
|
extern int64_t length(var);
|
||||||
|
|
||||||
extern int32_t reference(var);
|
extern int32_t reference(var);
|
||||||
extern void dereference(var);
|
extern void dereference(var);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ pkg = import('pkgconfig')
|
||||||
|
|
||||||
librtti_c_srcs=[
|
librtti_c_srcs=[
|
||||||
'create.c',
|
'create.c',
|
||||||
|
'typeinfo.c',
|
||||||
'lock.c',
|
'lock.c',
|
||||||
'iter.c',
|
'iter.c',
|
||||||
'ref.c',
|
'ref.c',
|
||||||
|
|
|
||||||
27
src/typeinfo.c
Normal file
27
src/typeinfo.c
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
||||||
|
|
@ -14,6 +14,7 @@ void tearDown(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern void test_type(void);
|
||||||
extern void test_iter(void);
|
extern void test_iter(void);
|
||||||
extern void test_invalid(void);
|
extern void test_invalid(void);
|
||||||
|
|
||||||
|
|
@ -23,6 +24,7 @@ int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
UNITY_BEGIN();
|
UNITY_BEGIN();
|
||||||
|
|
||||||
|
TEST(test_type);
|
||||||
TEST(test_iter);
|
TEST(test_iter);
|
||||||
TEST(test_invalid);
|
TEST(test_invalid);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -89,6 +89,21 @@ static typeinfo_t myintArray
|
||||||
.reset = (iter_reset_fn_t)my_array_iter_reset,
|
.reset = (iter_reset_fn_t)my_array_iter_reset,
|
||||||
.destroy = (iter_destroy_fn_t)my_array_iter_destroy } } };
|
.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)
|
static void test_array_iter(void)
|
||||||
{
|
{
|
||||||
var array = makeInstance(&myintArray, 5, 0, 1, 2, 3, 4);
|
var array = makeInstance(&myintArray, 5, 0, 1, 2, 3, 4);
|
||||||
|
|
@ -147,6 +162,12 @@ static void test_array_iter(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_type(void) {
|
||||||
|
printf("\n type info test\n\n");
|
||||||
|
|
||||||
|
RUN_TEST(test_typeof);
|
||||||
|
}
|
||||||
|
|
||||||
void test_iter(void)
|
void test_iter(void)
|
||||||
{
|
{
|
||||||
printf("\n iterator test\n\n");
|
printf("\n iterator test\n\n");
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue