先调试通过了,后续再考虑优化

This commit is contained in:
建峰 2025-04-30 01:28:37 +08:00
parent 0f18ddf567
commit 2dfc0b2b17
2 changed files with 66 additions and 32 deletions

View File

@ -208,30 +208,50 @@ struct _list* list_slice(struct _list *self, int start, int end, int step)
{ {
assert(self != NULL); assert(self != NULL);
int i = 0; int i = 0;
bool unlimited = false;
if(step == 0) if(step == 0)
{ {
return NULL; return NULL;
} }
if(start == LIST_UNLIMITED) if(step > 0)
{ {
start = 0; if(start == LIST_UNLIMITED)
{
start = 0;
}
if(end == LIST_UNLIMITED)
{
end = self->size(self);
}
} }
else
if(end == LIST_UNLIMITED)
{ {
end = self->size(self); if(start == LIST_UNLIMITED)
{
start = self->size(self) - 1;
unlimited = true;
}
if(end == LIST_UNLIMITED)
{
end = 0;
unlimited = true;
}
} }
if(start < 0) if(start < 0)
{ {
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;
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)
{ {
@ -240,50 +260,56 @@ 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) if(capicity == 0 || start > self->size(self) || end > self->size(self))
{ {
goto done; 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)
{ {
goto done; goto done;
} }
for(i = start; i < end; i += step) if(unlimited != true)
{ {
list->append(list, (char*)self->obj + i * self->_obj_size); for(i = start; i < end; i += step)
}
if(end == LIST_UNLIMITED)
{
list->append(list, (char*)self->obj + i * self->_obj_size);
}
}
else
{
if(end < self->size(self))
{
if(start <= end)
{ {
goto done; list->append(list, (char*)self->obj + i * self->_obj_size);
} }
} }
else else
{ {
end = -1; for(i = start; i <= end; i += step)
{
list->append(list, (char*)self->obj + i * self->_obj_size);
}
}
}
else /*if(step < 0)*/
{
if(start < end)
{
goto done;
} }
for(i = start; i > end; i += step) printf("start = %d\n", start);
printf("end = %d\n", end);
if(unlimited != true)
{ {
list->append(list, (char*)self->obj + i * self->_obj_size); for(i = start; i > end; i += step)
{
list->append(list, (char*)self->obj + i * self->_obj_size);
}
}
else
{
for(i = start; i >= end; i += step)
{
list->append(list, (char*)self->obj + i * self->_obj_size);
}
} }
} }

View File

@ -455,6 +455,14 @@ static void test_list_slice(void)
TEST_ASSERT_NOT_NULL(list2); TEST_ASSERT_NOT_NULL(list2);
TEST_ASSERT_TRUE(list2->empty(list2)); TEST_ASSERT_TRUE(list2->empty(list2));
list2 = list->slice(list, -1, -5, 1); // if start < end && step < 0
TEST_ASSERT_NOT_NULL(list2);
TEST_ASSERT_TRUE(list2->empty(list2));
list2 = list->slice(list, -5, -1, -1); // if start > end && step > 0
TEST_ASSERT_NOT_NULL(list2);
TEST_ASSERT_TRUE(list2->empty(list2));
// python: list[0:] // python: list[0:]
list2 = list->slice(list, 0, len, 1); list2 = list->slice(list, 0, len, 1);
TEST_ASSERT_NOT_NULL(list2); TEST_ASSERT_NOT_NULL(list2);