diff --git a/src/list.c b/src/list.c index 453f1aa..dee6509 100644 --- a/src/list.c +++ b/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 < -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) diff --git a/test/test_list.c b/test/test_list.c index c18d068..24d6503 100644 --- a/test/test_list.c +++ b/test/test_list.c @@ -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); }