]> git.proxmox.com Git - libgit2.git/blobdiff - src/strmap.c
New upstream version 1.1.0+dfsg.1
[libgit2.git] / src / strmap.c
index b26a13d1f67f2f05265c9ffc9bba4e18e424db49..c6e5b6dc70b3aed2e7ed5fa684175c861024dbea 100644 (file)
@@ -7,26 +7,94 @@
 
 #include "strmap.h"
 
-int git_strmap_next(
-       void **data,
-       git_strmap_iter* iter,
-       git_strmap *map)
+#define kmalloc git__malloc
+#define kcalloc git__calloc
+#define krealloc git__realloc
+#define kreallocarray git__reallocarray
+#define kfree git__free
+#include "khash.h"
+
+__KHASH_TYPE(str, const char *, void *)
+
+__KHASH_IMPL(str, static kh_inline, const char *, void *, 1, kh_str_hash_func, kh_str_hash_equal)
+
+int git_strmap_new(git_strmap **out)
+{
+       *out = kh_init(str);
+       GIT_ERROR_CHECK_ALLOC(*out);
+
+       return 0;
+}
+
+void git_strmap_free(git_strmap *map)
+{
+       kh_destroy(str, map);
+}
+
+void git_strmap_clear(git_strmap *map)
+{
+       kh_clear(str, map);
+}
+
+size_t git_strmap_size(git_strmap *map)
 {
-       if (!map)
-               return GIT_ERROR;
+       return kh_size(map);
+}
 
-       while (*iter != git_strmap_end(map)) {
-               if (!(git_strmap_has_data(map, *iter))) {
-                       ++(*iter);
-                       continue;
-               }
+void *git_strmap_get(git_strmap *map, const char *key)
+{
+       size_t idx = kh_get(str, map, key);
+       if (idx == kh_end(map) || !kh_exist(map, idx))
+               return NULL;
+       return kh_val(map, idx);
+}
+
+int git_strmap_set(git_strmap *map, const char *key, void *value)
+{
+       size_t idx;
+       int rval;
+
+       idx = kh_put(str, map, key, &rval);
+       if (rval < 0)
+               return -1;
+
+       if (rval == 0)
+               kh_key(map, idx) = key;
+
+       kh_val(map, idx) = value;
+
+       return 0;
+}
+
+int git_strmap_delete(git_strmap *map, const char *key)
+{
+       khiter_t idx = kh_get(str, map, key);
+       if (idx == kh_end(map))
+               return GIT_ENOTFOUND;
+       kh_del(str, map, idx);
+       return 0;
+}
+
+int git_strmap_exists(git_strmap *map, const char *key)
+{
+       return kh_get(str, map, key) != kh_end(map);
+}
+
+int git_strmap_iterate(void **value, git_strmap *map, size_t *iter, const char **key)
+{
+       size_t i = *iter;
 
-               *data = git_strmap_value_at(map, *iter);
+       while (i < map->n_buckets && !kh_exist(map, i))
+               i++;
 
-               ++(*iter);
+       if (i >= map->n_buckets)
+               return GIT_ITEROVER;
 
-               return GIT_OK;
-       }
+       if (key)
+               *key = kh_key(map, i);
+       if (value)
+               *value = kh_val(map, i);
+       *iter = ++i;
 
-       return GIT_ITEROVER;
+       return 0;
 }