SList *SList_merge(SList *left, SList *right, SList_CompareFunc compare_func, gpointer user_data){ register SList *merged = SList_create(left->set); register SList swap; g_assert(left->set == right->set); while(!(SList_isempty(left) || SList_isempty(right))){ if(compare_func(left->head->next->data, right->head->next->data, user_data)){ SList_queue(merged, SList_pop(left)); } else { SList_queue(merged, SList_pop(right)); } } SList_join(merged, left); SList_join(merged, right); SList_destroy(left); /* Swap left and merged */ swap.head = left->head; swap.tail = left->tail; left->head = merged->head; left->tail = merged->tail; merged->head = swap.head; merged->tail = swap.tail; return merged; }
void SList_empty_with_data(SList *slist, SList_DestroyFunc destroy_func, gpointer user_data){ register gpointer *data; g_assert(slist); g_assert(destroy_func); while(!SList_isempty(slist)){ data = SList_pop(slist); destroy_func(data, user_data); } return; }
void SList_remove(SList *slist, SListNode *prev_node){ register SListNode *sln; g_assert(slist); if(!prev_node){ SList_pop(slist); return; } if(prev_node->next){ sln = prev_node->next; prev_node->next = prev_node->next->next; SListNode_free(slist->set, sln); } return; }
void s_list_test() { SList *list; char *p, *c; int i; // // --- push & pop --- // list = SList_new(); SList_push(list, "cde"); SList_push(list, "efg"); SList_push(list, "gab"); // p = SList_pop(list); s_test_str_eq(p, "gab", "SList_push/pop"); p = SList_pop(list); s_test_str_eq(p, "efg", "SList_push/pop"); // SList_free(list); // // --- grow test --- // // size grow test list = SList_new(); for (i = 0; i < 1024; i++) { SList_push(list, "aaa"); } SList_sort(list, s_list_test_sort); s_test_eq(list->len, 1024, "SList->len:1"); SList_free(list); // // --- sort test --- // list = SList_new(); SList_push(list, "bat"); SList_push(list, "cocoa"); SList_push(list, "errors"); SList_push(list, "a"); SList_push(list, "is"); // sort SList_sort(list, s_list_test_sort_len); c = SList_get(list, 0); s_test_str_eq(c, "a", "SList_sort1"); c = SList_get(list, 1); s_test_str_eq(c, "is", "SList_sort2"); c = SList_get(list, 2); s_test_str_eq(c, "bat", "SList_sort3"); c = SList_get(list, 3); s_test_str_eq(c, "cocoa", "SList_sort4"); c = SList_get(list, 4); s_test_str_eq(c, "errors", "SList_sort5"); // msort SList_msort(list, s_list_test_sort_len); c = SList_get(list, 0); s_test_str_eq(c, "a", "SList_msort1"); c = SList_get(list, 1); s_test_str_eq(c, "is", "SList_msort2"); c = SList_get(list, 2); s_test_str_eq(c, "bat", "SList_msort3"); c = SList_get(list, 3); s_test_str_eq(c, "cocoa", "SList_msort4"); c = SList_get(list, 4); s_test_str_eq(c, "errors", "SList_msort5"); // SList_free(list); // //s_test_eq(list->len, 87, "SList->len:2"); // s_test_str_eq((char*)SList_peekLast(list), "zzz", "SList_sort"); // }
void SList_empty(SList *slist){ g_assert(slist); while(!SList_isempty(slist)) SList_pop(slist); return; }