diff options
author | Zack Rusin <zack@tungstengraphics.com> | 2008-03-13 16:41:12 -0400 |
---|---|---|
committer | Zack Rusin <zack@tungstengraphics.com> | 2008-03-13 16:41:37 -0400 |
commit | a889928d85ac8ba7e1a7fe15393858a9422cf750 (patch) | |
tree | da9b2944fea3afe8bd3e97a262b89166b425e18a /src/gallium/auxiliary/cso_cache/cso_hash.c | |
parent | 3faf6230ff4b63833c072ac7afeb43c25d3cba22 (diff) |
add a way of removing an exact iterator from the hash
Diffstat (limited to 'src/gallium/auxiliary/cso_cache/cso_hash.c')
-rw-r--r-- | src/gallium/auxiliary/cso_cache/cso_hash.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/src/gallium/auxiliary/cso_cache/cso_hash.c b/src/gallium/auxiliary/cso_cache/cso_hash.c index 5cad5d3be7..ddce3822f7 100644 --- a/src/gallium/auxiliary/cso_cache/cso_hash.c +++ b/src/gallium/auxiliary/cso_cache/cso_hash.c @@ -99,7 +99,7 @@ static void *cso_data_allocate_node(struct cso_hash_data *hash) return MALLOC(hash->nodeSize); } -static void cso_data_free_node(struct cso_node *node) +static void cso_free_node(struct cso_node *node) { FREE(node); } @@ -248,7 +248,7 @@ void cso_hash_delete(struct cso_hash *hash) struct cso_node *cur = *bucket++; while (cur != e_for_x) { struct cso_node *next = cur->next; - cso_data_free_node(cur); + cso_free_node(cur); cur = next; } } @@ -367,7 +367,7 @@ void * cso_hash_take(struct cso_hash *hash, if (*node != hash->data.e) { void *t = (*node)->value; struct cso_node *next = (*node)->next; - cso_data_free_node(*node); + cso_free_node(*node); *node = next; --hash->data.d->size; cso_data_has_shrunk(hash->data.d); @@ -393,3 +393,22 @@ int cso_hash_size(struct cso_hash *hash) { return hash->data.d->size; } + +struct cso_hash_iter cso_hash_erase(struct cso_hash *hash, struct cso_hash_iter iter) +{ + struct cso_hash_iter ret = iter; + struct cso_node *node = iter.node; + struct cso_node **node_ptr; + + if (node == hash->data.e) + return iter; + + ret = cso_hash_iter_next(ret); + node_ptr = (struct cso_node**)(&hash->data.d->buckets[node->key % hash->data.d->numBuckets]); + while (*node_ptr != node) + node_ptr = &(*node_ptr)->next; + *node_ptr = node->next; + cso_free_node(node); + --hash->data.d->size; + return ret; +} |