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 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);
|
||||
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ pkg = import('pkgconfig')
|
|||
|
||||
librtti_c_srcs=[
|
||||
'create.c',
|
||||
'typeinfo.c',
|
||||
'lock.c',
|
||||
'iter.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;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue