根据实测情况来看,iter的方案是可行的,后续再考虑实现细节吧

This commit is contained in:
建峰 2025-04-23 18:35:24 +08:00
parent 23fc67cb49
commit 0d6ba14451
5 changed files with 145 additions and 2 deletions

View File

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

32
include/iter.h Normal file
View 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_

View File

@ -12,6 +12,7 @@
#define _LIST_H_ #define _LIST_H_
#include "common.h" #include "common.h"
#include "iter.h"
struct _list struct _list
{ {
@ -23,6 +24,9 @@ struct _list
uint32_t _ratio; uint32_t _ratio;
uint32_t _cur; uint32_t _cur;
struct _iterator _iter;
iterator_t (*iter)(struct _list* self);
// kernel // kernel
bool (*append)(struct _list* self, void* obj); // Append object to the end of the list. 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. bool (*insert)(struct _list* self, int index, void* obj); // Insert object before index.

View File

@ -250,6 +250,57 @@ 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)
{
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) list_t list_new2(uint32_t obj_size, uint32_t capacity)
{ {
struct _list* list = NULL; 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) if(list_init2(list, obj_size, capacity) != true)
{ {
free(list); 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; return list;
} }

View File

@ -328,6 +328,47 @@ static void test_list_iter(void)
list_free(&list); 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) void test_list(void)
{ {
UnitySetTestFile(__FILE__); UnitySetTestFile(__FILE__);
@ -341,4 +382,6 @@ void test_list(void)
RUN_TEST(test_list_struct); RUN_TEST(test_list_struct);
RUN_TEST(test_list_iter); RUN_TEST(test_list_iter);
RUN_TEST(list_iter_test);
} }