mirror of
https://gitee.com/apaki/unicstl.git
synced 2025-05-18 03:51:35 +08:00
先调试通过了,后续再考虑优化
This commit is contained in:
parent
0f18ddf567
commit
2dfc0b2b17
88
src/list.c
88
src/list.c
@ -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)
|
if(end == LIST_UNLIMITED)
|
||||||
|
{
|
||||||
|
end = self->size(self);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user