27#define ZIX_BTREE_PAGE_SIZE 4096
28#define ZIX_BTREE_NODE_SPACE (ZIX_BTREE_PAGE_SIZE - 2 * sizeof(uint16_t))
29#define ZIX_BTREE_LEAF_VALS ((ZIX_BTREE_NODE_SPACE / sizeof(void*)) - 1)
30#define ZIX_BTREE_INODE_VALS (ZIX_BTREE_LEAF_VALS / 2)
56 ZixBTreeIterFrame
stack[];
64 printf(
"%s[", prefix);
66 printf(
" %lu", (uintptr_t)
n->vals[
v]);
78 for (
int i = 0;
i < level + 1; ++
i) {
84 print_tree(node, node->
children[
i], level + 1);
109 void*
const cmp_data,
115 t->destroy = destroy;
117 t->cmp_data = cmp_data;
134 t->destroy(
n->vals[
i]);
180 memmove(array +
i + 1, array +
i, (
n -
i) *
sizeof(
e));
188 void*
const ret = array[
i];
189 memmove(array +
i, array +
i + 1, (
n -
i) *
sizeof(ret));
211 lhs->
n_vals = max_n_vals / 2;
217 rhs->
n_vals *
sizeof(
void*));
247 const int cmp =
t->cmp(
n->vals[
i],
e,
t->cmp_data);
251 }
else if (cmp < 0) {
259 assert(!*equal ||
t->cmp(
n->vals[first],
e,
t->cmp_data) == 0);
287 const int cmp =
t->cmp(
parent->vals[
i],
e,
t->cmp_data);
290 }
else if (cmp < 0) {
303 }
else if (!
n->is_leaf) {
415 (rhs->
n_vals + 1) *
sizeof(
void*));
419 if (--
n->n_vals == 0) {
434 while (!
n->is_leaf) {
456 while (!
n->is_leaf) {
467 n =
n->children[
n->n_vals];
471 return n->vals[--
n->n_vals];
482 const bool user_iter = next && *next;
505 if (ti &&
i ==
n->n_vals) {
517 if (ti && !user_iter) {
593 }
else if (
n->is_leaf) {
618 unsigned found_level = 0;
630 found_level = (*ti)->level;
647 (*ti)->level = found_level;
650 (*ti)->stack[0].node =
NULL;
671 }
else if (
t->size == 0) {
672 i->stack[0].node =
NULL;
675 i->stack[0].node =
n;
676 i->stack[0].index = 0;
677 while (!
n->is_leaf) {
680 i->stack[
i->level].node =
n;
681 i->stack[
i->level].index = 0;
690 return !
i ||
i->stack[0].node ==
NULL;
697 if (
f->node->is_leaf) {
700 if (++
f->index ==
f->node->n_vals) {
702 f = &
i->stack[
i->level];
703 while (
i->level > 0 &&
f->index ==
f->node->n_vals) {
704 f = &
i->stack[--
i->level];
705 assert(
f->index <=
f->node->n_vals);
708 if (
f->index ==
f->node->n_vals) {
720 f = &
i->stack[++
i->level];
725 while (!
f->node->is_leaf) {
726 child =
f->node->children[0];
727 f = &
i->stack[++
i->level];
* e
Definition inflate.c:1404
struct huft * t
Definition inflate.c:943
unsigned v[N_MAX]
Definition inflate.c:1584
register unsigned i
Definition inflate.c:1575
unsigned s
Definition inflate.c:1555
unsigned f
Definition inflate.c:1572
static uintptr_t parent
Definition pugl.h:1644
void(* ZixDestroyFunc)(void *ptr)
Definition common.h:128
size_t zix_btree_size(const ZixBTree *const t)
Definition btree.c:200
ZixBTree * zix_btree_new(const ZixComparator cmp, const void *const cmp_data, const ZixDestroyFunc destroy)
Definition btree.c:144
void zix_btree_iter_increment(ZixBTreeIter *const i)
Definition btree.c:892
ZixStatus zix_btree_lower_bound(const ZixBTree *const t, const void *const e, ZixBTreeIter **const ti)
Definition btree.c:752
struct ZixBTreeImpl ZixBTree
Definition btree.h:39
ZixBTreeIter * zix_btree_begin(const ZixBTree *const t)
Definition btree.c:819
bool zix_btree_iter_is_end(const ZixBTreeIter *const i)
Definition btree.c:867
void zix_btree_free(ZixBTree *const t)
Definition btree.c:191
struct ZixBTreeIterImpl ZixBTreeIter
Definition btree.h:52
ZixStatus zix_btree_remove(ZixBTree *const t, const void *const e, void **const out, ZixBTreeIter **const next)
Definition btree.c:597
ZixStatus
Definition common.h:81
void * zix_btree_get(const ZixBTreeIter *const ti)
Definition btree.c:810
struct ZixBTreeNodeImpl ZixBTreeNode
Definition btree.h:44
ZixStatus zix_btree_find(const ZixBTree *const t, const void *const e, ZixBTreeIter **const ti)
Definition btree.c:719
ZixStatus zix_btree_insert(ZixBTree *const t, void *const e)
Definition btree.c:345
int(* ZixComparator)(const void *a, const void *b, const void *user_data)
Definition common.h:116
void zix_btree_iter_free(ZixBTreeIter *const i)
Definition btree.c:933
@ ZIX_STATUS_EXISTS
Definition common.h:86
@ ZIX_STATUS_BAD_ARG
Definition common.h:87
@ ZIX_STATUS_NOT_FOUND
Definition common.h:85
@ ZIX_STATUS_ERROR
Definition common.h:83
@ ZIX_STATUS_NO_MEM
Definition common.h:84
@ ZIX_STATUS_SUCCESS
Definition common.h:82
float out
Definition lilv_test.c:1461
unsigned short uint16_t
Definition mid.cpp:99
unsigned height
Number of levels, i.e. root only has height 1.
Definition btree.c:41
const void * cmp_data
Definition btree.c:39
ZixDestroyFunc destroy
Definition btree.c:37
ZixBTreeNode * root
Definition btree.c:36
ZixComparator cmp
Definition btree.c:38
size_t size
Definition btree.c:40
unsigned index
Definition btree.c:67
ZixBTreeNode * node
Definition btree.c:66
unsigned level
Current level in stack.
Definition btree.c:72
ZixBTreeIterFrame stack[]
Position stack.
Definition btree.c:73
void * vals[ZIX_BTREE_LEAF_VALS]
Definition btree.c:50
ZixBTreeNode * children[ZIX_BTREE_INODE_VALS+1]
Definition btree.c:55
uint16_t n_vals
Definition btree.c:46
uint16_t is_leaf
Definition btree.c:45
int n
Definition crypt.c:458
memcpy(hh, h, RAND_HEAD_LEN)