From 3f8f418d4e1fda755b6daf09ddbefa12f5bffb0b Mon Sep 17 00:00:00 2001 From: wjf-hs Date: Wed, 30 Apr 2025 13:25:12 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=BB=E8=BE=91=E7=9B=B8=E5=AF=B9=E6=B8=85?= =?UTF-8?q?=E6=99=B0=E4=B8=80=E7=82=B9=EF=BC=8C=E8=BF=98=E5=B7=AE=E9=83=A8?= =?UTF-8?q?=E5=88=86=E9=80=BB=E8=BE=91=E6=B2=A1=E8=B0=83=E9=80=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/list.c | 195 ++++++++++++++++++----------------------------- test/test_list.c | 6 +- 2 files changed, 79 insertions(+), 122 deletions(-) diff --git a/src/list.c b/src/list.c index 0edab73..9524eff 100644 --- a/src/list.c +++ b/src/list.c @@ -345,67 +345,98 @@ done: uint32_t capacity = 1; int i = 0; bool contain_last_obj = false; + int temp = 0; + bool negative = false; if (step == 0) { return NULL; } - if (step > 0) + if(step < 0) { - // special case - if (start == LIST_UNLIMITED) + negative = true; + step = -step; + + temp = start; + if(start >= 0) + { + start = end + 1; + } + else + { + start = end; + } + + if(end >= 0) + { + end = temp + 1; + } + else + { + end = temp; + } + } + + if(start < 0) + { + start += (int)self->size(self); + if(start < 0) { start = 0; } - if (end == LIST_UNLIMITED) + } + else + { + if(start == LIST_UNLIMITED) { - end = self->size(self); + start = 0; contain_last_obj = true; } - // [start_max, end_min] start < end and limit start_max and end_min - if (start >= end || start >= self->size(self) || end < -self->size(self)) + if(start >= (int)self->size(self)) { empty = true; } + } - if (empty != true) + if(end < 0) + { + end += (int)self->size(self); + if(end < 0) { - if (start < 0) - { - if (start < -self->size(self)) - { - start = -self->size(self); - } - start += self->size(self); - } + empty = true; + } + } + else + { + if (end == LIST_UNLIMITED || end >= (int)self->size(self)) + { + end = (int)self->size(self) - 1; + contain_last_obj = true; + } + } - if (end < 0) - { - end += self->size(self); - } - else - { - if (end > self->size(self)) - { - end = self->size(self); - contain_last_obj = true; - } - } + if(start >= end) + { + empty = true; + } - if (empty != true) - { - // calc capacity - capacity = end - start; - } - list = list_new2(self->_obj_size, capacity); - if (list == NULL) - { - return NULL; - } - list->compare = self->compare; - list->print_obj = self->print_obj; + if (empty != true) + { + capacity = end - start; + } + list = list_new2(self->_obj_size, capacity); + if (list == NULL) + { + return NULL; + } + list->compare = self->compare; + list->print_obj = self->print_obj; + if(empty != true) + { + if(negative != true) + { if (contain_last_obj != true) { for (i = start; i < end; i += step) @@ -423,98 +454,24 @@ done: } else { - list = list_new2(self->_obj_size, capacity); - if (list == NULL) - { - return NULL; - } - list->compare = self->compare; - list->print_obj = self->print_obj; - } - } - else - { - // special case - if (start == LIST_UNLIMITED) - { - start = self->size(self) - 1; - } - if (end == LIST_UNLIMITED) - { - end = 0; - contain_last_obj = true; - } - - // [start_min, end_max] start > end and limit start_min and end_max - if (start <= end || end >= self->size(self) || start < -self->size(self)) - { - empty = true; - } - - if (empty != true) - { - if (start < 0) - { - if (start < -self->size(self)) - { - start = -self->size(self); - } - start += self->size(self); - } - else - { - if (start > self->size(self)) - { - start = self->size(self) - 1; - contain_last_obj = true; - } - } - - if (end < 0) - { - end += self->size(self); - } - - if (empty != true) - { - // calc capacity - capacity = end - start; - } - list = list_new2(self->_obj_size, capacity); - if (list == NULL) - { - return NULL; - } - list->compare = self->compare; - list->print_obj = self->print_obj; - if (contain_last_obj != true) { - for (i = start; i > end; i += step) + for (i = start; i < end; i += step) { - list->append(list, (char*)self->obj + i * self->_obj_size); + list->insert(list, 0, (char*)self->obj + i * self->_obj_size); } } else { - for (i = start; i >= end; i += step) + for (i = start; i <= end; i += step) { - list->append(list, (char*)self->obj + i * self->_obj_size); + list->insert(list, 0, (char*)self->obj + i * self->_obj_size); } } } - else - { - list = list_new2(self->_obj_size, capacity); - if (list == NULL) - { - return NULL; - } - list->compare = self->compare; - list->print_obj = self->print_obj; - } } +done: return list; #endif } diff --git a/test/test_list.c b/test/test_list.c index 843f8f6..f82988e 100644 --- a/test/test_list.c +++ b/test/test_list.c @@ -472,12 +472,12 @@ static void test_list_slice_empty(void) list_free(&list2); // -------------------- empty -------------------- - list2 = list->slice(list, len, len + 10, 1); // if start > start_max + list2 = list->slice(list, len, len + 1, 1); // if start > start_max TEST_ASSERT_NOT_NULL(list2); TEST_ASSERT_TRUE(list2->empty(list2)); list_free(&list2); - list2 = list->slice(list, -len - 10, -len, 1); // if end < end_min + list2 = list->slice(list, -len - 1, -len, 1); // if end < end_min TEST_ASSERT_NOT_NULL(list2); TEST_ASSERT_TRUE(list2->empty(list2)); list_free(&list2); @@ -545,7 +545,7 @@ static void test_list_slice_positive(void) // python: list[4:0:-1] list2 = list->slice(list, 4, 0, -1); 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++) {