diff --git a/include/rtti/typeinfo.h b/include/rtti/typeinfo.h index ef95cb9..af283e0 100644 --- a/include/rtti/typeinfo.h +++ b/include/rtti/typeinfo.h @@ -147,7 +147,7 @@ typedef struct { bit_clrall_fn_t clrall; } intf_bitmap_t; -/* key to id table */ +/* key to val table */ typedef int (*key_add_fn_t)(meta_obj_t*, void*, void*); typedef int (*key_del_fn_t)(meta_obj_t*, void*); @@ -159,6 +159,18 @@ typedef struct { key_find_fn_t find_key; } intf_kv_t; +/* array API */ + +typedef int (*vstore_fn_t)(meta_obj_t*, void*); +typedef int (*vget_fn_t)(meta_obj_t*, int, void**); +typedef int (*vput_fn_t)(meta_obj_t*, int, void*); + +typedef struct { + vstore_fn_t vstore; + vget_fn_t vget; + vput_fn_t vput; +} intf_varray_t; + typedef struct { intf_lock_t* lock; intf_tostring_t* toString; @@ -168,6 +180,7 @@ typedef struct { intf_length_t* length; intf_bitmap_t* bitmap; intf_kv_t* kv; + intf_varray_t* varray; } interface_table_t; struct typeinfo_ { @@ -219,4 +232,8 @@ extern int key_add(var, void*, void*); extern int key_del(var, void*); extern int key_find(var, void*, void**); +extern int vstore(var, void*); +extern int vget(var, int, void**); +extern int vput(var, int, void*); + #endif diff --git a/src/meson.build b/src/meson.build index 6f129a7..d9c5858 100644 --- a/src/meson.build +++ b/src/meson.build @@ -11,6 +11,7 @@ librtti_c_srcs=[ 'length.c', 'bitmap.c', 'kv.c', + 'varray.c', ] diff --git a/src/varray.c b/src/varray.c new file mode 100644 index 0000000..eb51bca --- /dev/null +++ b/src/varray.c @@ -0,0 +1,66 @@ +#include +#include + +#include "rtti.h" + +int vstore(var v, void* data) +{ + meta_obj_t* obj = NULL; + vstore_fn_t method = NULL; + + obj = RTTI_DATA_TO_OBJ(v); + if (RTTI_OBJ_INVALID(obj)) { + return -EINVAL; + } + + RTTI_GET_METHOD(method, obj, varray, vstore); + if (method == NULL) { + return -EINVAL; + } + + return method(obj, data); +} + +int vget(var v, int idx, void** data) +{ + meta_obj_t* obj = NULL; + vget_fn_t method = NULL; + + if ((idx < 0) || (data == NULL)) { + return -EINVAL; + } + + obj = RTTI_DATA_TO_OBJ(v); + if (RTTI_OBJ_INVALID(obj)) { + return -EINVAL; + } + + RTTI_GET_METHOD(method, obj, varray, vget); + if (method == NULL) { + return -EINVAL; + } + + return method(obj, idx, data); +} + +int vput(var v, int idx, void* data) +{ + meta_obj_t* obj = NULL; + vput_fn_t method = NULL; + + if (idx < 0) { + return -EINVAL; + } + + obj = RTTI_DATA_TO_OBJ(v); + if (RTTI_OBJ_INVALID(obj)) { + return -EINVAL; + } + + RTTI_GET_METHOD(method, obj, varray, vput); + if (method == NULL) { + return -EINVAL; + } + + return method(obj, idx, data); +}