mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-29 06:20:56 +00:00
Add extra methods to the new Hashtable implementation
Signed-off-by: Vicent Marti <tanoku@gmail.com>
This commit is contained in:
parent
ccef1c9dc2
commit
2e60b65290
@ -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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
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;
|
|||||||
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);
|
|||||||
}\
|
}\
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define GIT_HASHTABLE_FOREACH_DELETE() {\
|
||||||
|
_node->key = NULL; _node->value = NULL; _self->key_count--;\
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user