summaryrefslogtreecommitdiff
path: root/src/hashtable.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/hashtable.h')
-rw-r--r--src/hashtable.h51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/hashtable.h b/src/hashtable.h
new file mode 100644
index 000000000..622a260e1
--- /dev/null
+++ b/src/hashtable.h
@@ -0,0 +1,51 @@
+#ifndef INCLUDE_hashtable_h__
+#define INCLUDE_hashtable_h__
+
+#include "git/common.h"
+#include "git/oid.h"
+#include "git/odb.h"
+
+
+typedef uint32_t (*git_hash_ptr)(const void *);
+typedef int (*git_hash_keyeq_ptr)(void *obj, const void *obj_key);
+
+struct git_hashtable_node {
+ void *object;
+ uint32_t hash;
+ struct git_hashtable_node *next;
+};
+
+struct git_hashtable {
+ struct git_hashtable_node **nodes;
+
+ unsigned int size_mask;
+ unsigned int count;
+ unsigned int max_count;
+
+ git_hash_ptr hash;
+ git_hash_keyeq_ptr key_equal;
+};
+
+struct git_hashtable_iterator {
+ struct git_hashtable_node **nodes;
+ struct git_hashtable_node *current_node;
+ unsigned int current_pos;
+ unsigned int size;
+};
+
+typedef struct git_hashtable_node git_hashtable_node;
+typedef struct git_hashtable git_hashtable;
+typedef struct git_hashtable_iterator git_hashtable_iterator;
+
+git_hashtable *git_hashtable_alloc(unsigned int min_size,
+ git_hash_ptr hash,
+ 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_free(git_hashtable *h);
+void git_hashtable_clear(git_hashtable *h);
+
+void *git_hashtable_iterator_next(git_hashtable_iterator *it);
+void git_hashtable_iterator_init(git_hashtable *h, git_hashtable_iterator *it);
+
+#endif