slice单元测试基本都添加完毕,现在可以针对性的进行修改了

This commit is contained in:
建峰 2025-04-30 00:58:28 +08:00
parent 178d0bf5b4
commit 0f18ddf567
4 changed files with 82 additions and 8 deletions

View File

@ -27,6 +27,8 @@
"unicstl_config.h": "c", "unicstl_config.h": "c",
"iter.h": "c", "iter.h": "c",
"iterator.h": "c", "iterator.h": "c",
"assert.h": "c" "assert.h": "c",
"limits.h": "c",
"cstdint": "c"
} }
} }

View File

@ -18,6 +18,8 @@
#include "common.h" #include "common.h"
#include "iterator.h" #include "iterator.h"
#define LIST_UNLIMITED INT32_MAX
struct _list struct _list
{ {
// -------------------- private -------------------- // -------------------- private --------------------

View File

@ -207,11 +207,22 @@ static void list_print(struct _list* self)
struct _list* list_slice(struct _list *self, int start, int end, int step) struct _list* list_slice(struct _list *self, int start, int end, int step)
{ {
assert(self != NULL); assert(self != NULL);
int i = 0;
if(step == 0) if(step == 0)
{ {
return NULL; return NULL;
} }
if(start == LIST_UNLIMITED)
{
start = 0;
}
if(end == LIST_UNLIMITED)
{
end = self->size(self);
}
if(start < 0) if(start < 0)
{ {
start += self->size(self); start += self->size(self);
@ -234,7 +245,7 @@ struct _list* list_slice(struct _list *self, int start, int end, int step)
goto done; goto done;
} }
if(start > self->size(self) || end > self->size(self)) if(start >= self->size(self) || end > self->size(self))
{ {
return list; return list;
} }
@ -246,19 +257,31 @@ struct _list* list_slice(struct _list *self, int start, int end, int step)
goto done; 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); list->append(list, (char*)self->obj + i * self->_obj_size);
} }
} }
else 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); list->append(list, (char*)self->obj + i * self->_obj_size);
} }

View File

@ -501,15 +501,62 @@ static void test_list_slice(void)
} }
list_free(&list2); list_free(&list2);
// python: list[4::-1] // python: list[4:0:-1]
list2 = list->slice(list, 4, 0, -1); list2 = list->slice(list, 4, 0, -1);
TEST_ASSERT_NOT_NULL(list2); TEST_ASSERT_NOT_NULL(list2);
list2->print(list2); printf("\n"); 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)); TEST_ASSERT_EQUAL_INT(5, list2->size(list2));
for(i = 0; i < list2->size(list2); i++) for(i = 0; i < list2->size(list2); i++)
{ {
TEST_ASSERT_TRUE(list2->get(list2, i, &temp)); 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); list_free(&list2);