From c17edda61c58772930a66fd4c8d711c05f99cc9c Mon Sep 17 00:00:00 2001 From: Gregory Lirent Date: Mon, 6 Jun 2022 23:46:55 +0300 Subject: [PATCH] Fix set (extra) insertion & foreach --- src/set/extra.c | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/set/extra.c b/src/set/extra.c index 0c68389..3c3be91 100644 --- a/src/set/extra.c +++ b/src/set/extra.c @@ -36,33 +36,38 @@ _Bool libcdsb_vset_find(val_t* x, set_t* s, const void* v, vtype t, _Bool cut) { _Bool libcdsb_vset_insert(set_t* x, const void* v, vtype t) { - int cmp; + int cmp; rbnode_t* n; rbnode_t* p; + vnode_t vn; - n = x->root; + n = x->root; + vn = vnode_tcreate(x->type, v, t); + t = x->type; + v = vnode_peek(&vn, t); if (!rbnode_is_empty(n)) { do { - p = n; - cmp = vtype_compare(vnode_peek(&n->value, x->type), x->type, v, t); + p = n; + cmp = vtype_compare(v, t, vnode_peek(&n->value, t), t); - if (cmp == 0) return false; + if (cmp == 0) { + vnode_free(&vn, t); + return false; + } - n = (cmp > 0) ? n->left : n->right; + n = (cmp < 0) ? n->left : n->right; } while (!rbnode_is_empty(n)); - n = rbnode_create(0, p, 1); + n = rbnode_create(vn, p, 1); - if (cmp > 0) p->left = n; + if (cmp < 0) p->left = n; else p->right = n; - if (!rbnode_is_root(n->parent)) + if (!rbnode_is_root(p)) rbnode_fixup(&x->root, n); - } else n = x->root = rbnode_create(0, p, 1); - - n->value = vnode_tcreate(x->type, v, t); + } else n = x->root = rbnode_create(vn, rbnode_empty, 0); return true; } @@ -74,10 +79,11 @@ _Bool libcdsb_vset_insert(set_t* x, const void* v, vtype t) { int libcdsb_vset_foreach(const vtype_set* x, int (*callback)(const void* value, vtype type)) { rbiter_t i; int r; + rbnode_t* c; if (rbiter_init(&i, &x->root, 0)) { - while (!rbnode_is_empty(rbiter_next(&i))) { - if ((r = callback(vnode_peek(&i.cursor->value, x->type), x->type))) + while (!rbnode_is_empty(c = rbiter_next(&i))) { + if ((r = callback(vnode_peek(&c->value, x->type), x->type))) return r; } }