mirror of
https://gitee.com/apaki/unicstl.git
synced 2025-07-05 08:26:54 +08:00
添加新的测试项,并尝试slice是否可以优化的更加直观
This commit is contained in:
parent
802d63641c
commit
97ae2a54c4
67
src/list.c
67
src/list.c
@ -206,6 +206,7 @@ static void list_print(struct _list* self)
|
|||||||
*/
|
*/
|
||||||
struct _list* list_slice(struct _list *self, int start, int end, int step)
|
struct _list* list_slice(struct _list *self, int start, int end, int step)
|
||||||
{
|
{
|
||||||
|
#if 1
|
||||||
assert(self != NULL);
|
assert(self != NULL);
|
||||||
int i = 0;
|
int i = 0;
|
||||||
bool unlimited = false;
|
bool unlimited = false;
|
||||||
@ -323,6 +324,72 @@ struct _list* list_slice(struct _list *self, int start, int end, int step)
|
|||||||
|
|
||||||
done:
|
done:
|
||||||
return list;
|
return list;
|
||||||
|
#else
|
||||||
|
assert(self != NULL);
|
||||||
|
list_t list = NULL;
|
||||||
|
bool empty = false;
|
||||||
|
uint32_t capacity = 1;
|
||||||
|
int i = 0;
|
||||||
|
if(step == 0)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(step > 0)
|
||||||
|
{
|
||||||
|
// special case
|
||||||
|
if(start == LIST_UNLIMITED)
|
||||||
|
{
|
||||||
|
start = 0;
|
||||||
|
}
|
||||||
|
if(end == LIST_UNLIMITED)
|
||||||
|
{
|
||||||
|
end = self->size(self);
|
||||||
|
}
|
||||||
|
|
||||||
|
// [start_max, end_min] start < end and limit start_max and end_min
|
||||||
|
if(start >= end || start >= self->size(self) || end < -self->size(self))
|
||||||
|
{
|
||||||
|
empty = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(start < 0)
|
||||||
|
{
|
||||||
|
if(start < -self->size(self))
|
||||||
|
{
|
||||||
|
start = -self->size(self);
|
||||||
|
}
|
||||||
|
start += self->size(self);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(end < 0)
|
||||||
|
{
|
||||||
|
end += self->size(self);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(empty != true)
|
||||||
|
{
|
||||||
|
// calc capacity
|
||||||
|
|
||||||
|
}
|
||||||
|
list_t 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
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool list_iter_hasnext(struct _iterator* iter)
|
static bool list_iter_hasnext(struct _iterator* iter)
|
||||||
|
@ -471,6 +471,17 @@ static void test_list_slice_empty(void)
|
|||||||
TEST_ASSERT_TRUE(list2->empty(list2));
|
TEST_ASSERT_TRUE(list2->empty(list2));
|
||||||
list_free(&list2);
|
list_free(&list2);
|
||||||
|
|
||||||
|
// -------------------- empty --------------------
|
||||||
|
list2 = list->slice(list, len, len + 10, 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
|
||||||
|
TEST_ASSERT_NOT_NULL(list2);
|
||||||
|
TEST_ASSERT_TRUE(list2->empty(list2));
|
||||||
|
list_free(&list2);
|
||||||
|
|
||||||
list_free(&list);
|
list_free(&list);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -507,6 +518,18 @@ static void test_list_slice_positive(void)
|
|||||||
}
|
}
|
||||||
list_free(&list2);
|
list_free(&list2);
|
||||||
|
|
||||||
|
// python: list[0:11] if len(list) == 10
|
||||||
|
list2 = list->slice(list, 0, len + 1, 1);
|
||||||
|
TEST_ASSERT_NOT_NULL(list2);
|
||||||
|
// list2->print(list2); printf("\n");
|
||||||
|
TEST_ASSERT_EQUAL_INT(len, 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);
|
||||||
|
|
||||||
// python: list[-6:8] or list[-6:-2] or list[4:8]
|
// python: list[-6:8] or list[-6:-2] or list[4:8]
|
||||||
list2 = list->slice(list, 4, 8, 1);
|
list2 = list->slice(list, 4, 8, 1);
|
||||||
TEST_ASSERT_NOT_NULL(list2);
|
TEST_ASSERT_NOT_NULL(list2);
|
||||||
@ -614,9 +637,9 @@ static void test_list_slice_negative(void)
|
|||||||
}
|
}
|
||||||
list_free(&list2);
|
list_free(&list2);
|
||||||
|
|
||||||
// -------------------- step == 2 --------------------
|
// -------------------- start_limit --------------------
|
||||||
// list[-30:-1]
|
// list[-len-1:-1]
|
||||||
list2 = list->slice(list, -30, -1, 1);
|
list2 = list->slice(list, -len-1, -1, 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(len - 1, list2->size(list2));
|
TEST_ASSERT_EQUAL_INT(len - 1, list2->size(list2));
|
||||||
@ -627,12 +650,6 @@ static void test_list_slice_negative(void)
|
|||||||
}
|
}
|
||||||
list_free(&list2);
|
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);
|
list_free(&list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user