1 #ifndef INCLUDE_hashtable_h__
2 #define INCLUDE_hashtable_h__
4 #include "git2/common.h"
8 #define GIT_HASHTABLE_HASHES 3
10 typedef uint32_t (*git_hash_ptr
)(const void *, int hash_id
);
11 typedef int (*git_hash_keyeq_ptr
)(const void *key_a
, const void *key_b
);
13 struct git_hashtable_node
{
18 struct git_hashtable
{
19 struct git_hashtable_node
*nodes
;
28 git_hash_keyeq_ptr key_equal
;
31 typedef struct git_hashtable_node git_hashtable_node
;
32 typedef struct git_hashtable git_hashtable
;
34 git_hashtable
*git_hashtable_alloc(size_t min_size
,
36 git_hash_keyeq_ptr key_eq
);
37 void *git_hashtable_lookup(git_hashtable
*h
, const void *key
);
38 int git_hashtable_remove(git_hashtable
*table
, const void *key
);
39 void git_hashtable_free(git_hashtable
*h
);
40 void git_hashtable_clear(git_hashtable
*h
);
41 int git_hashtable_merge(git_hashtable
*self
, git_hashtable
*other
);
43 int git_hashtable_insert2(git_hashtable
*h
, const void *key
, void *value
, void **old_value
);
45 GIT_INLINE(int) git_hashtable_insert(git_hashtable
*h
, const void *key
, void *value
)
48 return git_hashtable_insert2(h
, key
, value
, &_unused
);
51 #define git_hashtable_node_at(nodes, pos) ((git_hashtable_node *)(&nodes[pos]))
53 #define GIT_HASHTABLE_FOREACH(self, pkey, pvalue, code) {\
54 git_hashtable *_self = (self);\
55 git_hashtable_node *_nodes = _self->nodes;\
56 unsigned int _i, _size = _self->size;\
57 for (_i = 0; _i < _size; _i ++) {\
58 git_hashtable_node *_node = git_hashtable_node_at(_nodes, _i);\
62 pvalue = _node->value;\
68 #define GIT_HASHTABLE_FOREACH_DELETE() {\
69 _node->key = NULL; _node->value = NULL; _self->key_count--;\