diff --git a/.vscode/settings.json b/.vscode/settings.json index 85ec3df..1ee84b4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -25,6 +25,7 @@ "stdarg.h": "c", "graph.h": "c", "unicstl_config.h": "c", - "iter.h": "c" + "iter.h": "c", + "iterator.h": "c" } } \ No newline at end of file diff --git a/include/iter.h b/include/iterator.h similarity index 62% rename from include/iter.h rename to include/iterator.h index 85c86d5..a3c7729 100644 --- a/include/iter.h +++ b/include/iterator.h @@ -15,17 +15,11 @@ struct _iterator { - void* obj; - void* self; void* parent; - - void* (*begin)(struct _iterator* self); - void* (*next)(struct _iterator* self); - void* (*end)(struct _iterator* self); + uint32_t _cur; bool (*hasnext)(struct _iterator* self); - - void* (*data)(struct _iterator* self); + const void* (*next)(struct _iterator* self); }; typedef struct _iterator* iterator_t; diff --git a/include/list.h b/include/list.h index f1171b5..4c5eef7 100644 --- a/include/list.h +++ b/include/list.h @@ -12,7 +12,7 @@ #define _LIST_H_ #include "common.h" -#include "iter.h" +#include "iterator.h" struct _list { diff --git a/src/list.c b/src/list.c index 6198f0e..d3fcd4b 100644 --- a/src/list.c +++ b/src/list.c @@ -250,55 +250,33 @@ static bool list_init2(struct _list* list, uint32_t obj_size, uint32_t capacity) return true; } -iterator_t list_iter(struct _list* self) -{ - self->_cur = 0; - self->_iter.obj = self->obj; - return &self->_iter; -} - -static void* list_iter_begin(struct _iterator* iter) +static const void* list_iter_next(struct _iterator* iter) { list_t self = (list_t)iter->parent; - self->_cur = 0; - iter->obj = self->obj; - return iter; -} - -static void* list_iter_end(struct _iterator* iter) -{ - list_t self = (list_t)iter->parent; - iter->obj = (char*)self->obj + self->_size * self->_obj_size; - return iter; -} - -static void* list_iter_next(struct _iterator* iter) -{ - list_t self = (list_t)iter->parent; - - // if add this, can't go to end - // if(self->_cur < self->_size - 1) - { - self->_cur += 1; - } - iter->obj = (char*)self->obj + self->_cur * self->_obj_size; - return iter; + void *obj = self->obj + self->_iter._cur * self->_obj_size; + self->_iter._cur += 1; + return obj; } static bool list_iter_hasnext(struct _iterator* iter) { list_t self = (list_t)iter->parent; - if(self->_cur < self->_size) + if(self->_iter._cur < self->size(self)) { return true; } return false; } -static void* list_iter_data(struct _iterator* iter) +iterator_t list_iter(struct _list* self) { - return iter->obj; + self->_iter.parent = self; + self->_iter._cur = 0; + + self->_iter.next = list_iter_next; + self->_iter.hasnext = list_iter_hasnext; + return &self->_iter; } list_t list_new2(uint32_t obj_size, uint32_t capacity) @@ -315,15 +293,6 @@ list_t list_new2(uint32_t obj_size, uint32_t capacity) } } - list->_iter.self = &list->iter; - list->_iter.parent = list; - - list->_iter.begin = list_iter_begin; - list->_iter.next = list_iter_next; - list->_iter.end = list_iter_end; - list->_iter.data = list_iter_data; - list->_iter.hasnext = list_iter_hasnext; - list->iter = list_iter; return list; } diff --git a/test/test_list.c b/test/test_list.c index 4c2d29f..58e1170 100644 --- a/test/test_list.c +++ b/test/test_list.c @@ -353,19 +353,16 @@ void list_iter_test(void) TEST_ASSERT_FALSE(list->empty(list)); } - iterator_t it = list->iter(list); - printf("iter start\n"); - list->print(list); - - printf("\n"); - while(it->hasnext(it)) + iterator_t iter = list->iter(list); + int iter_data = 0; + int idx = 0; + while(iter->hasnext(iter)) { - int dd = *(int*)it->data(it); - printf("%d ", dd); - it->next(it); + iter_data = *(int*)iter->next(iter); + // printf("%d ", dd); + TEST_ASSERT_EQUAL_INT(data[idx], iter_data); + idx++; } - printf("\niter end\n"); - list_free(&list); }