This commit is contained in:
parent
0590924941
commit
b361aee101
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: map.h 345 2008-08-26 08:50:12Z baconevi $
|
* $Id: map.h 346 2008-08-26 10:31:24Z baconevi $
|
||||||
*
|
*
|
||||||
* {License}
|
* {License}
|
||||||
*/
|
*/
|
||||||
@ -231,7 +231,8 @@ int ase_map_putx (
|
|||||||
ase_map_pair_t** px
|
ase_map_pair_t** px
|
||||||
);
|
);
|
||||||
|
|
||||||
ase_map_pair_t* ase_map_set (
|
/* update the value of a existing pair with a matching key */
|
||||||
|
ase_map_pair_t* ase_map_update (
|
||||||
ase_map_t* map /* a map */,
|
ase_map_t* map /* a map */,
|
||||||
void* kptr,
|
void* kptr,
|
||||||
ase_size_t klen,
|
ase_size_t klen,
|
||||||
@ -239,8 +240,8 @@ ase_map_pair_t* ase_map_set (
|
|||||||
ase_size_t vlen
|
ase_size_t vlen
|
||||||
);
|
);
|
||||||
|
|
||||||
/* remove a pair with a matching key */
|
/* delete a pair with a matching key */
|
||||||
int ase_map_remove (
|
int ase_map_delete (
|
||||||
ase_map_t* map /* a map */,
|
ase_map_t* map /* a map */,
|
||||||
const void* kptr,
|
const void* kptr,
|
||||||
ase_size_t klen
|
ase_size_t klen
|
||||||
|
@ -214,8 +214,8 @@ ase_sll_node_t* ase_sll_pushtail (
|
|||||||
);
|
);
|
||||||
|
|
||||||
void ase_sll_delete (
|
void ase_sll_delete (
|
||||||
ase_sll_t* sll,
|
ase_sll_t* sll /* a singly linked list */,
|
||||||
ase_sll_node_t* pos
|
ase_sll_node_t* pos /* a node to delete */
|
||||||
);
|
);
|
||||||
|
|
||||||
void ase_sll_pophead (
|
void ase_sll_pophead (
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: map.c 345 2008-08-26 08:50:12Z baconevi $
|
* $Id: map.c 346 2008-08-26 10:31:24Z baconevi $
|
||||||
*
|
*
|
||||||
* {License}
|
* {License}
|
||||||
*/
|
*/
|
||||||
@ -19,6 +19,7 @@
|
|||||||
#define KLEN(p) ASE_MAP_KLEN(p)
|
#define KLEN(p) ASE_MAP_KLEN(p)
|
||||||
#define VPTR(p) ASE_MAP_VPTR(p)
|
#define VPTR(p) ASE_MAP_VPTR(p)
|
||||||
#define VLEN(p) ASE_MAP_VLEN(p)
|
#define VLEN(p) ASE_MAP_VLEN(p)
|
||||||
|
#define NEXT(p) ASE_MAP_NEXT(p)
|
||||||
|
|
||||||
#define size_t ase_size_t
|
#define size_t ase_size_t
|
||||||
#define byte_t ase_byte_t
|
#define byte_t ase_byte_t
|
||||||
@ -67,7 +68,7 @@ static pair_t* alloc_pair (map_t* map,
|
|||||||
n = ASE_MMGR_ALLOC (map->mmgr, as);
|
n = ASE_MMGR_ALLOC (map->mmgr, as);
|
||||||
if (n == ASE_NULL) return ASE_NULL;
|
if (n == ASE_NULL) return ASE_NULL;
|
||||||
|
|
||||||
ASE_MAP_NEXT(n) = ASE_NULL;
|
NEXT(n) = ASE_NULL;
|
||||||
|
|
||||||
KLEN(n) = klen;
|
KLEN(n) = klen;
|
||||||
if (kcop == ASE_NULL)
|
if (kcop == ASE_NULL)
|
||||||
@ -234,7 +235,7 @@ void ase_map_clear (map_t* map)
|
|||||||
|
|
||||||
while (pair != ASE_NULL)
|
while (pair != ASE_NULL)
|
||||||
{
|
{
|
||||||
next = ASE_MAP_NEXT(pair);
|
next = NEXT(pair);
|
||||||
free_pair (map, pair);
|
free_pair (map, pair);
|
||||||
map->size--;
|
map->size--;
|
||||||
pair = next;
|
pair = next;
|
||||||
@ -328,7 +329,7 @@ pair_t* ase_map_get (
|
|||||||
return pair;
|
return pair;
|
||||||
}
|
}
|
||||||
|
|
||||||
pair = ASE_MAP_NEXT(pair);
|
pair = NEXT(pair);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ASE_NULL;
|
return ASE_NULL;
|
||||||
@ -349,15 +350,16 @@ int ase_map_putx (
|
|||||||
map_t* map, void* kptr, size_t klen,
|
map_t* map, void* kptr, size_t klen,
|
||||||
void* vptr, size_t vlen, pair_t** px)
|
void* vptr, size_t vlen, pair_t** px)
|
||||||
{
|
{
|
||||||
pair_t* pair, * p, * prev = ASE_NULL, * next;
|
pair_t* pair, * p, * prev, * next;
|
||||||
size_t hc;
|
size_t hc;
|
||||||
|
|
||||||
hc = map->hasher(map,kptr,klen) % map->capa;
|
hc = map->hasher(map,kptr,klen) % map->capa;
|
||||||
pair = map->buck[hc];
|
pair = map->buck[hc];
|
||||||
|
prev = ASE_NULL;
|
||||||
|
|
||||||
while (pair != ASE_NULL)
|
while (pair != ASE_NULL)
|
||||||
{
|
{
|
||||||
next = ASE_MAP_NEXT(pair);
|
next = NEXT(pair);
|
||||||
|
|
||||||
if (map->comper (map, KPTR(pair), KLEN(pair), kptr, klen) == 0)
|
if (map->comper (map, KPTR(pair), KLEN(pair), kptr, klen) == 0)
|
||||||
{
|
{
|
||||||
@ -367,8 +369,8 @@ int ase_map_putx (
|
|||||||
{
|
{
|
||||||
/* the pair has been reallocated. relink it */
|
/* the pair has been reallocated. relink it */
|
||||||
if (prev == ASE_NULL) map->buck[hc] = p;
|
if (prev == ASE_NULL) map->buck[hc] = p;
|
||||||
else ASE_MAP_NEXT(prev) = p;
|
else NEXT(prev) = p;
|
||||||
ASE_MAP_NEXT(p) = next;
|
NEXT(p) = next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (px != ASE_NULL) *px = p;
|
if (px != ASE_NULL) *px = p;
|
||||||
@ -407,7 +409,7 @@ int ase_map_putx (
|
|||||||
pair = alloc_pair (map, kptr, klen, vptr, vlen);
|
pair = alloc_pair (map, kptr, klen, vptr, vlen);
|
||||||
if (pair == ASE_NULL) return -1; /* error */
|
if (pair == ASE_NULL) return -1; /* error */
|
||||||
|
|
||||||
ASE_MAP_NEXT(pair) = map->buck[hc];
|
NEXT(pair) = map->buck[hc];
|
||||||
map->buck[hc] = pair;
|
map->buck[hc] = pair;
|
||||||
map->size++;
|
map->size++;
|
||||||
|
|
||||||
@ -415,30 +417,44 @@ int ase_map_putx (
|
|||||||
return 1; /* new key added */
|
return 1; /* new key added */
|
||||||
}
|
}
|
||||||
|
|
||||||
pair_t* ase_map_set (map_t* map,
|
pair_t* ase_map_update (map_t* map,
|
||||||
void* kptr, size_t klen, void* vptr, size_t vlen)
|
void* kptr, size_t klen, void* vptr, size_t vlen)
|
||||||
{
|
{
|
||||||
pair_t* pair;
|
pair_t* pair, * p, * prev, * next;
|
||||||
size_t hc;
|
size_t hc;
|
||||||
|
|
||||||
hc = map->hasher(map,kptr,klen) % map->capa;
|
hc = map->hasher(map,kptr,klen) % map->capa;
|
||||||
pair = map->buck[hc];
|
pair = map->buck[hc];
|
||||||
|
prev = ASE_NULL;
|
||||||
|
|
||||||
while (pair != ASE_NULL)
|
while (pair != ASE_NULL)
|
||||||
{
|
{
|
||||||
|
next = NEXT(pair);
|
||||||
|
|
||||||
if (map->comper (map, KPTR(pair), KLEN(pair), kptr, klen) == 0)
|
if (map->comper (map, KPTR(pair), KLEN(pair), kptr, klen) == 0)
|
||||||
{
|
{
|
||||||
/*TODO: this is wrong... change code .... same way as putx... */
|
p = change_pair_val (map, pair, vptr, vlen);
|
||||||
return change_pair_val (map, pair, vptr, vlen);
|
|
||||||
|
if (p == ASE_NULL) return ASE_NULL; /* change error */
|
||||||
|
if (p != pair)
|
||||||
|
{
|
||||||
|
/* the pair has been reallocated. relink it */
|
||||||
|
if (prev == ASE_NULL) map->buck[hc] = p;
|
||||||
|
else NEXT(prev) = p;
|
||||||
|
NEXT(p) = next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0; /* value changed for the existing key */
|
||||||
}
|
}
|
||||||
pair = ASE_MAP_NEXT(pair);
|
|
||||||
|
prev = pair;
|
||||||
|
pair = next;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ASE_NULL;
|
return ASE_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ase_map_remove (
|
int ase_map_delete (map_t* map, const void* kptr, size_t klen)
|
||||||
map_t* map, const void* kptr, size_t klen)
|
|
||||||
{
|
{
|
||||||
pair_t* pair, * prev;
|
pair_t* pair, * prev;
|
||||||
size_t hc;
|
size_t hc;
|
||||||
@ -452,8 +468,8 @@ int ase_map_remove (
|
|||||||
if (map->comper (map, KPTR(pair), KLEN(pair), kptr, klen) == 0)
|
if (map->comper (map, KPTR(pair), KLEN(pair), kptr, klen) == 0)
|
||||||
{
|
{
|
||||||
if (prev == ASE_NULL)
|
if (prev == ASE_NULL)
|
||||||
map->buck[hc] = ASE_MAP_NEXT(pair);
|
map->buck[hc] = NEXT(pair);
|
||||||
else ASE_MAP_NEXT(prev) = ASE_MAP_NEXT(pair);
|
else NEXT(prev) = NEXT(pair);
|
||||||
|
|
||||||
free_pair (map, pair);
|
free_pair (map, pair);
|
||||||
map->size--;
|
map->size--;
|
||||||
@ -462,7 +478,7 @@ int ase_map_remove (
|
|||||||
}
|
}
|
||||||
|
|
||||||
prev = pair;
|
prev = pair;
|
||||||
pair = ASE_MAP_NEXT(pair);
|
pair = NEXT(pair);
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
@ -479,7 +495,7 @@ void ase_map_walk (map_t* map, walker_t walker, void* arg)
|
|||||||
|
|
||||||
while (pair != ASE_NULL)
|
while (pair != ASE_NULL)
|
||||||
{
|
{
|
||||||
next = ASE_MAP_NEXT(pair);
|
next = NEXT(pair);
|
||||||
if (walker(map, pair, arg) == ASE_MAP_WALK_STOP) return;
|
if (walker(map, pair, arg) == ASE_MAP_WALK_STOP) return;
|
||||||
pair = next;
|
pair = next;
|
||||||
}
|
}
|
||||||
@ -510,7 +526,7 @@ pair_t* ase_map_getnextpair (
|
|||||||
size_t i;
|
size_t i;
|
||||||
pair_t* next;
|
pair_t* next;
|
||||||
|
|
||||||
next = ASE_MAP_NEXT(pair);
|
next = NEXT(pair);
|
||||||
if (next != ASE_NULL)
|
if (next != ASE_NULL)
|
||||||
{
|
{
|
||||||
/* no change in bucket number */
|
/* no change in bucket number */
|
||||||
@ -556,13 +572,13 @@ static int reorganize (map_t* map)
|
|||||||
|
|
||||||
while (pair != ASE_NULL)
|
while (pair != ASE_NULL)
|
||||||
{
|
{
|
||||||
pair_t* next = ASE_MAP_NEXT(pair);
|
pair_t* next = NEXT(pair);
|
||||||
|
|
||||||
hc = map->hasher (map,
|
hc = map->hasher (map,
|
||||||
KPTR(pair),
|
KPTR(pair),
|
||||||
KLEN(pair)) % new_capa;
|
KLEN(pair)) % new_capa;
|
||||||
|
|
||||||
ASE_MAP_NEXT(pair) = new_buck[hc];
|
NEXT(pair) = new_buck[hc];
|
||||||
new_buck[hc] = pair;
|
new_buck[hc] = pair;
|
||||||
|
|
||||||
pair = next;
|
pair = next;
|
||||||
|
Loading…
Reference in New Issue
Block a user