List *List_merge(List *left, List *right, List_compare cmp) { List *result = List_create(); void *val = NULL; while(List_count(left) != 0 && List_count(right) != 0) { if(cmp(List_first(left), List_first(right)) <= 0) { val = List_shift(left); List_push(result, val); } else { val = List_shift(right); List_push(result, val); } } while(List_count(left) != 0) { val = List_shift(left); List_push(result, val); } while(List_count(right) != 0) { val = List_shift(right); List_push(result, val); } return result; }
char *test_shift() { mu_assert(List_count(list) != 0, "Wrong count before shift"); char *val = List_shift(list); mu_assert(val = test3, "Wrong value on shift"); val = List_shift(list); mu_assert(val == test1, "Wrong value on shift"); mu_assert(List_count(list) == 0, "Wrong count after shift"); return NULL; }
char *test_shift() { List_shift(list, test1); mu_assert(List_first(list) == test1, "Wrong first value"); List_shift(list, test2); mu_assert(List_first(list) == test2, "Wrong first value"); List_shift(list, test3); mu_assert(List_first(list) == test3, "Wrong last value"); mu_assert(List_count(list) == 3, "Wrong count"); return NULL; }
void push_shift(List *list) { List_push(list, 12); List_push(list, 7); List_push(list, 2); assert(List_index(list, 0)->data == 12); assert(List_index(list, 1)->data == 7); assert(List_first(list)->data == 12); assert(List_last(list)->data == 2); List_shift(list); assert(List_first(list)->data == 7); List_shift(list); assert(List_first(list)->data == 2); List_shift(list); assert(List_first(list) == NULL); }
inline List *List_merge(List *left, List *right, List_compare cmp) { List *result = List_create(); void *val = NULL; while(List_count(left) > 0 || List_count(right) > 0) { if(List_count(left) > 0 && List_count(right) > 0) { if(cmp(List_first(left), List_first(right)) <= 0) { val = List_shift(left); } else { val = List_shift(right); } List_push(result, val); } else if(List_count(left) > 0) { List_join(result, left); } else if(List_count(right) > 0) { List_join(result, right); } } return result; }
static List *reconstruct_path(Node *node) { List *path = List_create(); while(node) { if(node->came_from) { Point *p = Point_create(node->point->x, node->point->y, node->point->z); List_shift(path, p); } node = node->came_from; } return path; };
char *test_unshift_shift() { List_unshift(list, tv1); mu_assert(List_first(list) == tv1, "Bad first value."); List_unshift(list, tv2); mu_assert(List_first(list) == tv2, "Bad first value."); List_unshift(list, tv3); mu_assert(List_first(list) == tv3, "Bad first value."); mu_assert(List_size(list) == 3, "Wrong size"); char *out = List_shift(list); mu_assert(out == tv3, "Bad shifted value."); out = List_shift(list); mu_assert(out == tv2, "Bad shifted value."); out = List_shift(list); mu_assert(out == tv1, "Bad shifted value."); mu_assert(List_size(list) == 0, "Wrong size"); return NULL; }