From d6811b824c5e14245f392bc43ebc675d96ec8594 Mon Sep 17 00:00:00 2001 From: wjf-hs Date: Fri, 30 Aug 2024 11:43:23 +0800 Subject: [PATCH] =?UTF-8?q?iter=E6=B5=8B=E8=AF=95=E8=BF=98=E5=AD=98?= =?UTF-8?q?=E5=9C=A8=E7=82=B9=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/list.h | 6 ++++++ src/list.c | 24 +++++++++++++++++++++++- test/test_list.c | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 1 deletion(-) diff --git a/include/list.h b/include/list.h index 9e09c82..646e5f5 100644 --- a/include/list.h +++ b/include/list.h @@ -21,6 +21,7 @@ struct _list uint32_t _size; // 栈大小 uint32_t _capacity; // 总容量 uint32_t _ratio; // 扩展比率 + uint32_t _cur; // 当前索引 // kernel bool (*append)(struct _list* self, void* obj); // Append object to the end of the list. @@ -33,6 +34,11 @@ struct _list bool (*get)(struct _list* self, int index, void* obj); // 根据索引,获取对象 bool (*set)(struct _list* self, int index, void* obj); // 根据索引,修改对象 + // iter + void* (*begin)(struct _list* self); + void* (*next)(struct _list* self); + void* (*end)(struct _list* self); + // base uint32_t(*size)(struct _list* self); bool (*empty)(struct _list* self); diff --git a/src/list.c b/src/list.c index 9095055..5eb8c51 100644 --- a/src/list.c +++ b/src/list.c @@ -179,6 +179,23 @@ void list_print(struct _list* self) } } +void* list_begin(struct _list* self) +{ + return self->obj; +} + +void* list_next(struct _list* self) +{ + void *obj = (char*)self->obj + self->_cur * self->_obj_size; + self->_cur += 1; + return obj; +} + +void* list_end(struct _list* self) +{ + return (char*)self->obj + self->_size * self->_obj_size; +} + bool list_init2(struct _list* list, uint32_t obj_size, uint32_t capacity) { assert(list != NULL); @@ -194,6 +211,7 @@ bool list_init2(struct _list* list, uint32_t obj_size, uint32_t capacity) list->_size = 0; list->_capacity = capacity; list->_ratio = 2; + list->_cur = 0; // 2. set function // kernel @@ -212,6 +230,10 @@ bool list_init2(struct _list* list, uint32_t obj_size, uint32_t capacity) list->size = list_size; list->sort = list_sort; + list->begin = list_begin; + list->next = list_next; + list->end = list_end; + // 3. set array list->obj = (void*)calloc(list->_capacity, list->_obj_size); if (list->obj == NULL) @@ -223,7 +245,7 @@ bool list_init2(struct _list* list, uint32_t obj_size, uint32_t capacity) list_t list_new(void) { - return (struct _list*)malloc(sizeof(struct _list)); + return (struct _list*)calloc(1, sizeof(struct _list)); } void list_free(list_t* list) diff --git a/test/test_list.c b/test/test_list.c index 77fc19d..a189c58 100644 --- a/test/test_list.c +++ b/test/test_list.c @@ -397,6 +397,41 @@ static void test_list2_struct(void) } #endif + +static void test_list_iter(void) +{ + int temp = 0; + int data[] = { 1,2,3,4,5,6,7,8,9,10 }; + int data_temp[32]; + uint32_t len = sizeof(data) / sizeof(data[0]) - 1; + uint32_t i = 0; + + list_t list = NULL; + + // ------------------------------ + list = list_new(); + list_init2(list, sizeof(int), len); + TEST_ASSERT_TRUE(list->clear(list)); + for(i = 0; i < len; i++) + { + list->append(list, &data[i]); + } + + int * iter = NULL; + i = 0; + for(iter = list->begin(list); iter != list->end(list); iter = list->next(list)) + { + data_temp[i++] = *iter; + } + TEST_ASSERT_EQUAL_INT_ARRAY(data, data_temp, i); + + TEST_ASSERT_FALSE(list->empty(list)); + TEST_ASSERT_TRUE(list->clear(list)); + TEST_ASSERT_TRUE(list->empty(list)); + TEST_ASSERT_TRUE(list->clear(list)); + list_free(&list); +} + void test_list(void) { RUN_TEST(test_list_init2); @@ -407,4 +442,6 @@ void test_list(void) RUN_TEST(test_list_num); // RUN_TEST(test_list_struct); + + RUN_TEST(test_list_iter); }