diff options
| -rw-r--r-- | examples/csmap_v1.h | 10 | ||||
| -rw-r--r-- | stc/cptr.h | 5 | ||||
| -rw-r--r-- | stc/csmap.h | 10 | ||||
| -rw-r--r-- | 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); \
} \
@@ -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); \
} \
@@ -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; \
} \
|
