mirror of
https://gitee.com/apaki/unicstl.git
synced 2025-05-17 11:31:37 +08:00
根据实测情况来看,iter的方案是可行的,后续再考虑实现细节吧
This commit is contained in:
parent
23fc67cb49
commit
0d6ba14451
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@ -24,6 +24,7 @@
|
||||
"unity_internals.h": "c",
|
||||
"stdarg.h": "c",
|
||||
"graph.h": "c",
|
||||
"unicstl_config.h": "c"
|
||||
"unicstl_config.h": "c",
|
||||
"iter.h": "c"
|
||||
}
|
||||
}
|
32
include/iter.h
Normal file
32
include/iter.h
Normal file
@ -0,0 +1,32 @@
|
||||
/**
|
||||
* @file iter.h
|
||||
* @author wenjf (Orig5826@163.com)
|
||||
* @brief
|
||||
* @version 0.1
|
||||
* @date 2025-04-23
|
||||
*
|
||||
* @copyright Copyright (c) 2025
|
||||
*
|
||||
*/
|
||||
#ifndef _ITER_H_
|
||||
#define _ITER_H_
|
||||
|
||||
#include "common.h"
|
||||
|
||||
struct _iterator
|
||||
{
|
||||
void* obj;
|
||||
void* self;
|
||||
void* parent;
|
||||
|
||||
void* (*begin)(struct _iterator* self);
|
||||
void* (*next)(struct _iterator* self);
|
||||
void* (*end)(struct _iterator* self);
|
||||
|
||||
bool (*hasnext)(struct _iterator* self);
|
||||
|
||||
void* (*data)(struct _iterator* self);
|
||||
};
|
||||
typedef struct _iterator* iterator_t;
|
||||
|
||||
#endif // !_ITER_H_
|
@ -12,6 +12,7 @@
|
||||
#define _LIST_H_
|
||||
|
||||
#include "common.h"
|
||||
#include "iter.h"
|
||||
|
||||
struct _list
|
||||
{
|
||||
@ -23,6 +24,9 @@ struct _list
|
||||
uint32_t _ratio;
|
||||
uint32_t _cur;
|
||||
|
||||
struct _iterator _iter;
|
||||
iterator_t (*iter)(struct _list* self);
|
||||
|
||||
// kernel
|
||||
bool (*append)(struct _list* self, void* obj); // Append object to the end of the list.
|
||||
bool (*insert)(struct _list* self, int index, void* obj); // Insert object before index.
|
||||
|
65
src/list.c
65
src/list.c
@ -250,6 +250,57 @@ 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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
static bool list_iter_hasnext(struct _iterator* iter)
|
||||
{
|
||||
list_t self = (list_t)iter->parent;
|
||||
|
||||
if(self->_cur < self->_size)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static void* list_iter_data(struct _iterator* iter)
|
||||
{
|
||||
return iter->obj;
|
||||
}
|
||||
|
||||
list_t list_new2(uint32_t obj_size, uint32_t capacity)
|
||||
{
|
||||
struct _list* list = NULL;
|
||||
@ -259,9 +310,21 @@ list_t list_new2(uint32_t obj_size, uint32_t capacity)
|
||||
if(list_init2(list, obj_size, capacity) != true)
|
||||
{
|
||||
free(list);
|
||||
list = NULL;
|
||||
// list = NULL;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -328,6 +328,47 @@ static void test_list_iter(void)
|
||||
list_free(&list);
|
||||
}
|
||||
|
||||
void list_iter_test(void)
|
||||
{
|
||||
int temp = 0;
|
||||
int data[] = { 1,2,3,4,5,6,7,8,9,10 };
|
||||
uint32_t len = sizeof(data) / sizeof(data[0]);
|
||||
uint32_t i = 0;
|
||||
|
||||
list_t list = NULL;
|
||||
|
||||
// ------------------------------
|
||||
list = list_new2(sizeof(int), len);
|
||||
TEST_ASSERT_TRUE(list->empty(list));
|
||||
list->print_obj = print_num;
|
||||
|
||||
for(i = 0; i < len; i++)
|
||||
{
|
||||
TEST_ASSERT_TRUE(list->append(list, &data[i]));
|
||||
TEST_ASSERT_EQUAL_INT(i + 1, list->size(list));
|
||||
|
||||
TEST_ASSERT_TRUE(list->get(list, i, &temp));
|
||||
TEST_ASSERT_EQUAL_INT(data[i], temp);
|
||||
|
||||
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))
|
||||
{
|
||||
int dd = *(int*)it->data(it);
|
||||
printf("%d ", dd);
|
||||
it->next(it);
|
||||
}
|
||||
printf("\niter end\n");
|
||||
|
||||
list_free(&list);
|
||||
}
|
||||
|
||||
void test_list(void)
|
||||
{
|
||||
UnitySetTestFile(__FILE__);
|
||||
@ -341,4 +382,6 @@ void test_list(void)
|
||||
RUN_TEST(test_list_struct);
|
||||
|
||||
RUN_TEST(test_list_iter);
|
||||
|
||||
RUN_TEST(list_iter_test);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user