#include #include #include #include #include "rtti.h" #define ATTR_ID (0) #define ATTR_NAME (1) typedef struct { int id; char* name; } my_attrset_t; static int my_attrset_init(meta_obj_t* obj, va_list ap) { my_attrset_t* attrs = RTTI_OBJ_TO_DATA(my_attrset_t, obj); attrs->id = -1; attrs->name = NULL; return 1; } static void my_attrset_destroy(meta_obj_t* obj) { /* do nothing */ return; } static int my_attrset_get(meta_obj_t* obj, void* attr, void** value) { my_attrset_t* attrs = RTTI_OBJ_TO_DATA(my_attrset_t, obj); switch ((int)(long)attr) { case ATTR_ID: *value = (void*)(long)attrs->id; break; case ATTR_NAME: *value = (void*)attrs->name; break; default: return -EINVAL; } return 1; } static int my_attrset_set(meta_obj_t* obj, void* attr, void* value) { my_attrset_t* attrs = RTTI_OBJ_TO_DATA(my_attrset_t, obj); switch ((int)(long)attr) { case ATTR_ID: attrs->id = (int)(long)value; break; case ATTR_NAME: attrs->name = (char*)value; break; default: return -EINVAL; } return 1; } static size_t my_attrset_datasize(va_list ap) { size_t sz = sizeof(my_attrset_t); return sz; } static typeinfo_t my_attrset_type = { .name = "my_attrset", .privateSize = 0, .dataSize = (datasize_fn_t)my_attrset_datasize, .init = (obj_init_fn_t)my_attrset_init, .destroy = (obj_destroy_fn_t)my_attrset_destroy, .interfaces = { .attrs = &(intf_attr_t) { .get = (attr_get_fn_t)my_attrset_get, .set = (attr_set_fn_t)my_attrset_set } } }; static void test_attr_setget(void) { var attrs = makeInstance(&my_attrset_type); void* id; char* name; int rc = 0; TEST_ASSERT_TRUE(attrs != NULL); rc = attr_set(attrs, (void*)(long)ATTR_ID, (void *)(long)1); TEST_ASSERT_TRUE(rc >= 0); rc = attr_set(attrs, (void*)(long)ATTR_NAME, "tester"); TEST_ASSERT_TRUE(rc >= 0); rc = attr_get(attrs, (void*)(long)ATTR_ID, &id); TEST_ASSERT_TRUE(rc >= 0); TEST_ASSERT_TRUE((int)(long)id == 1); rc = attr_get(attrs, (void*)(long)ATTR_NAME, (void**)&name); TEST_ASSERT_TRUE(rc >= 0); TEST_ASSERT_TRUE((strcmp(name, "tester") == 0)); destroy(attrs); } void test_attr(void) { printf("\n attr test\n\n"); RUN_TEST(test_attr_setget); }