- improve the interface of rtti to pass meta_obj_t* as parameter of type function to easy to access private/data

- rename some macro with RTTI
- add RTTI_MAGIC in object header
- add new rtti api
This commit is contained in:
Rongsong Shen 2026-01-30 12:26:23 +08:00
parent c8c1749347
commit f78ed03591
15 changed files with 252 additions and 114 deletions

View file

@ -11,10 +11,11 @@ typedef struct {
static size_t my_array_datasize(va_list ap) { return sizeof(myArray_t); }
static int my_array_init(myArray_t* a, va_list ap)
static int my_array_init(meta_obj_t* obj, va_list ap)
{
int count;
int i;
myArray_t* a = RTTI_OBJ_TO_DATA(myArray_t, obj);
int count;
int i;
count = va_arg(ap, int);
if (count <= 0) {
@ -34,42 +35,43 @@ static int my_array_init(myArray_t* a, va_list ap)
return 1;
}
static void my_array_destroy(myArray_t* a)
static void my_array_destroy(meta_obj_t* obj)
{
myArray_t* a = RTTI_OBJ_TO_DATA(myArray_t, obj);
if (a->data != NULL) {
free(a->data);
a->data = NULL;
}
}
static int my_array_make_iter(iterator_t* iter, var obj)
static int my_array_make_iter(iterator_t* iter)
{
iter->data = (void*)(long)0;
return ITER_OK;
return RTTI_ITER_OK;
}
static int my_array_iter_next(iterator_t* iter, void** data)
{
myArray_t* a = iter->v;
myArray_t* a = RTTI_OBJ_TO_DATA(myArray_t, iter->obj);
int idx = (int)(long)iter->data;
if (idx >= a->count) {
/* no data */
return ITER_NO_DATA;
return RTTI_ITER_NO_DATA;
}
*data = (void*)(long)a->data[idx];
iter->data = (void*)(long)(idx + 1);
return ITER_OK;
return RTTI_ITER_OK;
}
static int my_array_iter_reset(iterator_t* iter)
{
iter->data = (void*)(long)0;
return ITER_OK;
return RTTI_ITER_OK;
}
static void my_array_iter_destroy(iterator_t* iter) { return; }
@ -95,7 +97,7 @@ static void test_array_iter(void)
void* data;
TEST_ASSERT_TRUE(array != NULL);
TEST_ASSERT_TRUE(is_rtti_obj(array) == 1);
rc = iter_make(&it, array);
TEST_ASSERT_TRUE(rc == 1);
@ -120,7 +122,7 @@ static void test_array_iter(void)
TEST_ASSERT_TRUE((int)(long)data == 4);
rc = iter_next(&it, (void**)&data);
TEST_ASSERT_TRUE(rc == ITER_NO_DATA);
TEST_ASSERT_TRUE(rc == RTTI_ITER_NO_DATA);
sum = 0;
rc = iter_reset(&it);
@ -129,7 +131,7 @@ static void test_array_iter(void)
for (;;) {
rc = iter_next(&it, &data);
TEST_ASSERT_TRUE(rc >= 0);
if (rc == ITER_NO_DATA) {
if (rc == RTTI_ITER_NO_DATA) {
break;
}