mirror of
https://gitee.com/apaki/unicstl.git
synced 2025-05-17 11:31:37 +08:00
修改迭代器,后续将迭代器接口统一
This commit is contained in:
parent
0d6ba14451
commit
0768e026dc
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@ -25,6 +25,7 @@
|
||||
"stdarg.h": "c",
|
||||
"graph.h": "c",
|
||||
"unicstl_config.h": "c",
|
||||
"iter.h": "c"
|
||||
"iter.h": "c",
|
||||
"iterator.h": "c"
|
||||
}
|
||||
}
|
@ -15,17 +15,11 @@
|
||||
|
||||
struct _iterator
|
||||
{
|
||||
void* obj;
|
||||
void* self;
|
||||
void* parent;
|
||||
|
||||
void* (*begin)(struct _iterator* self);
|
||||
void* (*next)(struct _iterator* self);
|
||||
void* (*end)(struct _iterator* self);
|
||||
uint32_t _cur;
|
||||
|
||||
bool (*hasnext)(struct _iterator* self);
|
||||
|
||||
void* (*data)(struct _iterator* self);
|
||||
const void* (*next)(struct _iterator* self);
|
||||
};
|
||||
typedef struct _iterator* iterator_t;
|
||||
|
@ -12,7 +12,7 @@
|
||||
#define _LIST_H_
|
||||
|
||||
#include "common.h"
|
||||
#include "iter.h"
|
||||
#include "iterator.h"
|
||||
|
||||
struct _list
|
||||
{
|
||||
|
55
src/list.c
55
src/list.c
@ -250,55 +250,33 @@ static bool list_init2(struct _list* list, uint32_t obj_size, uint32_t capacity)
|
||||
return true;
|
||||
}
|
||||
|
||||
iterator_t list_iter(struct _list* self)
|
||||
{
|
||||
self->_cur = 0;
|
||||
self->_iter.obj = self->obj;
|
||||
return &self->_iter;
|
||||
}
|
||||
|
||||
static void* list_iter_begin(struct _iterator* iter)
|
||||
static const void* list_iter_next(struct _iterator* iter)
|
||||
{
|
||||
list_t self = (list_t)iter->parent;
|
||||
self->_cur = 0;
|
||||
iter->obj = self->obj;
|
||||
return iter;
|
||||
}
|
||||
|
||||
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;
|
||||
void *obj = self->obj + self->_iter._cur * self->_obj_size;
|
||||
self->_iter._cur += 1;
|
||||
return obj;
|
||||
}
|
||||
|
||||
static bool list_iter_hasnext(struct _iterator* iter)
|
||||
{
|
||||
list_t self = (list_t)iter->parent;
|
||||
|
||||
if(self->_cur < self->_size)
|
||||
if(self->_iter._cur < self->size(self))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
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)
|
||||
@ -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;
|
||||
return list;
|
||||
}
|
||||
|
@ -353,19 +353,16 @@ void list_iter_test(void)
|
||||
TEST_ASSERT_FALSE(list->empty(list));
|
||||
}
|
||||
|
||||
iterator_t it = list->iter(list);
|
||||
printf("iter start\n");
|
||||
list->print(list);
|
||||
|
||||
printf("\n");
|
||||
while(it->hasnext(it))
|
||||
iterator_t iter = list->iter(list);
|
||||
int iter_data = 0;
|
||||
int idx = 0;
|
||||
while(iter->hasnext(iter))
|
||||
{
|
||||
int dd = *(int*)it->data(it);
|
||||
printf("%d ", dd);
|
||||
it->next(it);
|
||||
iter_data = *(int*)iter->next(iter);
|
||||
// printf("%d ", dd);
|
||||
TEST_ASSERT_EQUAL_INT(data[idx], iter_data);
|
||||
idx++;
|
||||
}
|
||||
printf("\niter end\n");
|
||||
|
||||
list_free(&list);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user