File Coverage

deps/libgit2/src/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 5071           GIT_INLINE(khint_t) git_oidmap_hash(const git_oid *oid)
20             {
21             khint_t h;
22 5071           memcpy(&h, oid, sizeof(khint_t));
23 5071           return h;
24             }
25              
26 14035 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 205           int git_oidmap_new(git_oidmap **out)
29             {
30 205           *out = kh_init(oid);
31 205 50         GIT_ERROR_CHECK_ALLOC(*out);
32              
33 205           return 0;
34             }
35              
36 205           void git_oidmap_free(git_oidmap *map)
37             {
38 205           kh_destroy(oid, map);
39 205           }
40              
41 38           void git_oidmap_clear(git_oidmap *map)
42             {
43 38           kh_clear(oid, map);
44 38           }
45              
46 129           size_t git_oidmap_size(git_oidmap *map)
47             {
48 129           return kh_size(map);
49             }
50              
51 3868           void *git_oidmap_get(git_oidmap *map, const git_oid *key)
52             {
53 3868           size_t idx = kh_get(oid, map, key);
54 3868 100         if (idx == kh_end(map) || !kh_exist(map, idx))
    50          
55 1635           return NULL;
56 2233           return kh_val(map, idx);
57             }
58              
59 761           int git_oidmap_set(git_oidmap *map, const git_oid *key, void *value)
60             {
61             size_t idx;
62             int rval;
63              
64 761           idx = kh_put(oid, map, key, &rval);
65 761 50         if (rval < 0)
66 0           return -1;
67              
68 761 100         if (rval == 0)
69 182           kh_key(map, idx) = key;
70              
71 761           kh_val(map, idx) = value;
72              
73 761           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 750           int git_oidmap_iterate(void **value, git_oidmap *map, size_t *iter, const git_oid **key)
91             {
92 750           size_t i = *iter;
93              
94 1249 100         while (i < map->n_buckets && !kh_exist(map, i))
    100          
95 499           i++;
96              
97 750 100         if (i >= map->n_buckets)
98 173           return GIT_ITEROVER;
99              
100 577 50         if (key)
101 0           *key = kh_key(map, i);
102 577 50         if (value)
103 577           *value = kh_value(map, i);
104 577           *iter = ++i;
105              
106 577           return 0;
107             }