diff --git a/include/stack.h b/include/stack.h index ec8a8bf..9e57275 100644 --- a/include/stack.h +++ b/include/stack.h @@ -21,7 +21,12 @@ struct _stack_node struct _stack { - // ---------- private ---------- + // -------------------- private -------------------- + /** + * @brief head pointer of stack + * 1. linklist: head->next is valid, head->obj is NULL + * 2. array: head->obj is valid, head->next is NULL, + */ struct _stack_node * _head; uint32_t _size; @@ -33,7 +38,7 @@ struct _stack void (*_destory)(struct _stack* self); - // ---------- public ---------- + // -------------------- public -------------------- // kernel bool (*push)(struct _stack* self, void* obj); bool (*pop)(struct _stack* self, void* obj); diff --git a/src/stack.c b/src/stack.c index 3937c50..731a6f2 100644 --- a/src/stack.c +++ b/src/stack.c @@ -254,20 +254,14 @@ static void stack2_print(struct _stack* self) } } -const void* stack2_iter_next(struct _iterator* iter) -{ - assert(iter != NULL); - assert(iter->parent != NULL); - - stack_t self = (stack_t)iter->_parent; - // from top to bottom - uint32_t index = self->size(self) - 1 - self->_iter._cur; - - void *obj = self->_head->obj + self->_obj_size * index; - self->_iter._cur += 1; - return obj; -} - +/** + * @brief iterator next + * from top to bottom + * + * @param iter + * @return const void* + * the value of return is const, so you can't modify it. + */ const void* stack_iter_next(struct _iterator* iter) { assert(iter != NULL); @@ -276,13 +270,23 @@ const void* stack_iter_next(struct _iterator* iter) stack_t self = (stack_t)iter->_parent; void *obj = NULL; - // from top to bottom - struct _stack_node* node = (struct _stack_node *)self->_iter._cur_node; - if(node != NULL) + if(self->_head->obj == NULL) { - obj = node->obj; - self->_iter._cur_node = node->next; + // base on linklist + struct _stack_node* node = (struct _stack_node *)self->_iter._cur_node; + if(node != NULL) + { + obj = node->obj; + self->_iter._cur_node = node->next; + } } + else + { + // base on array + uint32_t index = self->size(self) - 1 - self->_iter._cur; + obj = self->_head->obj + self->_obj_size * index; + } + self->_iter._cur += 1; return obj; } @@ -386,7 +390,7 @@ static bool stack_init2(struct _stack* self, uint32_t obj_size, uint32_t capacit return false; } - self->_iter.next = stack2_iter_next; + self->_iter.next = stack_iter_next; self->_iter.hasnext = stack_iter_hasnext; self->_destory = stack2_destory;