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
|
#include <assert.h>
#include <stdio.h>
#include "dll.h"
#define NUM_NODES 100
DLL_INIT(foo);
typedef struct entry_t {
dll_t node;
int id;
} entry_t;
int main(int argc, char *argv[])
{
entry_t entries[NUM_NODES], *entry, *_entry;
dll_t nodes[NUM_NODES];
dll_t *tmp, *_tmp;
for (int i = 0; i < NUM_NODES; i++) {
dll_pre(&foo, &nodes[i]);
printf("appended %i:%p to tail\n", i, &nodes[i]);
}
DLL_FOR_EACH(&foo, tmp)
printf("node=%p\n", tmp);
for (int i = 0; i < NUM_NODES; i++) {
if (!(i % 2))
continue;
printf("deleted %i:%p\n", i, dll_del(&nodes[i]));
}
DLL_FOR_EACH(&foo, tmp)
printf("node=%p\n", tmp);
assert(!dll_empty(&foo));
DLL_FOR_EACH_SAFE(&foo, tmp, _tmp)
printf("deleted %p\n", dll_del(tmp));
DLL_FOR_EACH(&foo, tmp)
printf("!!!notempty!!! node=%p\n", tmp);
assert(dll_empty(&foo));
for (int i = 0; i < NUM_NODES; i++) {
dll_pre(&foo, &entries[i].node);
entries[i].id = i;
}
DLL_FOR_EACH_ENTRY(&foo, entry, entry_t, node) {
printf("id=%i entry=%p node=%p\n",
entry->id, entry, &entry->node);
}
for (int i = 0; i < NUM_NODES; i++) {
if (!(i % 2))
continue;
printf("deleted %i:%p\n", i, dll_del(&entries[i].node));
}
DLL_FOR_EACH_ENTRY(&foo, entry, entry_t, node) {
printf("id=%i entry=%p node=%p\n",
entry->id, entry, &entry->node);
}
DLL_FOR_EACH_ENTRY_SAFE(&foo, entry, _entry, entry_t, node)
printf("deleted %p\n", dll_del(&entry->node));
DLL_FOR_EACH_ENTRY(&foo, entry, entry_t, node)
printf("!!!notempty!!! entry=%p\n", entry);
assert(dll_empty(&foo));
}
|