mirror of
https://gitee.com/apaki/unicstl.git
synced 2025-05-17 11:31:37 +08:00
迭代器合并一下吧,毕竟目前来看stack实现方式就两种,链表或者动态数组
This commit is contained in:
parent
4fa56e1ed8
commit
8f5540743f
@ -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);
|
||||
|
36
src/stack.c
36
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
|
||||
if(self->_head->obj == NULL)
|
||||
{
|
||||
// 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;
|
||||
|
Loading…
Reference in New Issue
Block a user