-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathiteration.c
92 lines (77 loc) · 2.56 KB
/
iteration.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
struct user {
char *last;
char *first;
int age;
};
int user_compare(struct user a, struct user b) {
int cmp = strcmp(a.last, b.last);
if (cmp == 0) {
cmp = strcmp(a.first, b.first);
}
return cmp;
}
bool user_iter(struct user user, void *udata) {
printf("%s %s (age=%d)\n", user.first, user.last, user.age);
return true;
}
#define BGEN_NAME users
#define BGEN_TYPE struct user
#define BGEN_COMPARE return user_compare(a, b);
#include "../bgen.h"
int main() {
// Create a new btree.
struct users *users = 0;
// Load some users into the btree.
users_insert(&users, (struct user){ .first="Dale", .last="Murphy", .age=44 }, 0, 0);
users_insert(&users, (struct user){ .first="Roger", .last="Craig", .age=68 }, 0, 0);
users_insert(&users, (struct user){ .first="Jane", .last="Murphy", .age=47 }, 0, 0);
struct user user;
int status;
printf("\n-- get some users --\n");
users_get(&users, (struct user){ .first="Jane", .last="Murphy" }, &user, 0);
printf("%s age=%d\n", user.first, user.age);
users_get(&users, (struct user){ .first="Roger", .last="Craig" }, &user, 0);
printf("%s age=%d\n", user.first, user.age);
users_get(&users, (struct user){ .first="Dale", .last="Murphy" }, &user, 0);
printf("%s age=%d\n", user.first, user.age);
status = users_get(&users, (struct user){ .first="Tom", .last="Buffalo" }, &user, 0);
printf("%s\n", status==users_FOUND?"exists":"not exists");
printf("\n-- iterate over all users --\n");
users_scan(&users, user_iter, 0);
printf("\n-- iterate beginning with last name `Murphy` --\n");
users_seek(&users, (struct user){ .first="", .last="Murphy" }, user_iter, NULL);
printf("\n-- loop iterator (same as previous) --\n");
struct users_iter *iter;
users_iter_init(&users, &iter, 0);
users_iter_seek(iter, (struct user){.first="", .last="Murphy"});
while (users_iter_valid(iter)) {
users_iter_item(iter, &user);
printf("%s %s (age=%d)\n", user.first, user.last, user.age);
users_iter_next(iter);
}
users_iter_release(iter);
return 0;
}
// Output:
//
// -- get some users --
// Jane age=47
// Roger age=68
// Dale age=44
// not exists
//
// -- iterate over all users --
// Roger Craig (age=68)
// Dale Murphy (age=44)
// Jane Murphy (age=47)
//
// -- iterate beginning with last name `Murphy` --
// Dale Murphy (age=44)
// Jane Murphy (age=47)
//
// -- loop iterator (same as previous) --
// Dale Murphy (age=44)
// Jane Murphy (age=47)