mirror of
https://gitee.com/apaki/unicstl.git
synced 2026-05-28 22:54:19 +08:00
fix(iter): 修复反向迭代终止条件及指针解引用错误
This commit is contained in:
parent
f6cbf4f7d1
commit
81d9cf3c13
16
README.md
16
README.md
@ -79,7 +79,7 @@ segarray *-- ringbuf : 组合
|
|||||||
segarray *-- rawbuf : 组合
|
segarray *-- rawbuf : 组合
|
||||||
|
|
||||||
arraylist *-- darray : 组合
|
arraylist *-- darray : 组合
|
||||||
string *-- darray : 组合
|
string *-- arraylist : 组合
|
||||||
hashtable *-- darray : 组合
|
hashtable *-- darray : 组合
|
||||||
|
|
||||||
|
|
||||||
@ -107,22 +107,26 @@ equeue ..> ringbuf : 依赖
|
|||||||
## 数据结构
|
## 数据结构
|
||||||
|
|
||||||
### 底层基础容器
|
### 底层基础容器
|
||||||
> 原生裸数据结构
|
|
||||||
|
|
||||||
|数据结构 |名称 |说明 |
|
|数据结构 |名称 |说明 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| darray | 动态数组 | 扩容
|
|
||||||
| ringbuf | 环形缓存区 | 扩容/外部缓存
|
|
||||||
| linklist | 单链表 |
|
| linklist | 单链表 |
|
||||||
| dlinklist | 双向链表 |
|
| dlinklist | 双向链表 |
|
||||||
|
| darray | 动态数组 | 扩容
|
||||||
|
| ringbuf | 环形缓存区 | 扩容/外部缓存
|
||||||
| rawbuf | 原始缓冲区 | 动态分配固定容量/外部缓存
|
| rawbuf | 原始缓冲区 | 动态分配固定容量/外部缓存
|
||||||
| segarray | 分段数组 | 扩容
|
| segarray | 分段数组 | 扩容
|
||||||
|
|
||||||
|
### 中层容器
|
||||||
|
|数据结构 |名称 |说明 |
|
||||||
|
|---|---|---|
|
||||||
|
| segarray | 分段数组 | 扩容
|
||||||
|
| arraylist | 动态数组 | 扩容(负索引/切片)
|
||||||
|
|
||||||
**使用建议**
|
**使用建议**
|
||||||
- ringbuf 小数据,少库容
|
- ringbuf 小数据,少库容
|
||||||
- segarray 大数据,优先扩容
|
- segarray 大数据,优先扩容
|
||||||
|
|
||||||
|
|
||||||
### 通用标准容器
|
### 通用标准容器
|
||||||
> 基于底层封装
|
> 基于底层封装
|
||||||
|
|
||||||
@ -131,6 +135,7 @@ equeue ..> ringbuf : 依赖
|
|||||||
| deque | 双端队列 | 扩容
|
| deque | 双端队列 | 扩容
|
||||||
| stack | 栈 | 扩容
|
| stack | 栈 | 扩容
|
||||||
| queue | 队列 | 扩容
|
| queue | 队列 | 扩容
|
||||||
|
| ustring | 字符串 | 扩容
|
||||||
|
|
||||||
### 嵌入式专用容器
|
### 嵌入式专用容器
|
||||||
> 适配嵌入式场景、外置内存、无动态堆分配
|
> 适配嵌入式场景、外置内存、无动态堆分配
|
||||||
@ -192,6 +197,7 @@ size_t index(void *obj); // 获取元素索引, -1为不存在
|
|||||||
|
|
||||||
bool insert(size_t index, const void* obj); // 插入元素
|
bool insert(size_t index, const void* obj); // 插入元素
|
||||||
bool remove(size_t index, const void *obj); // 删除元素 < delete !!!废弃:防止项目用于C++,关键字冲突>
|
bool remove(size_t index, const void *obj); // 删除元素 < delete !!!废弃:防止项目用于C++,关键字冲突>
|
||||||
|
bool erase(size_t index, size_t count); // 删除区间元素
|
||||||
|
|
||||||
// 随机访问
|
// 随机访问
|
||||||
bool set(uint32_t index, const void* obj); // 设置元素
|
bool set(uint32_t index, const void* obj); // 设置元素
|
||||||
|
|||||||
@ -238,7 +238,7 @@ bool darray_iter_hasnext(struct _iterator *iter)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (iter->_index == 0)
|
if (iter->_index == -1)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -306,7 +306,7 @@ bool ringbuf_iter_hasnext(struct _iterator *iter)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (iter->_index == self->_head)
|
if (iter->_index == ring_index_prev(self->_head, self->_capacity))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -636,7 +636,7 @@ bool segarray_iter_hasnext(struct _iterator *iter)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (iter->_index == 0)
|
if (iter->_index == -1)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -324,7 +324,7 @@ bool ustring_iter_hasnext(struct _iterator *iter)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (iter->_index == 0)
|
if (iter->_index == (size_t)-1)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -348,7 +348,7 @@ const void *ustring_iter_next(struct _iterator *iter)
|
|||||||
{
|
{
|
||||||
iter->_index = iter->_index - 1;
|
iter->_index = iter->_index - 1;
|
||||||
}
|
}
|
||||||
return self->_alist->at(self->_alist, index);
|
return self->at(self, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
iterator_t ustring_iter(struct _ustring *self, linear_order_t order)
|
iterator_t ustring_iter(struct _ustring *self, linear_order_t order)
|
||||||
@ -367,7 +367,6 @@ iterator_t ustring_iter(struct _ustring *self, linear_order_t order)
|
|||||||
{
|
{
|
||||||
iter->_index = self->len(self) - 1;
|
iter->_index = self->len(self) - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
iter->hasnext = ustring_iter_hasnext;
|
iter->hasnext = ustring_iter_hasnext;
|
||||||
iter->next = ustring_iter_next;
|
iter->next = ustring_iter_next;
|
||||||
return iter;
|
return iter;
|
||||||
@ -394,8 +393,8 @@ static size_t ustring_count(struct _ustring *self, uview_t uvstr)
|
|||||||
{
|
{
|
||||||
unicstl_assert(self != NULL);
|
unicstl_assert(self != NULL);
|
||||||
size_t count = 0;
|
size_t count = 0;
|
||||||
char *p = self->cstr(self);
|
char *p = (char *)self->cstr(self);
|
||||||
while(p != '\0')
|
while(*p != '\0')
|
||||||
{
|
{
|
||||||
p = strstr(p, uvstr.str);
|
p = strstr(p, uvstr.str);
|
||||||
if(p == NULL)
|
if(p == NULL)
|
||||||
|
|||||||
@ -20,7 +20,7 @@
|
|||||||
#include "unity.h"
|
#include "unity.h"
|
||||||
|
|
||||||
|
|
||||||
#define UNITTEST_ALL 0
|
#define UNITTEST_ALL 1
|
||||||
|
|
||||||
#define UNITTEST_LINKLIST (UNITTEST_ALL || 0)
|
#define UNITTEST_LINKLIST (UNITTEST_ALL || 0)
|
||||||
#define UNITTEST_DLINKLIST (UNITTEST_ALL || 0)
|
#define UNITTEST_DLINKLIST (UNITTEST_ALL || 0)
|
||||||
|
|||||||
@ -870,7 +870,7 @@ static void test_arraylist_iter(void)
|
|||||||
TEST_ASSERT_EQUAL_INT(data[i], temp);
|
TEST_ASSERT_EQUAL_INT(data[i], temp);
|
||||||
i--;
|
i--;
|
||||||
}
|
}
|
||||||
TEST_ASSERT_EQUAL_INT(0, i);
|
TEST_ASSERT_EQUAL_INT(-1, i);
|
||||||
|
|
||||||
arraylist_free(&arraylist);
|
arraylist_free(&arraylist);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -662,8 +662,10 @@ static void test_darray_iter(void)
|
|||||||
temp = *(int *)iter->next(iter);
|
temp = *(int *)iter->next(iter);
|
||||||
TEST_ASSERT_EQUAL_INT(data[i], temp);
|
TEST_ASSERT_EQUAL_INT(data[i], temp);
|
||||||
i--;
|
i--;
|
||||||
|
|
||||||
|
// darray->print_obj(&temp);
|
||||||
}
|
}
|
||||||
TEST_ASSERT_EQUAL_INT(0, i);
|
TEST_ASSERT_EQUAL_INT(-1, i);
|
||||||
|
|
||||||
darray_free(&darray);
|
darray_free(&darray);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -375,7 +375,7 @@ static void test_deque_iter(void)
|
|||||||
TEST_ASSERT_EQUAL_INT(data[i], temp);
|
TEST_ASSERT_EQUAL_INT(data[i], temp);
|
||||||
i--;
|
i--;
|
||||||
}
|
}
|
||||||
TEST_ASSERT_EQUAL_INT(0, i);
|
TEST_ASSERT_EQUAL_INT(-1, i);
|
||||||
|
|
||||||
deque_free(&deque);
|
deque_free(&deque);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -511,8 +511,10 @@ static void test_ringbuf_iter(void)
|
|||||||
temp = *(int *)iter->next(iter);
|
temp = *(int *)iter->next(iter);
|
||||||
TEST_ASSERT_EQUAL_INT(data[i], temp);
|
TEST_ASSERT_EQUAL_INT(data[i], temp);
|
||||||
i--;
|
i--;
|
||||||
|
|
||||||
|
ringbuf->print_obj(&temp);
|
||||||
}
|
}
|
||||||
TEST_ASSERT_EQUAL_INT(0, i);
|
TEST_ASSERT_EQUAL_INT(-1, i);
|
||||||
|
|
||||||
ringbuf_free(&ringbuf);
|
ringbuf_free(&ringbuf);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -489,7 +489,7 @@ static void test_segarray_iter(void)
|
|||||||
TEST_ASSERT_EQUAL_INT(data[i], temp);
|
TEST_ASSERT_EQUAL_INT(data[i], temp);
|
||||||
i--;
|
i--;
|
||||||
}
|
}
|
||||||
TEST_ASSERT_EQUAL_INT(0, i);
|
TEST_ASSERT_EQUAL_INT(-1, i);
|
||||||
log_info("iter-reverse cuccess!");
|
log_info("iter-reverse cuccess!");
|
||||||
|
|
||||||
segarray_free(&segarray);
|
segarray_free(&segarray);
|
||||||
|
|||||||
@ -430,6 +430,47 @@ void test_ustring_count(void)
|
|||||||
ustring_free(&str);
|
ustring_free(&str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_ustring_iter(void)
|
||||||
|
{
|
||||||
|
const char *data = "hello wolrd!";
|
||||||
|
ustring_t ustring = ustring_new(uv(data));
|
||||||
|
|
||||||
|
size_t i = 0;
|
||||||
|
char temp;
|
||||||
|
size_t len = ustring->len(ustring);
|
||||||
|
|
||||||
|
iterator_t iter = ustring->iter(ustring, LINEAR_FORWARD);
|
||||||
|
i = 0;
|
||||||
|
TEST_ASSERT_TRUE(iter->hasnext(iter));
|
||||||
|
while(iter->hasnext(iter))
|
||||||
|
{
|
||||||
|
temp = *(int *)iter->next(iter);
|
||||||
|
TEST_ASSERT_EQUAL_INT(data[i], temp);
|
||||||
|
i++;
|
||||||
|
|
||||||
|
// ustring->print_obj(&temp);
|
||||||
|
}
|
||||||
|
TEST_ASSERT_EQUAL_INT(len, i);
|
||||||
|
|
||||||
|
iter = ustring->iter(ustring, LINEAR_REVERSE);
|
||||||
|
i = 0;
|
||||||
|
size_t idx = len - 1;
|
||||||
|
TEST_ASSERT_TRUE(iter->hasnext(iter));
|
||||||
|
while(iter->hasnext(iter))
|
||||||
|
{
|
||||||
|
temp = *(int *)iter->next(iter);
|
||||||
|
|
||||||
|
TEST_ASSERT_EQUAL_INT(data[idx], temp);
|
||||||
|
idx-=1;
|
||||||
|
i++;
|
||||||
|
ustring->print_obj(&temp);
|
||||||
|
}
|
||||||
|
TEST_ASSERT_EQUAL_INT(len, i);
|
||||||
|
|
||||||
|
ustring_free(&ustring);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void test_ustring(void)
|
void test_ustring(void)
|
||||||
{
|
{
|
||||||
UnitySetTestFile(__FILE__);
|
UnitySetTestFile(__FILE__);
|
||||||
@ -480,4 +521,6 @@ void test_ustring(void)
|
|||||||
RUN_TEST(test_ustring_substr);
|
RUN_TEST(test_ustring_substr);
|
||||||
RUN_TEST(test_ustring_index);
|
RUN_TEST(test_ustring_index);
|
||||||
RUN_TEST(test_ustring_count);
|
RUN_TEST(test_ustring_count);
|
||||||
|
|
||||||
|
RUN_TEST(test_ustring_iter);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user