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 struct _iterator
{ {
void* parent; // ---------- private ----------
void* _parent;
void* _cur_node; void* _cur_node;
uint32_t _cur; uint32_t _cur;
// ---------- public ----------
bool (*hasnext)(struct _iterator* self); bool (*hasnext)(struct _iterator* self);
const void* (*next)(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) 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; void *obj = self->obj + self->_iter._cur * self->_obj_size;
self->_iter._cur += 1; self->_iter._cur += 1;
return obj; return obj;
@ -189,7 +189,7 @@ static const void* list_iter_next(struct _iterator* iter)
static bool list_iter_hasnext(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)) 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) iterator_t list_iter(struct _list* self)
{ {
self->_iter.parent = self; self->_iter._parent = self;
self->_iter._cur = 0; self->_iter._cur = 0;
return &self->_iter; return &self->_iter;
} }

View File

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