| #ifndef INCLUDE_hashtable_h__ |
| #define INCLUDE_hashtable_h__ |
| |
| #include "git2/common.h" |
| #include "git2/oid.h" |
| #include "git2/odb.h" |
| |
| #define GIT_HASHTABLE_HASHES 3 |
| |
| typedef uint32_t (*git_hash_ptr)(const void *, int hash_id); |
| typedef int (*git_hash_keyeq_ptr)(const void *key_a, const void *key_b); |
| |
| struct git_hashtable_node { |
| const void *key; |
| void *value; |
| }; |
| |
| struct git_hashtable { |
| struct git_hashtable_node *nodes; |
| |
| size_t size_mask; |
| size_t size; |
| size_t key_count; |
| |
| int is_resizing; |
| |
| git_hash_ptr hash; |
| git_hash_keyeq_ptr key_equal; |
| }; |
| |
| typedef struct git_hashtable_node git_hashtable_node; |
| typedef struct git_hashtable git_hashtable; |
| |
| git_hashtable *git_hashtable_alloc(size_t min_size, |
| git_hash_ptr hash, |
| git_hash_keyeq_ptr key_eq); |
| void *git_hashtable_lookup(git_hashtable *h, const void *key); |
| int git_hashtable_remove(git_hashtable *table, const void *key); |
| void git_hashtable_free(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_FOREACH(self, pkey, pvalue, code) {\ |
| git_hashtable *_self = (self);\ |
| git_hashtable_node *_nodes = _self->nodes;\ |
| unsigned int _i, _size = _self->size;\ |
| for (_i = 0; _i < _size; _i ++) {\ |
| git_hashtable_node *_node = git_hashtable_node_at(_nodes, _i);\ |
| if (_node->key)\ |
| {\ |
| pkey = _node->key;\ |
| pvalue = _node->value;\ |
| code;\ |
| }\ |
| }\ |
| } |
| |
| #define GIT_HASHTABLE_FOREACH_DELETE() {\ |
| _node->key = NULL; _node->value = NULL; _self->key_count--;\ |
| } |
| |
| |
| #endif |