From aac984ee08aa6bddc3f153922aa5e6b6788bc475 Mon Sep 17 00:00:00 2001 From: wjf-hs Date: Thu, 24 Apr 2025 14:44:13 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=9F=E5=88=97=E7=9A=84=E8=BF=AD=E4=BB=A3?= =?UTF-8?q?=E5=99=A8=E5=AE=9E=E7=8E=B0=E5=B9=B6=E6=B5=8B=E8=AF=95=E9=80=9A?= =?UTF-8?q?=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/queue.c | 47 ++++++++++++++++----------- test/test_queue.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+), 19 deletions(-) diff --git a/src/queue.c b/src/queue.c index 37e9462..7035995 100644 --- a/src/queue.c +++ b/src/queue.c @@ -337,24 +337,30 @@ static const void* queue_iter_next(struct _iterator* iter) queue_t self = (queue_t)iter->_parent; void *obj = NULL; - - if(self->_front->obj == NULL) - { - // base on linklist - struct _queue_node * node = (struct _queue_node *)iter->_cur_node; - if(node != NULL) - { - obj = node->obj; - iter->_cur_node = node->next; - } - } - else - { - // base on array - uint32_t index = self->size(self) - 1 - self->_iter._cur; - obj = self->_front->obj + self->_obj_size * index; - } + // base on linklist + struct _queue_node * node = (struct _queue_node *)iter->_cur_node; + if(node != NULL) + { + obj = node->obj; + iter->_cur_node = node->next; + } + self->_iter._cur += 1; + return obj; +} + +static const void* queue2_iter_next(struct _iterator* iter) +{ + assert(iter != NULL); + assert(iter->parent != NULL); + + queue_t self = (queue_t)iter->_parent; + void *obj = NULL; + + // base on array + uint32_t index = self->_iter._cur; + obj = self->_front->obj + self->_obj_size * index; + self->_iter._cur += 1; return obj; } @@ -399,6 +405,9 @@ static bool queue_init(struct _queue * self, uint32_t obj_size) self->capacity = queue_capacity; self->clear = queue_clear; + // iter + self->iter = queue_iter; + // -------------------- debug -------------------- self->print = queue_print; @@ -427,7 +436,7 @@ static bool queue_init2(struct _queue * self, uint32_t obj_size, uint32_t capaci return false; } self->_back = self->_front; - + // use self->_front->obj as obj_array // // self->_front->obj = calloc(self->_capacity, self->_obj_size); @@ -445,7 +454,7 @@ static bool queue_init2(struct _queue * self, uint32_t obj_size, uint32_t capaci // iter self->_iter.hasnext = queue_iter_hasnext; - self->_iter.next = queue_iter_next; + self->_iter.next = queue2_iter_next; // -------------------- public -------------------- // kernel diff --git a/test/test_queue.c b/test/test_queue.c index 43c92cc..5c201ad 100644 --- a/test/test_queue.c +++ b/test/test_queue.c @@ -586,6 +586,84 @@ static void test_queue2_struct(void) TEST_ASSERT_NULL(queue); } + +static void test_queue_iter(void) +{ + uint32_t i = 0; + int data[] = { 1,2,3,4,5,6,7,8,9,10 }; + int temp = 0; + uint32_t len = sizeof(data) / sizeof(data[0]); + + queue_t queue = NULL; + queue = queue_new(sizeof(int)); + TEST_ASSERT_NOT_NULL(queue); + queue->print_obj = print_num; + + for (i = 0; i < len; i++) + { + TEST_ASSERT_TRUE(queue->push(queue, &data[i])); + TEST_ASSERT_EQUAL_INT(i + 1, queue->size(queue)); + + TEST_ASSERT_TRUE(queue->front(queue, &temp)); + TEST_ASSERT_EQUAL_INT(data[0], temp); + + TEST_ASSERT_TRUE(queue->back(queue, &temp)); + TEST_ASSERT_EQUAL_INT(data[i], temp); + } + + iterator_t iter = queue->iter(queue); + i = 0; + while(iter->hasnext(iter)) + { + temp = *(int *)iter->next(iter); + // printf("%d ", temp); + TEST_ASSERT_EQUAL_INT(data[i], temp); + i++; + } + + queue_free(&queue); + TEST_ASSERT_NULL(queue); +} + + +static void test_queue2_iter(void) +{ + uint32_t i = 0; + int data[] = { 1,2,3,4,5,6,7,8,9,10 }; + int temp = 0; + uint32_t len = sizeof(data) / sizeof(data[0]); + uint32_t capacity = len; + + queue_t queue = NULL; + queue = queue_new2(sizeof(int), capacity); + TEST_ASSERT_NOT_NULL(queue); + queue->print_obj = print_num; + + for (i = 0; i < len; i++) + { + TEST_ASSERT_TRUE(queue->push(queue, &data[i])); + TEST_ASSERT_EQUAL_INT(i + 1, queue->size(queue)); + + TEST_ASSERT_TRUE(queue->front(queue, &temp)); + TEST_ASSERT_EQUAL_INT(data[0], temp); + + TEST_ASSERT_TRUE(queue->back(queue, &temp)); + TEST_ASSERT_EQUAL_INT(data[i], temp); + } + + iterator_t iter = queue->iter(queue); + i = 0; + while(iter->hasnext(iter)) + { + temp = *(int *)iter->next(iter); + TEST_ASSERT_EQUAL_INT(data[i], temp); + i++; + } + + queue_free(&queue); + TEST_ASSERT_NULL(queue); +} + void test_queue(void) { UnitySetTestFile(__FILE__); @@ -600,4 +678,7 @@ void test_queue(void) RUN_TEST(test_queue2_num); RUN_TEST(test_queue2_struct); + + RUN_TEST(test_queue_iter); + RUN_TEST(test_queue2_iter); }