From 3add074518345bf3b6b965c3f79bd0d35079891b Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Mon, 1 Mar 2021 12:19:24 +0100 Subject: Fixed wrong assumption that compare always returns -1, 0, 1. --- examples/csmap_v1.h | 10 ++++------ stc/cptr.h | 5 +++++ stc/csmap.h | 10 ++++------ stc/cvec.h | 10 ++++------ 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/examples/csmap_v1.h b/examples/csmap_v1.h index f8ea6ae9..94687dd2 100644 --- a/examples/csmap_v1.h +++ b/examples/csmap_v1.h @@ -329,12 +329,10 @@ int main(void) { C##_##X##_node_t *tn = self->root; \ out->_top = 0; \ while (tn->level) { \ - C##_##X##_rawkey_t rx = keyToRaw(KEY_REF_##C(&tn->value)); \ - switch (keyCompareRaw(&rx, &rkey)) { \ - case -1: tn = tn->link[1]; break; \ - case 1: out->_st[out->_top++] = tn; tn = tn->link[0]; break; \ - case 0: out->_tn = tn->link[1]; return (out->ref = &tn->value); \ - } \ + int c; C##_##X##_rawkey_t rx = keyToRaw(KEY_REF_##C(&tn->value)); \ + if ((c = keyCompareRaw(&rx, &rkey)) < 0) tn = tn->link[1]; \ + else if (c > 0) {out->_st[out->_top++] = tn; tn = tn->link[0];} \ + else {out->_tn = tn->link[1]; return (out->ref = &tn->value);} \ } \ return (out->ref = NULL); \ } \ diff --git a/stc/cptr.h b/stc/cptr.h index a188e19b..6c684ccc 100644 --- a/stc/cptr.h +++ b/stc/cptr.h @@ -180,6 +180,11 @@ typedef long atomic_count_t; if (ptr.use_count) atomic_increment(ptr.use_count); \ return ptr; \ } \ + STC_INLINE csptr_##X \ + csptr_##X##_move(csptr_##X* self) { \ + csptr_##X x = *self; self->use_count = NULL; \ + return x; \ + } \ \ STC_INLINE void \ csptr_##X##_del(csptr_##X* self) { \ diff --git a/stc/csmap.h b/stc/csmap.h index 2ac892eb..350e0df2 100644 --- a/stc/csmap.h +++ b/stc/csmap.h @@ -385,12 +385,10 @@ static struct csmap_rep _smap_inits = {0, 0, 0, 0}; C##_##X##_node_t *d = out->_d = self->nodes; \ out->_top = 0; \ while (tn) { \ - C##_##X##_rawkey_t rx = keyToRaw(KEY_REF_##C(&d[tn].value)); \ - switch (keyCompareRaw(&rx, &rkey)) { \ - case -1: tn = d[tn].link[1]; break; \ - case 1: out->_st[out->_top++] = tn; tn = d[tn].link[0]; break; \ - case 0: out->_tn = d[tn].link[1]; return (out->ref = &d[tn].value); \ - } \ + int c; C##_##X##_rawkey_t rx = keyToRaw(KEY_REF_##C(&d[tn].value)); \ + if ((c = keyCompareRaw(&rx, &rkey)) < 0) tn = d[tn].link[1]; \ + else if (c > 0) {out->_st[out->_top++] = tn; tn = d[tn].link[0];} \ + else {out->_tn = d[tn].link[1]; return (out->ref = &d[tn].value);} \ } \ return (out->ref = NULL); \ } \ diff --git a/stc/cvec.h b/stc/cvec.h index 7ffe0996..c977ddcf 100644 --- a/stc/cvec.h +++ b/stc/cvec.h @@ -314,12 +314,10 @@ static struct cvec_rep _cvec_inits = {0, 0}; cvec_##X##_iter_t mid, last = i2; \ while (i1.ref != i2.ref) { \ mid.ref = i1.ref + ((i2.ref - i1.ref)>>1); \ - RawValue m = valueToRaw(mid.ref); \ - switch (valueCompareRaw(&raw, &m)) { \ - case 0: return mid; \ - case -1: i2.ref = mid.ref; break; \ - case 1: i1.ref = mid.ref + 1; \ - } \ + int c; RawValue m = valueToRaw(mid.ref); \ + if ((c = valueCompareRaw(&raw, &m)) == 0) return mid; \ + else if (c < 0) i2.ref = mid.ref; \ + else i1.ref = mid.ref + 1; \ } \ return last; \ } \ -- cgit v1.2.3