/* delete (all) matching item(s) from list */ int skiplist_delete(skiplist *list, void *data){ return skiplist_delete_all(list,data); }
static int test_stable_sort() { #define RECORDS 32 int i; int result; int index1; int index2; int delete_count; int total_delete_count; Skiplist sl; SkiplistIterator iterator; Record records[RECORDS]; Record *record; Record target; void *value; instance_count = 0; result = skiplist_init_ex(&sl, 12, compare_record, free_test_func, 128, skiplist_type); if (result != 0) { return result; } for (i=0; i<RECORDS; i++) { records[i].line = i + 1; records[i].key = i + 1; } for (i=0; i<RECORDS/4; i++) { index1 = (RECORDS - 1) * (int64_t)rand() / (int64_t)RAND_MAX; index2 = RECORDS - 1 - index1; if (index1 != index2) { records[index1].key = records[index2].key; } } for (i=0; i<RECORDS; i++) { if ((result=skiplist_insert(&sl, records + i)) != 0) { return result; } instance_count++; } assert(instance_count == RECORDS); for (i=0; i<RECORDS; i++) { value = skiplist_find(&sl, records + i); assert(value != NULL && ((Record *)value)->key == records[i].key); } i = 0; skiplist_iterator(&sl, &iterator); while ((value=skiplist_next(&iterator)) != NULL) { i++; record = (Record *)value; printf("%d => #%d\n", record->key, record->line); } assert(i==RECORDS); target.key = 10; target.line = 0; if (skiplist_find_all(&sl, &target, &iterator) == 0) { printf("found key: %d\n", target.key); } i = 0; while ((value=skiplist_next(&iterator)) != NULL) { i++; record = (Record *)value; printf("%d => #%d\n", record->key, record->line); } printf("found record count: %d\n", i); total_delete_count = 0; for (i=0; i<RECORDS; i++) { if ((result=skiplist_delete_all(&sl, records + i, &delete_count)) == 0) { total_delete_count += delete_count; } assert((result == 0 && delete_count > 0) || (result != 0 && delete_count == 0)); } assert(total_delete_count == RECORDS); assert(instance_count == 0); i = 0; skiplist_iterator(&sl, &iterator); while ((value=skiplist_next(&iterator)) != NULL) { i++; } assert(i == 0); skiplist_destroy(&sl); assert(instance_count == 0); return 0; }