Compare commits
2 Commits
1ca8160e07
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 3d8ce4dbcd | |||
| 0d313cf474 |
+2
-2
@@ -510,7 +510,7 @@ HAWK_EXPORT hawk_htb_pair_t* hawk_htb_update (
|
|||||||
* if (pair == HAWK_NULL)
|
* if (pair == HAWK_NULL)
|
||||||
* {
|
* {
|
||||||
* // no existing key for the key
|
* // no existing key for the key
|
||||||
* return hawk_htb_allocpair (htb, kptr, klen, v->ptr, v->len);
|
* return hawk_htb_allocpair(htb, kptr, klen, v->ptr, v->len);
|
||||||
* }
|
* }
|
||||||
* else
|
* else
|
||||||
* {
|
* {
|
||||||
@@ -523,7 +523,7 @@ HAWK_EXPORT hawk_htb_pair_t* hawk_htb_update (
|
|||||||
*
|
*
|
||||||
* // allocate a new pair, but without filling the actual value.
|
* // allocate a new pair, but without filling the actual value.
|
||||||
* // note vptr is given HAWK_NULL for that purpose
|
* // note vptr is given HAWK_NULL for that purpose
|
||||||
* new_pair = hawk_htb_allocpair (
|
* new_pair = hawk_htb_allocpair(
|
||||||
* htb, kptr, klen, HAWK_NULL, HAWK_HTB_VLEN(pair) + 1 + v->len);
|
* htb, kptr, klen, HAWK_NULL, HAWK_HTB_VLEN(pair) + 1 + v->len);
|
||||||
* if (new_pair == HAWK_NULL) return HAWK_NULL;
|
* if (new_pair == HAWK_NULL) return HAWK_NULL;
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -46,7 +46,7 @@
|
|||||||
#define KTOB(htb,len) ((len) * (htb)->scale[HAWK_HTB_KEY])
|
#define KTOB(htb,len) ((len) * (htb)->scale[HAWK_HTB_KEY])
|
||||||
#define VTOB(htb,len) ((len) * (htb)->scale[HAWK_HTB_VAL])
|
#define VTOB(htb,len) ((len) * (htb)->scale[HAWK_HTB_VAL])
|
||||||
|
|
||||||
HAWK_INLINE pair_t* hawk_htb_allocpair (hawk_htb_t* htb, void* kptr, hawk_oow_t klen, void* vptr, hawk_oow_t vlen)
|
static HAWK_INLINE_ALWAYS pair_t* alloc_pair (hawk_htb_t* htb, void* kptr, hawk_oow_t klen, void* vptr, hawk_oow_t vlen)
|
||||||
{
|
{
|
||||||
pair_t* n;
|
pair_t* n;
|
||||||
copier_t kcop, vcop;
|
copier_t kcop, vcop;
|
||||||
@@ -115,7 +115,7 @@ HAWK_INLINE pair_t* hawk_htb_allocpair (hawk_htb_t* htb, void* kptr, hawk_oow_t
|
|||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
HAWK_INLINE void hawk_htb_freepair (hawk_htb_t* htb, pair_t* pair)
|
static HAWK_INLINE_ALWAYS void free_pair (hawk_htb_t* htb, pair_t* pair)
|
||||||
{
|
{
|
||||||
if (htb->style->freeer[HAWK_HTB_KEY] != HAWK_NULL)
|
if (htb->style->freeer[HAWK_HTB_KEY] != HAWK_NULL)
|
||||||
htb->style->freeer[HAWK_HTB_KEY](htb, KPTR(pair), KLEN(pair));
|
htb->style->freeer[HAWK_HTB_KEY](htb, KPTR(pair), KLEN(pair));
|
||||||
@@ -124,7 +124,17 @@ HAWK_INLINE void hawk_htb_freepair (hawk_htb_t* htb, pair_t* pair)
|
|||||||
hawk_gem_freemem(htb->gem, pair);
|
hawk_gem_freemem(htb->gem, pair);
|
||||||
}
|
}
|
||||||
|
|
||||||
static HAWK_INLINE pair_t* change_pair_val (hawk_htb_t* htb, pair_t* pair, void* vptr, hawk_oow_t vlen)
|
pair_t* hawk_htb_allocpair (hawk_htb_t* htb, void* kptr, hawk_oow_t klen, void* vptr, hawk_oow_t vlen)
|
||||||
|
{
|
||||||
|
return alloc_pair(htb, kptr, klen, vptr, vlen);
|
||||||
|
}
|
||||||
|
|
||||||
|
void hawk_htb_freepair (hawk_htb_t* htb, pair_t* pair)
|
||||||
|
{
|
||||||
|
free_pair(htb, pair);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HAWK_INLINE_ALWAYS pair_t* change_pair_val (hawk_htb_t* htb, pair_t* pair, void* vptr, hawk_oow_t vlen)
|
||||||
{
|
{
|
||||||
if (VPTR(pair) == vptr && VLEN(pair) == vlen)
|
if (VPTR(pair) == vptr && VLEN(pair) == vlen)
|
||||||
{
|
{
|
||||||
@@ -157,9 +167,9 @@ static HAWK_INLINE pair_t* change_pair_val (hawk_htb_t* htb, pair_t* pair, void*
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* need to reconstruct the pair */
|
/* need to reconstruct the pair */
|
||||||
pair_t* p = hawk_htb_allocpair(htb, KPTR(pair), KLEN(pair), vptr, vlen);
|
pair_t* p = alloc_pair(htb, KPTR(pair), KLEN(pair), vptr, vlen);
|
||||||
if (HAWK_UNLIKELY(!p)) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!p)) return HAWK_NULL;
|
||||||
hawk_htb_freepair(htb, pair);
|
free_pair(htb, pair);
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -436,7 +446,7 @@ static HAWK_INLINE int reorganize (hawk_htb_t* htb)
|
|||||||
#define ENSERT 3
|
#define ENSERT 3
|
||||||
#define INSERT 4
|
#define INSERT 4
|
||||||
|
|
||||||
static HAWK_INLINE pair_t* insert (hawk_htb_t* htb, void* kptr, hawk_oow_t klen, void* vptr, hawk_oow_t vlen, int opt)
|
static HAWK_INLINE_ALWAYS pair_t* insert (hawk_htb_t* htb, void* kptr, hawk_oow_t klen, void* vptr, hawk_oow_t vlen, int opt)
|
||||||
{
|
{
|
||||||
pair_t* pair, * p, * prev, * next;
|
pair_t* pair, * p, * prev, * next;
|
||||||
hawk_oow_t hc;
|
hawk_oow_t hc;
|
||||||
@@ -507,7 +517,7 @@ static HAWK_INLINE pair_t* insert (hawk_htb_t* htb, void* kptr, hawk_oow_t klen,
|
|||||||
|
|
||||||
HAWK_ASSERT(pair == HAWK_NULL);
|
HAWK_ASSERT(pair == HAWK_NULL);
|
||||||
|
|
||||||
pair = hawk_htb_allocpair(htb, kptr, klen, vptr, vlen);
|
pair = alloc_pair(htb, kptr, klen, vptr, vlen);
|
||||||
if (HAWK_UNLIKELY(!pair)) return HAWK_NULL; /* error */
|
if (HAWK_UNLIKELY(!pair)) return HAWK_NULL; /* error */
|
||||||
|
|
||||||
NEXT(pair) = htb->bucket[hc];
|
NEXT(pair) = htb->bucket[hc];
|
||||||
@@ -617,7 +627,7 @@ int hawk_htb_delete (hawk_htb_t* htb, const void* kptr, hawk_oow_t klen)
|
|||||||
htb->bucket[hc] = NEXT(pair);
|
htb->bucket[hc] = NEXT(pair);
|
||||||
else NEXT(prev) = NEXT(pair);
|
else NEXT(prev) = NEXT(pair);
|
||||||
|
|
||||||
hawk_htb_freepair(htb, pair);
|
free_pair(htb, pair);
|
||||||
htb->size--;
|
htb->size--;
|
||||||
htb->rev++;
|
htb->rev++;
|
||||||
|
|
||||||
@@ -645,7 +655,7 @@ void hawk_htb_clear (hawk_htb_t* htb)
|
|||||||
while (pair)
|
while (pair)
|
||||||
{
|
{
|
||||||
next = NEXT(pair);
|
next = NEXT(pair);
|
||||||
hawk_htb_freepair(htb, pair);
|
free_pair(htb, pair);
|
||||||
htb->size--;
|
htb->size--;
|
||||||
pair = next;
|
pair = next;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,7 +53,7 @@
|
|||||||
#define rotate_left(rbt,pivot) rotate(rbt,pivot,1);
|
#define rotate_left(rbt,pivot) rotate(rbt,pivot,1);
|
||||||
#define rotate_right(rbt,pivot) rotate(rbt,pivot,0);
|
#define rotate_right(rbt,pivot) rotate(rbt,pivot,0);
|
||||||
|
|
||||||
HAWK_INLINE hawk_rbt_pair_t* hawk_rbt_allocpair (
|
static HAWK_INLINE_ALWAYS hawk_rbt_pair_t* alloc_pair (
|
||||||
hawk_rbt_t* rbt, void* kptr, hawk_oow_t klen, void* vptr, hawk_oow_t vlen)
|
hawk_rbt_t* rbt, void* kptr, hawk_oow_t klen, void* vptr, hawk_oow_t vlen)
|
||||||
{
|
{
|
||||||
hawk_rbt_pair_t* pair;
|
hawk_rbt_pair_t* pair;
|
||||||
@@ -120,7 +120,7 @@ HAWK_INLINE hawk_rbt_pair_t* hawk_rbt_allocpair (
|
|||||||
return pair;
|
return pair;
|
||||||
}
|
}
|
||||||
|
|
||||||
HAWK_INLINE void hawk_rbt_freepair (hawk_rbt_t* rbt, hawk_rbt_pair_t* pair)
|
static HAWK_INLINE_ALWAYS void free_pair (hawk_rbt_t* rbt, hawk_rbt_pair_t* pair)
|
||||||
{
|
{
|
||||||
if (rbt->style->freeer[HAWK_RBT_KEY])
|
if (rbt->style->freeer[HAWK_RBT_KEY])
|
||||||
rbt->style->freeer[HAWK_RBT_KEY](rbt, KPTR(pair), KLEN(pair));
|
rbt->style->freeer[HAWK_RBT_KEY](rbt, KPTR(pair), KLEN(pair));
|
||||||
@@ -129,6 +129,16 @@ HAWK_INLINE void hawk_rbt_freepair (hawk_rbt_t* rbt, hawk_rbt_pair_t* pair)
|
|||||||
hawk_gem_freemem(rbt->gem, pair);
|
hawk_gem_freemem(rbt->gem, pair);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hawk_rbt_pair_t* hawk_rbt_allocpair (hawk_rbt_t* rbt, void* kptr, hawk_oow_t klen, void* vptr, hawk_oow_t vlen)
|
||||||
|
{
|
||||||
|
return alloc_pair(rbt, kptr, klen, vptr, vlen);
|
||||||
|
}
|
||||||
|
|
||||||
|
void hawk_rbt_freepair (hawk_rbt_t* rbt, hawk_rbt_pair_t* pair)
|
||||||
|
{
|
||||||
|
free_pair(rbt, pair);
|
||||||
|
}
|
||||||
|
|
||||||
static hawk_rbt_style_t style[] =
|
static hawk_rbt_style_t style[] =
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@@ -450,7 +460,7 @@ static hawk_rbt_pair_t* change_pair_val (hawk_rbt_t* rbt, hawk_rbt_pair_t* pair,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* need to reconstruct the pair */
|
/* need to reconstruct the pair */
|
||||||
hawk_rbt_pair_t* p = hawk_rbt_allocpair(rbt, KPTR(pair), KLEN(pair), vptr, vlen);
|
hawk_rbt_pair_t* p = alloc_pair(rbt, KPTR(pair), KLEN(pair), vptr, vlen);
|
||||||
if (HAWK_UNLIKELY(!p)) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!p)) return HAWK_NULL;
|
||||||
|
|
||||||
p->color = pair->color;
|
p->color = pair->color;
|
||||||
@@ -475,7 +485,7 @@ static hawk_rbt_pair_t* change_pair_val (hawk_rbt_t* rbt, hawk_rbt_pair_t* pair,
|
|||||||
|
|
||||||
if (pair == rbt->root) rbt->root = p;
|
if (pair == rbt->root) rbt->root = p;
|
||||||
|
|
||||||
hawk_rbt_freepair(rbt, pair);
|
free_pair(rbt, pair);
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -539,7 +549,7 @@ static hawk_rbt_pair_t* insert (hawk_rbt_t* rbt, void* kptr, hawk_oow_t klen, vo
|
|||||||
return HAWK_NULL;
|
return HAWK_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
x_new = hawk_rbt_allocpair(rbt, kptr, klen, vptr, vlen);
|
x_new = alloc_pair(rbt, kptr, klen, vptr, vlen);
|
||||||
if (HAWK_UNLIKELY(!x_new)) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!x_new)) return HAWK_NULL;
|
||||||
|
|
||||||
if (x_par == HAWK_NULL)
|
if (x_par == HAWK_NULL)
|
||||||
@@ -819,7 +829,7 @@ static void delete_pair (hawk_rbt_t* rbt, hawk_rbt_pair_t* pair)
|
|||||||
if (y->color == HAWK_RBT_BLACK && !IS_NIL(rbt,x))
|
if (y->color == HAWK_RBT_BLACK && !IS_NIL(rbt,x))
|
||||||
adjust_for_delete(rbt, x, parent);
|
adjust_for_delete(rbt, x, parent);
|
||||||
|
|
||||||
hawk_rbt_freepair(rbt, y);
|
free_pair(rbt, y);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -844,7 +854,7 @@ static void delete_pair (hawk_rbt_t* rbt, hawk_rbt_pair_t* pair)
|
|||||||
if (pair->left->parent == pair) pair->left->parent = y;
|
if (pair->left->parent == pair) pair->left->parent = y;
|
||||||
if (pair->right->parent == pair) pair->right->parent = y;
|
if (pair->right->parent == pair) pair->right->parent = y;
|
||||||
|
|
||||||
hawk_rbt_freepair(rbt, pair);
|
free_pair(rbt, pair);
|
||||||
}
|
}
|
||||||
|
|
||||||
rbt->size--;
|
rbt->size--;
|
||||||
|
|||||||
@@ -139,6 +139,18 @@ function main()
|
|||||||
tap_ensure(!!@[1], @true, @SCRIPTNAME, @SCRIPTLINE);
|
tap_ensure(!!@[1], @true, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
tap_ensure(!dummy, @false, @SCRIPTNAME, @SCRIPTLINE);
|
tap_ensure(!dummy, @false, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
tap_ensure(!!dummy, @true, @SCRIPTNAME, @SCRIPTLINE);
|
tap_ensure(!!dummy, @true, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
tmp = 0;
|
||||||
|
tap_ensure(!tmp && 0, 0, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
tap_ensure(!tmp && 1, 1, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
tap_ensure(!tmp || 0, 1, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
tap_ensure(!tmp || 1, 1, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
tap_ensure(1 && !tmp, 1, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
tap_ensure(0 || !tmp, 1, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
tmp = 1;
|
||||||
|
tap_ensure(!tmp && 0, 0, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
tap_ensure(!tmp && 1, 0, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
tap_ensure(!tmp || 0, 0, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
tap_ensure(!tmp || 1, 1, @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
|
||||||
tap_ensure(sprintf("%d", @true), "1", @SCRIPTNAME, @SCRIPTLINE);
|
tap_ensure(sprintf("%d", @true), "1", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
tap_ensure(sprintf("%d", @false), "0", @SCRIPTNAME, @SCRIPTLINE);
|
tap_ensure(sprintf("%d", @false), "0", @SCRIPTNAME, @SCRIPTLINE);
|
||||||
|
|||||||
Reference in New Issue
Block a user