iterator区分private和public

This commit is contained in:
建峰 2025-04-24 13:07:17 +08:00
parent 21485efb51
commit 4fa56e1ed8
3 changed files with 27 additions and 20 deletions

View File

@ -15,10 +15,12 @@
struct _iterator
{
void* parent;
// ---------- private ----------
void* _parent;
void* _cur_node;
uint32_t _cur;
// ---------- public ----------
bool (*hasnext)(struct _iterator* self);
const void* (*next)(struct _iterator* self);
};

View File

@ -181,7 +181,7 @@ static void list_print(struct _list* self)
static const void* list_iter_next(struct _iterator* iter)
{
list_t self = (list_t)iter->parent;
list_t self = (list_t)iter->_parent;
void *obj = self->obj + self->_iter._cur * self->_obj_size;
self->_iter._cur += 1;
return obj;
@ -189,7 +189,7 @@ static const void* list_iter_next(struct _iterator* iter)
static bool list_iter_hasnext(struct _iterator* iter)
{
list_t self = (list_t)iter->parent;
list_t self = (list_t)iter->_parent;
if(self->_iter._cur < self->size(self))
{
@ -200,7 +200,7 @@ static bool list_iter_hasnext(struct _iterator* iter)
iterator_t list_iter(struct _list* self)
{
self->_iter.parent = self;
self->_iter._parent = self;
self->_iter._cur = 0;
return &self->_iter;
}

View File

@ -124,6 +124,7 @@ static uint32_t stack_capacity(struct _stack* self)
static bool stack_clear(struct _stack* self)
{
assert(self != NULL);
assert(self->_head != NULL);
if (self->empty(self))
{
return true;
@ -258,7 +259,7 @@ const void* stack2_iter_next(struct _iterator* iter)
assert(iter != NULL);
assert(iter->parent != NULL);
stack_t self = (stack_t)iter->parent;
stack_t self = (stack_t)iter->_parent;
// from top to bottom
uint32_t index = self->size(self) - 1 - self->_iter._cur;
@ -272,7 +273,7 @@ const void* stack_iter_next(struct _iterator* iter)
assert(iter != NULL);
assert(iter->parent != NULL);
stack_t self = (stack_t)iter->parent;
stack_t self = (stack_t)iter->_parent;
void *obj = NULL;
// from top to bottom
@ -291,7 +292,7 @@ bool stack_iter_hasnext(struct _iterator* iter)
assert(iter != NULL);
assert(iter->parent != NULL);
stack_t self = (stack_t)iter->parent;
stack_t self = (stack_t)iter->_parent;
if(self->_iter._cur < self->size(self))
{
return true;
@ -302,7 +303,7 @@ bool stack_iter_hasnext(struct _iterator* iter)
iterator_t stack_iter(struct _stack* self)
{
assert(self != NULL);
self->_iter.parent = self;
self->_iter._parent = self;
self->_iter._cur = 0;
self->_iter._cur_node = self->_head->next;
return &self->_iter;
@ -414,13 +415,15 @@ stack_t stack_new(uint32_t obj_size)
{
stack_t stack = NULL;
stack = (struct _stack*)calloc(1, sizeof(struct _stack));
if (stack != NULL)
if(stack == NULL)
{
if(stack_init(stack, obj_size) != true)
{
free(stack);
stack = NULL;
}
return NULL;
}
if(stack_init(stack, obj_size) != true)
{
free(stack);
return NULL;
}
return stack;
}
@ -429,13 +432,15 @@ stack_t stack_new2(uint32_t obj_size, uint32_t capacity)
{
stack_t stack = NULL;
stack = (struct _stack*)calloc(1, sizeof(struct _stack));
if (stack != NULL)
if (stack == NULL)
{
if(stack_init2(stack, obj_size, capacity) != true)
{
free(stack);
stack = NULL;
}
return NULL;
}
if(stack_init2(stack, obj_size, capacity) != true)
{
free(stack);
return NULL;
}
return stack;
}