From d8690bfeb96e130f53ee4a67ea9c94e2a19c1fbc Mon Sep 17 00:00:00 2001 From: Rongsong Shen Date: Fri, 13 Feb 2026 11:25:44 +0800 Subject: [PATCH] add key2id api --- include/rtti/typeinfo.h | 17 ++++++++++++ src/key2id.c | 59 +++++++++++++++++++++++++++++++++++++++++ src/meson.build | 1 + 3 files changed, 77 insertions(+) create mode 100644 src/key2id.c diff --git a/include/rtti/typeinfo.h b/include/rtti/typeinfo.h index 2489f23..0b89707 100644 --- a/include/rtti/typeinfo.h +++ b/include/rtti/typeinfo.h @@ -147,6 +147,18 @@ typedef struct { bit_clrall_fn_t clrall; } intf_bitmap_t; +/* key to id table */ + +typedef int (*key_add_fn_t)(meta_obj_t*, uint64_t*, void*); +typedef int (*key_del_fn_t)(meta_obj_t*, void*); +typedef uint64_t (*key_find_fn_t)(meta_obj_t*, uint64_t*, void*); + +typedef struct { + key_add_fn_t add_key; + key_del_fn_t del_key; + key_find_fn_t find_key; +} intf_key2id_t; + typedef struct { intf_lock_t* lock; intf_tostring_t* toString; @@ -155,6 +167,7 @@ typedef struct { intf_hash_t* hash; intf_length_t* length; intf_bitmap_t* bitmap; + intf_key2id_t* key2id; } interface_table_t; struct typeinfo_ { @@ -201,4 +214,8 @@ extern int bit_set(var, unsigned long); extern int bit_clr(var, unsigned long); extern int bit_clrall(var); +extern int key_add(var, uint64_t*, void*); +extern int key_del(var, void*); +extern int key_find(var, uint64_t*, void*); + #endif diff --git a/src/key2id.c b/src/key2id.c new file mode 100644 index 0000000..756acd4 --- /dev/null +++ b/src/key2id.c @@ -0,0 +1,59 @@ +#include +#include +#include + +#include "rtti.h" + +int key_add(var v, uint64_t* id, void* key) +{ + meta_obj_t* obj = NULL; + key_add_fn_t method = NULL; + + obj = RTTI_DATA_TO_OBJ(v); + if (RTTI_OBJ_INVALID(obj)) { + return -EINVAL; + } + + RTTI_GET_METHOD(method, obj, key2id, add_key); + if (method == NULL) { + return -EINVAL; + } + + return method(obj, id, key); +} + +int key_del(var v, void* key) +{ + meta_obj_t* obj = NULL; + key_del_fn_t method = NULL; + + obj = RTTI_DATA_TO_OBJ(v); + if (RTTI_OBJ_INVALID(obj)) { + return -EINVAL; + } + + RTTI_GET_METHOD(method, obj, key2id, del_key); + if (method == NULL) { + return -EINVAL; + } + + return method(obj, key); +} + +int key_find(var v, uint64_t* id, void* key) +{ + meta_obj_t* obj = NULL; + key_find_fn_t method = NULL; + + obj = RTTI_DATA_TO_OBJ(v); + if (RTTI_OBJ_INVALID(obj)) { + return -EINVAL; + } + + RTTI_GET_METHOD(method, obj, key2id, find_key); + if (method == NULL) { + return -EINVAL; + } + + return method(obj, id, key); +} diff --git a/src/meson.build b/src/meson.build index 1bb4508..84ca67f 100644 --- a/src/meson.build +++ b/src/meson.build @@ -10,6 +10,7 @@ librtti_c_srcs=[ 'hash.c', 'length.c', 'bitmap.c', + 'key2id.c', ]