mirror of
https://gitee.com/apaki/unicstl.git
synced 2025-05-18 03:51:35 +08:00
针对start和end超出范围的处理
This commit is contained in:
parent
b5a83f865e
commit
802d63641c
11
src/list.c
11
src/list.c
@ -243,14 +243,25 @@ struct _list* list_slice(struct _list *self, int start, int end, int step)
|
|||||||
|
|
||||||
if(start < 0)
|
if(start < 0)
|
||||||
{
|
{
|
||||||
|
if(start < -self->size(self))
|
||||||
|
{
|
||||||
|
start = -self->size(self);
|
||||||
|
}
|
||||||
start += self->size(self);
|
start += self->size(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(end < 0)
|
if(end < 0)
|
||||||
{
|
{
|
||||||
|
if(end < -self->size(self))
|
||||||
|
{
|
||||||
|
end = -self->size(self);
|
||||||
|
}
|
||||||
end += self->size(self);
|
end += self->size(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// printf("start = %d\n", start);
|
||||||
|
// printf("end = %d\n", end);
|
||||||
|
|
||||||
uint32_t capicity = (end - start == 0) ? 1 : abs(end - start);
|
uint32_t capicity = (end - start == 0) ? 1 : abs(end - start);
|
||||||
list_t list = list_new2(self->_obj_size, capicity);
|
list_t list = list_new2(self->_obj_size, capicity);
|
||||||
if(list == NULL)
|
if(list == NULL)
|
||||||
|
@ -601,6 +601,7 @@ static void test_list_slice_negative(void)
|
|||||||
}
|
}
|
||||||
list_free(&list2);
|
list_free(&list2);
|
||||||
|
|
||||||
|
// -------------------- step == 2 --------------------
|
||||||
// python: list[::-2]
|
// python: list[::-2]
|
||||||
list2 = list->slice(list, len-1, 0, -2);
|
list2 = list->slice(list, len-1, 0, -2);
|
||||||
TEST_ASSERT_NOT_NULL(list2);
|
TEST_ASSERT_NOT_NULL(list2);
|
||||||
@ -613,6 +614,25 @@ static void test_list_slice_negative(void)
|
|||||||
}
|
}
|
||||||
list_free(&list2);
|
list_free(&list2);
|
||||||
|
|
||||||
|
// -------------------- step == 2 --------------------
|
||||||
|
// list[-30:-1]
|
||||||
|
list2 = list->slice(list, -30, -1, 1);
|
||||||
|
TEST_ASSERT_NOT_NULL(list2);
|
||||||
|
// list2->print(list2); printf("\n");
|
||||||
|
TEST_ASSERT_EQUAL_INT(len - 1, 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);
|
||||||
|
|
||||||
|
// list[-30:-10]
|
||||||
|
list2 = list->slice(list, -30, -10, 1);
|
||||||
|
TEST_ASSERT_NOT_NULL(list2);
|
||||||
|
TEST_ASSERT_TRUE(list2->empty(list2));
|
||||||
|
list_free(&list2);
|
||||||
|
|
||||||
list_free(&list);
|
list_free(&list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user