mirror of
https://gitee.com/apaki/unicstl.git
synced 2025-05-17 19:41:36 +08:00
slice单元测试基本都添加完毕,现在可以针对性的进行修改了
This commit is contained in:
parent
178d0bf5b4
commit
0f18ddf567
4
.vscode/settings.json
vendored
4
.vscode/settings.json
vendored
@ -27,6 +27,8 @@
|
||||
"unicstl_config.h": "c",
|
||||
"iter.h": "c",
|
||||
"iterator.h": "c",
|
||||
"assert.h": "c"
|
||||
"assert.h": "c",
|
||||
"limits.h": "c",
|
||||
"cstdint": "c"
|
||||
}
|
||||
}
|
@ -18,6 +18,8 @@
|
||||
#include "common.h"
|
||||
#include "iterator.h"
|
||||
|
||||
#define LIST_UNLIMITED INT32_MAX
|
||||
|
||||
struct _list
|
||||
{
|
||||
// -------------------- private --------------------
|
||||
|
33
src/list.c
33
src/list.c
@ -207,11 +207,22 @@ static void list_print(struct _list* self)
|
||||
struct _list* list_slice(struct _list *self, int start, int end, int step)
|
||||
{
|
||||
assert(self != NULL);
|
||||
int i = 0;
|
||||
if(step == 0)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if(start == LIST_UNLIMITED)
|
||||
{
|
||||
start = 0;
|
||||
}
|
||||
|
||||
if(end == LIST_UNLIMITED)
|
||||
{
|
||||
end = self->size(self);
|
||||
}
|
||||
|
||||
if(start < 0)
|
||||
{
|
||||
start += self->size(self);
|
||||
@ -234,7 +245,7 @@ struct _list* list_slice(struct _list *self, int start, int end, int step)
|
||||
goto done;
|
||||
}
|
||||
|
||||
if(start > self->size(self) || end > self->size(self))
|
||||
if(start >= self->size(self) || end > self->size(self))
|
||||
{
|
||||
return list;
|
||||
}
|
||||
@ -246,19 +257,31 @@ struct _list* list_slice(struct _list *self, int start, int end, int step)
|
||||
goto done;
|
||||
}
|
||||
|
||||
for(int i = start; i < end; i += step)
|
||||
for(i = start; i < end; i += step)
|
||||
{
|
||||
list->append(list, (char*)self->obj + i * self->_obj_size);
|
||||
}
|
||||
|
||||
if(end == LIST_UNLIMITED)
|
||||
{
|
||||
list->append(list, (char*)self->obj + i * self->_obj_size);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(start <= end)
|
||||
if(end < self->size(self))
|
||||
{
|
||||
goto done;
|
||||
if(start <= end)
|
||||
{
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
end = -1;
|
||||
}
|
||||
|
||||
for(int i = start; i > end; i += step)
|
||||
for(i = start; i > end; i += step)
|
||||
{
|
||||
list->append(list, (char*)self->obj + i * self->_obj_size);
|
||||
}
|
||||
|
@ -501,15 +501,62 @@ static void test_list_slice(void)
|
||||
}
|
||||
list_free(&list2);
|
||||
|
||||
// python: list[4::-1]
|
||||
// python: list[4:0:-1]
|
||||
list2 = list->slice(list, 4, 0, -1);
|
||||
TEST_ASSERT_NOT_NULL(list2);
|
||||
list2->print(list2); printf("\n");
|
||||
TEST_ASSERT_EQUAL_INT(4, list2->size(list2));
|
||||
for(i = 0; i < list2->size(list2); i++)
|
||||
{
|
||||
TEST_ASSERT_TRUE(list2->get(list2, i, &temp));
|
||||
TEST_ASSERT_EQUAL_INT(data[list2->size(list2) - i], temp);
|
||||
}
|
||||
list_free(&list2);
|
||||
|
||||
// -------------------- umlimited --------------------
|
||||
// python: list[0:]
|
||||
list2 = list->slice(list, 0, LIST_UNLIMITED, 1);
|
||||
TEST_ASSERT_NOT_NULL(list2);
|
||||
list2->print(list2); printf("\n");
|
||||
TEST_ASSERT_EQUAL_INT(len, list2->size(list2));
|
||||
for(i = 0; i < list2->size(list2); i++)
|
||||
{
|
||||
TEST_ASSERT_TRUE(list2->get(list2, i, &temp));
|
||||
TEST_ASSERT_EQUAL_INT(data[i], temp);
|
||||
}
|
||||
list_free(&list2);
|
||||
|
||||
// python: list[4::-1]
|
||||
list2 = list->slice(list, 4, LIST_UNLIMITED, -1);
|
||||
TEST_ASSERT_NOT_NULL(list2);
|
||||
list2->print(list2); printf("\n");
|
||||
TEST_ASSERT_EQUAL_INT(5, list2->size(list2));
|
||||
for(i = 0; i < list2->size(list2); i++)
|
||||
{
|
||||
TEST_ASSERT_TRUE(list2->get(list2, i, &temp));
|
||||
TEST_ASSERT_EQUAL_INT(data[list2->size(list2) - i], temp);
|
||||
TEST_ASSERT_EQUAL_INT(data[list2->size(list2) - 1 - i], temp);
|
||||
}
|
||||
list_free(&list2);
|
||||
|
||||
list2 = list->slice(list, LIST_UNLIMITED, LIST_UNLIMITED, 1);
|
||||
TEST_ASSERT_NOT_NULL(list2);
|
||||
list2->print(list2); printf("\n");
|
||||
TEST_ASSERT_EQUAL_INT(len, list2->size(list2));
|
||||
for(i = 0; i < list2->size(list2); i++)
|
||||
{
|
||||
TEST_ASSERT_TRUE(list2->get(list2, i, &temp));
|
||||
TEST_ASSERT_EQUAL_INT(data[i], temp);
|
||||
}
|
||||
list_free(&list2);
|
||||
|
||||
list2 = list->slice(list, LIST_UNLIMITED, LIST_UNLIMITED, -1);
|
||||
TEST_ASSERT_NOT_NULL(list2);
|
||||
list2->print(list2); printf("\n");
|
||||
TEST_ASSERT_EQUAL_INT(len, list2->size(list2));
|
||||
for(i = 0; i < list2->size(list2); i++)
|
||||
{
|
||||
TEST_ASSERT_TRUE(list2->get(list2, i, &temp));
|
||||
TEST_ASSERT_EQUAL_INT(data[list2->size(list2) - 1 - i], temp);
|
||||
}
|
||||
list_free(&list2);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user