Commit 2e60b652 by Vicent Marti

Add extra methods to the new Hashtable implementation

Signed-off-by: Vicent Marti <tanoku@gmail.com>
parent ccef1c9d
...@@ -179,11 +179,13 @@ void git_hashtable_free(git_hashtable *self) ...@@ -179,11 +179,13 @@ void git_hashtable_free(git_hashtable *self)
} }
int git_hashtable_insert(git_hashtable *self, const void *key, void *value) int git_hashtable_insert2(git_hashtable *self, const void *key, void *value, void **old_value)
{ {
int hash_id; int hash_id;
git_hashtable_node *node; git_hashtable_node *node;
*old_value = NULL;
for (hash_id = 0; hash_id < GIT_HASHTABLE_HASHES; ++hash_id) { for (hash_id = 0; hash_id < GIT_HASHTABLE_HASHES; ++hash_id) {
node = node_with_hash(self, key, hash_id); node = node_with_hash(self, key, hash_id);
...@@ -195,6 +197,8 @@ int git_hashtable_insert(git_hashtable *self, const void *key, void *value) ...@@ -195,6 +197,8 @@ int git_hashtable_insert(git_hashtable *self, const void *key, void *value)
} }
if (key == node->key || self->key_equal(key, node->key) == 0) { if (key == node->key || self->key_equal(key, node->key) == 0) {
*old_value = node->value;
node->key = key;
node->value = value; node->value = value;
return GIT_SUCCESS; return GIT_SUCCESS;
} }
...@@ -241,3 +245,11 @@ int git_hashtable_remove(git_hashtable *self, const void *key) ...@@ -241,3 +245,11 @@ int git_hashtable_remove(git_hashtable *self, const void *key)
return GIT_ENOTFOUND; return GIT_ENOTFOUND;
} }
int git_hashtable_merge(git_hashtable *self, git_hashtable *other)
{
if (resize_to(self, (self->size + other->size) * 2) < GIT_SUCCESS)
return GIT_ENOMEM;
return insert_nodes(self, other->nodes, other->key_count);
}
...@@ -34,11 +34,19 @@ typedef struct git_hashtable git_hashtable; ...@@ -34,11 +34,19 @@ typedef struct git_hashtable git_hashtable;
git_hashtable *git_hashtable_alloc(size_t min_size, git_hashtable *git_hashtable_alloc(size_t min_size,
git_hash_ptr hash, git_hash_ptr hash,
git_hash_keyeq_ptr key_eq); git_hash_keyeq_ptr key_eq);
int git_hashtable_insert(git_hashtable *h, const void *key, void *value);
void *git_hashtable_lookup(git_hashtable *h, const void *key); void *git_hashtable_lookup(git_hashtable *h, const void *key);
int git_hashtable_remove(git_hashtable *table, const void *key); int git_hashtable_remove(git_hashtable *table, const void *key);
void git_hashtable_free(git_hashtable *h); void git_hashtable_free(git_hashtable *h);
void git_hashtable_clear(git_hashtable *h); void git_hashtable_clear(git_hashtable *h);
int git_hashtable_merge(git_hashtable *self, git_hashtable *other);
int git_hashtable_insert2(git_hashtable *h, const void *key, void *value, void **old_value);
GIT_INLINE(int) git_hashtable_insert(git_hashtable *h, const void *key, void *value)
{
void *_unused;
return git_hashtable_insert2(h, key, value, &_unused);
}
#define git_hashtable_node_at(nodes, pos) ((git_hashtable_node *)(&nodes[pos])) #define git_hashtable_node_at(nodes, pos) ((git_hashtable_node *)(&nodes[pos]))
...@@ -57,5 +65,9 @@ void git_hashtable_clear(git_hashtable *h); ...@@ -57,5 +65,9 @@ void git_hashtable_clear(git_hashtable *h);
}\ }\
} }
#define GIT_HASHTABLE_FOREACH_DELETE() {\
_node->key = NULL; _node->value = NULL; _self->key_count--;\
}
#endif #endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment