修改迭代器,后续将迭代器接口统一

This commit is contained in:
建峰 2025-04-24 10:15:09 +08:00
parent 0d6ba14451
commit 0768e026dc
5 changed files with 25 additions and 64 deletions

View File

@ -25,6 +25,7 @@
"stdarg.h": "c", "stdarg.h": "c",
"graph.h": "c", "graph.h": "c",
"unicstl_config.h": "c", "unicstl_config.h": "c",
"iter.h": "c" "iter.h": "c",
"iterator.h": "c"
} }
} }

View File

@ -15,17 +15,11 @@
struct _iterator struct _iterator
{ {
void* obj;
void* self;
void* parent; void* parent;
uint32_t _cur;
void* (*begin)(struct _iterator* self);
void* (*next)(struct _iterator* self);
void* (*end)(struct _iterator* self);
bool (*hasnext)(struct _iterator* self); bool (*hasnext)(struct _iterator* self);
const void* (*next)(struct _iterator* self);
void* (*data)(struct _iterator* self);
}; };
typedef struct _iterator* iterator_t; typedef struct _iterator* iterator_t;

View File

@ -12,7 +12,7 @@
#define _LIST_H_ #define _LIST_H_
#include "common.h" #include "common.h"
#include "iter.h" #include "iterator.h"
struct _list struct _list
{ {

View File

@ -250,55 +250,33 @@ static bool list_init2(struct _list* list, uint32_t obj_size, uint32_t capacity)
return true; return true;
} }
iterator_t list_iter(struct _list* self) static const void* list_iter_next(struct _iterator* iter)
{
self->_cur = 0;
self->_iter.obj = self->obj;
return &self->_iter;
}
static void* list_iter_begin(struct _iterator* iter)
{ {
list_t self = (list_t)iter->parent; list_t self = (list_t)iter->parent;
self->_cur = 0; void *obj = self->obj + self->_iter._cur * self->_obj_size;
iter->obj = self->obj; self->_iter._cur += 1;
return iter; return obj;
}
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;
} }
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->_cur < self->_size) if(self->_iter._cur < self->size(self))
{ {
return true; return true;
} }
return false; 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) 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; list->iter = list_iter;
return list; return list;
} }

View File

@ -353,19 +353,16 @@ void list_iter_test(void)
TEST_ASSERT_FALSE(list->empty(list)); TEST_ASSERT_FALSE(list->empty(list));
} }
iterator_t it = list->iter(list); iterator_t iter = list->iter(list);
printf("iter start\n"); int iter_data = 0;
list->print(list); int idx = 0;
while(iter->hasnext(iter))
printf("\n");
while(it->hasnext(it))
{ {
int dd = *(int*)it->data(it); iter_data = *(int*)iter->next(iter);
printf("%d ", dd); // printf("%d ", dd);
it->next(it); TEST_ASSERT_EQUAL_INT(data[idx], iter_data);
idx++;
} }
printf("\niter end\n");
list_free(&list); list_free(&list);
} }