Skip to content

Instantly share code, notes, and snippets.

@bfredl
Last active August 7, 2016 12:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bfredl/211dade1f913171dc0c95b195840fdfe to your computer and use it in GitHub Desktop.
Save bfredl/211dade1f913171dc0c95b195840fdfe to your computer and use it in GitHub Desktop.
kbtree itr test
#include "kbtree.h"
#include <stdlib.h>
#include <stdbool.h>
KBTREE_INIT(test, int, kb_generic_cmp)
#define N 5000
int main() {
kbtree_t(test) *b = kb_init(test, KB_DEFAULT_SIZE);
int nums[N];
kbitr_t itr;
int z = 0;
// all these shall fail cleanly when no elements
if(kb_itr_getp(test, b, &z, &itr)) exit(51);
if(kb_itr_next(test, b, &itr)) exit(52);
if(kb_itr_valid(&itr)) exit(53);
if(kb_itr_getp(test, b, &z, &itr)) exit(61);
if(kb_itr_prev(test, b, &itr)) exit(62);
if(kb_itr_valid(&itr)) exit(63);
for (int i = 0; i < N; i++) {
int num = random() % N;
nums[i] = num;
int *k = kb_get(test, b, num);
if (!k) {
kb_put(test, b, num);
}
}
for (int j = -1; j < N+1; j++) {
int next = N;
int prev = -1;
bool found = false;
for (int i = 0; i < N; i++) {
if (nums[i] == j) {
found = true;
} else if (nums[i] > j && nums[i] < next) {
next = nums[i];
} else if (nums[i] < j && nums[i] > prev) {
prev = nums[i];
}
}
if (kb_itr_getp(test, b, &j, &itr)) {
if (!found || !kb_itr_valid(&itr)) exit(1);
int val = kb_itr_key(int, &itr);
if (val != j) exit(2);
} else {
if (found) exit(3);
}
if (kb_itr_next(test, b, &itr)) {
int val = kb_itr_key(int, &itr);
if (next != val) exit(4);
} else {
if (next != N) exit(5);
}
kb_itr_getp(test, b, &j, &itr);
if (kb_itr_prev(test, b, &itr)) {
int val = kb_itr_key(int, &itr);
if (prev != val) exit(6);
} else {
if (prev != -1) exit(7);
}
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment