File Coverage

deps/libgit2/src/libgit2/oidmap.c
Criterion Covered Total %
statement 41 49 83.6
branch 74 106 69.8
condition n/a
subroutine n/a
pod n/a
total 115 155 74.1


line stmt bran cond sub pod time code
1             /*
2             * Copyright (C) the libgit2 contributors. All rights reserved.
3             *
4             * This file is part of libgit2, distributed under the GNU GPL v2 with
5             * a Linking Exception. For full terms see the included COPYING file.
6             */
7              
8             #include "oidmap.h"
9              
10             #define kmalloc git__malloc
11             #define kcalloc git__calloc
12             #define krealloc git__realloc
13             #define kreallocarray git__reallocarray
14             #define kfree git__free
15             #include "khash.h"
16              
17             __KHASH_TYPE(oid, const git_oid *, void *)
18              
19 5087           GIT_INLINE(khint_t) git_oidmap_hash(const git_oid *oid)
20             {
21             khint_t h;
22 5087           memcpy(&h, oid->id, sizeof(khint_t));
23 5087           return h;
24             }
25              
26 14493 0         __KHASH_IMPL(oid, static kh_inline, const git_oid *, void *, 1, git_oidmap_hash, git_oid_equal)
    0          
    100          
    50          
    0          
    50          
    100          
    50          
    50          
    100          
    50          
    100          
    50          
    100          
    50          
    100          
    50          
    100          
    50          
    100          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    100          
    100          
    50          
    100          
    50          
    100          
    50          
    100          
    100          
    50          
    100          
    100          
    50          
27              
28 225           int git_oidmap_new(git_oidmap **out)
29             {
30 225           *out = kh_init(oid);
31 225 50         GIT_ERROR_CHECK_ALLOC(*out);
32              
33 225           return 0;
34             }
35              
36 225           void git_oidmap_free(git_oidmap *map)
37             {
38 225           kh_destroy(oid, map);
39 225           }
40              
41 38           void git_oidmap_clear(git_oidmap *map)
42             {
43 38           kh_clear(oid, map);
44 38           }
45              
46 167           size_t git_oidmap_size(git_oidmap *map)
47             {
48 167           return kh_size(map);
49             }
50              
51 3883           void *git_oidmap_get(git_oidmap *map, const git_oid *key)
52             {
53 3883           size_t idx = kh_get(oid, map, key);
54 3883 100         if (idx == kh_end(map) || !kh_exist(map, idx))
    50          
55 1662           return NULL;
56 2221           return kh_val(map, idx);
57             }
58              
59 763           int git_oidmap_set(git_oidmap *map, const git_oid *key, void *value)
60             {
61             size_t idx;
62             int rval;
63              
64 763           idx = kh_put(oid, map, key, &rval);
65 763 50         if (rval < 0)
66 0           return -1;
67              
68 763 100         if (rval == 0)
69 182           kh_key(map, idx) = key;
70              
71 763           kh_val(map, idx) = value;
72              
73 763           return 0;
74             }
75              
76 0           int git_oidmap_delete(git_oidmap *map, const git_oid *key)
77             {
78 0           khiter_t idx = kh_get(oid, map, key);
79 0 0         if (idx == kh_end(map))
80 0           return GIT_ENOTFOUND;
81 0           kh_del(oid, map, idx);
82 0           return 0;
83             }
84              
85 123           int git_oidmap_exists(git_oidmap *map, const git_oid *key)
86             {
87 123           return kh_get(oid, map, key) != kh_end(map);
88             }
89              
90 753           int git_oidmap_iterate(void **value, git_oidmap *map, size_t *iter, const git_oid **key)
91             {
92 753           size_t i = *iter;
93              
94 1254 100         while (i < map->n_buckets && !kh_exist(map, i))
    100          
95 501           i++;
96              
97 753 100         if (i >= map->n_buckets)
98 174           return GIT_ITEROVER;
99              
100 579 50         if (key)
101 0           *key = kh_key(map, i);
102 579 50         if (value)
103 579           *value = kh_value(map, i);
104 579           *iter = ++i;
105              
106 579           return 0;
107             }