diff --git a/include/rtti/typeinfo.h b/include/rtti/typeinfo.h index 467d4d0..cb90a16 100644 --- a/include/rtti/typeinfo.h +++ b/include/rtti/typeinfo.h @@ -134,6 +134,19 @@ typedef struct { length_fn_t length; } intf_length_t; +/* set */ +typedef int (*bit_test_fn_t)(meta_obj_t*, unsigned long); +typedef int (*bit_set_fn_t)(meta_obj_t*, unsigned long); +typedef int (*bit_clr_fn_t)(meta_obj_t*, unsigned long); +typedef int (*bit_clrall_fn_t)(meta_obj_t*); + +typedef struct { + bit_test_fn_t test; + bit_set_fn_t set; + bit_clr_fn_t clr; + bit_clrall_fn_t clrall; +} intf_bitmap_t; + typedef struct { intf_lock_t* lock; intf_tostring_t* toString; @@ -141,6 +154,7 @@ typedef struct { intf_reference_t* reference; intf_hash_t* hash; intf_length_t* length; + intf_bitmap_t* bitmap; } interface_table_t; struct typeinfo_ { @@ -165,7 +179,7 @@ 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_make(iterator_t*, var, ...); extern int iter_next(iterator_t*, void**); extern int iter_reset(iterator_t*); extern void iter_destroy(iterator_t*); diff --git a/src/bitmap.c b/src/bitmap.c new file mode 100644 index 0000000..6e571f2 --- /dev/null +++ b/src/bitmap.c @@ -0,0 +1,77 @@ +#include +#include +#include + +#include "rtti.h" + +int bit_test(var v, unsigned long idx) +{ + meta_obj_t* obj = NULL; + bit_test_fn_t method = NULL; + + obj = RTTI_DATA_TO_OBJ(v); + if (RTTI_OBJ_INVALID(obj)) { + return -EINVAL; + } + + RTTI_GET_METHOD(method, obj, bitmap, test); + if (method == NULL) { + return -EINVAL; + } + + return method(obj, idx); +} + +int bit_set(var v, unsigned long idx) +{ + meta_obj_t* obj = NULL; + bit_test_fn_t method = NULL; + + obj = RTTI_DATA_TO_OBJ(v); + if (RTTI_OBJ_INVALID(obj)) { + return -EINVAL; + } + + RTTI_GET_METHOD(method, obj, bitmap, set); + if (method == NULL) { + return -EINVAL; + } + + return method(obj, idx); +} + +int bit_clr(var v, unsigned long idx) +{ + meta_obj_t* obj = NULL; + bit_test_fn_t method = NULL; + + obj = RTTI_DATA_TO_OBJ(v); + if (RTTI_OBJ_INVALID(obj)) { + return -EINVAL; + } + + RTTI_GET_METHOD(method, obj, bitmap, clr); + if (method == NULL) { + return -EINVAL; + } + + return method(obj, idx); +} + +int bit_clrall(var v) +{ + meta_obj_t* obj = NULL; + bit_test_fn_t method = NULL; + + obj = RTTI_DATA_TO_OBJ(v); + if (RTTI_OBJ_INVALID(obj)) { + return -EINVAL; + } + + RTTI_GET_METHOD(method, obj, bitmap, clrall); + if (method == NULL) { + return -EINVAL; + } + + return method(obj); +} diff --git a/src/meson.build b/src/meson.build index 5f083eb..276c77d 100644 --- a/src/meson.build +++ b/src/meson.build @@ -8,6 +8,7 @@ librtti_c_srcs=[ 'str.c', 'hash.c', 'length.c', + 'bitmap.c', ] diff --git a/src/str.c b/src/str.c index 3d85bc6..d48ad51 100644 --- a/src/str.c +++ b/src/str.c @@ -23,7 +23,7 @@ char* toString(var v, ...) } va_start(ap, v); - s = method(v, ap); + s = method(obj, ap); va_end(ap); return s;