mirror of
https://gitee.com/apaki/unicstl.git
synced 2025-07-03 23:56:54 +08:00
看起来得加一个宏定义了,专门用语处理end无限长的
This commit is contained in:
parent
e49f425e43
commit
178d0bf5b4
45
src/list.c
45
src/list.c
@ -216,18 +216,12 @@ struct _list* list_slice(struct _list *self, int start, int end, int step)
|
|||||||
{
|
{
|
||||||
start += self->size(self);
|
start += self->size(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(end < 0)
|
if(end < 0)
|
||||||
{
|
{
|
||||||
end += self->size(self);
|
end += self->size(self);
|
||||||
}
|
}
|
||||||
|
uint32_t capicity = (end - start == 0) ? 1 : end - start;
|
||||||
if(start > self->size(self) || end > self->size(self))
|
list_t list = list_new2(self->_obj_size, capicity);
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
list_t list = list_new2(self->_obj_size, end - start);
|
|
||||||
if(list == NULL)
|
if(list == NULL)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -235,47 +229,42 @@ struct _list* list_slice(struct _list *self, int start, int end, int step)
|
|||||||
list->compare = self->compare;
|
list->compare = self->compare;
|
||||||
list->print_obj = self->print_obj;
|
list->print_obj = self->print_obj;
|
||||||
|
|
||||||
|
if(capicity == 0)
|
||||||
|
{
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(start > self->size(self) || end > self->size(self))
|
||||||
|
{
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
if(step > 0)
|
if(step > 0)
|
||||||
{
|
{
|
||||||
if(start >= end)
|
if(start >= end)
|
||||||
{
|
{
|
||||||
return NULL;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int i = start; i < end; i += step)
|
for(int i = start; i < end; i += step)
|
||||||
{
|
{
|
||||||
if(i >= self->size(self))
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
list->append(list, (char*)self->obj + i * self->_obj_size);
|
list->append(list, (char*)self->obj + i * self->_obj_size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
uint32_t temp = 0;
|
|
||||||
if(start <= end)
|
if(start <= end)
|
||||||
{
|
{
|
||||||
return NULL;
|
goto done;
|
||||||
}
|
}
|
||||||
// start ^= end;
|
|
||||||
// end ^= start;
|
|
||||||
// start ^= end;
|
|
||||||
temp = start;
|
|
||||||
start = end;
|
|
||||||
end = temp;
|
|
||||||
step = -step;
|
|
||||||
|
|
||||||
for(int i = start; i < end; i += step)
|
for(int i = start; i > end; i += step)
|
||||||
{
|
{
|
||||||
if(i >= self->size(self))
|
list->append(list, (char*)self->obj + i * self->_obj_size);
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
list->insert(list, 0, (char*)self->obj + i * self->_obj_size);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -448,11 +448,11 @@ static void test_list_slice(void)
|
|||||||
TEST_ASSERT_TRUE(list2->empty(list2));
|
TEST_ASSERT_TRUE(list2->empty(list2));
|
||||||
|
|
||||||
list2 = list->slice(list, 1, 5, -1); // if start < end && step < 0
|
list2 = list->slice(list, 1, 5, -1); // if start < end && step < 0
|
||||||
TEST_ASSERT_NULL(list2);
|
TEST_ASSERT_NOT_NULL(list2);
|
||||||
TEST_ASSERT_TRUE(list2->empty(list2));
|
TEST_ASSERT_TRUE(list2->empty(list2));
|
||||||
|
|
||||||
list2 = list->slice(list, 5, 1, 1); // if start > end && step > 0
|
list2 = list->slice(list, 5, 1, 1); // if start > end && step > 0
|
||||||
TEST_ASSERT_NULL(list2);
|
TEST_ASSERT_NOT_NULL(list2);
|
||||||
TEST_ASSERT_TRUE(list2->empty(list2));
|
TEST_ASSERT_TRUE(list2->empty(list2));
|
||||||
|
|
||||||
// python: list[0:]
|
// python: list[0:]
|
||||||
@ -488,7 +488,7 @@ static void test_list_slice(void)
|
|||||||
TEST_ASSERT_EQUAL_INT(data[len - 1], temp);
|
TEST_ASSERT_EQUAL_INT(data[len - 1], temp);
|
||||||
list_free(&list2);
|
list_free(&list2);
|
||||||
|
|
||||||
// python: list[-5:8:1]
|
// python: list[-6:8] or list[-6:-2]
|
||||||
// list2 = list->slice(list, -6, 8, 1); // It can be executed, but it's not intuitive
|
// list2 = list->slice(list, -6, 8, 1); // It can be executed, but it's not intuitive
|
||||||
list2 = list->slice(list, -6, -2, 1);
|
list2 = list->slice(list, -6, -2, 1);
|
||||||
TEST_ASSERT_NOT_NULL(list2);
|
TEST_ASSERT_NOT_NULL(list2);
|
||||||
@ -501,20 +501,18 @@ static void test_list_slice(void)
|
|||||||
}
|
}
|
||||||
list_free(&list2);
|
list_free(&list2);
|
||||||
|
|
||||||
// python: list[-6:0:-1] or list[4:0:-1]
|
// python: list[4::-1]
|
||||||
// list2 = list->slice(list, -6, 0, -1); // It can be executed, but it's not intuitive
|
|
||||||
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));
|
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) - 1 - i], temp);
|
TEST_ASSERT_EQUAL_INT(data[list2->size(list2) - i], temp);
|
||||||
}
|
}
|
||||||
list_free(&list2);
|
list_free(&list2);
|
||||||
|
|
||||||
|
|
||||||
list_free(&list);
|
list_free(&list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user