针对start和end超出范围的处理

This commit is contained in:
建峰 2025-04-30 02:18:07 +08:00
parent b5a83f865e
commit 802d63641c
2 changed files with 31 additions and 0 deletions

View File

@ -243,14 +243,25 @@ struct _list* list_slice(struct _list *self, int start, int end, int step)
if(start < 0)
{
if(start < -self->size(self))
{
start = -self->size(self);
}
start += self->size(self);
}
if(end < 0)
{
if(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);
list_t list = list_new2(self->_obj_size, capicity);
if(list == NULL)

View File

@ -601,6 +601,7 @@ static void test_list_slice_negative(void)
}
list_free(&list2);
// -------------------- step == 2 --------------------
// python: list[::-2]
list2 = list->slice(list, len-1, 0, -2);
TEST_ASSERT_NOT_NULL(list2);
@ -613,6 +614,25 @@ static void test_list_slice_negative(void)
}
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);
}