source src/offmap.c
Line | Flow | Count | Block(s) | Source |
---|---|---|---|---|
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 "offmap.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(off, off64_t, void *) | ||
18 | - | |||
19 | 50234 | 2,2,2,2,2,2,2 | __KHASH_IMPL(off, static kh_inline, off64_t, void *, 1, kh_int64_hash_func, kh_int64_hash_equal) | |
20 | - | |||
21 | - | |||
22 | 2601 | 2 | int git_offmap_new(git_offmap **out) | |
23 | - | { | ||
24 | 2601 | 2 | *out = kh_init(off); | |
25 | 2601 | 3,4 | GIT_ERROR_CHECK_ALLOC(*out); | |
26 | - | |||
27 | 2601 | 5 | return 0; | |
28 | - | } | ||
29 | - | |||
30 | 2601 | 2 | void git_offmap_free(git_offmap *map) | |
31 | - | { | ||
32 | 2601 | 2 | kh_destroy(off, map); | |
33 | 2601 | 3 | } | |
34 | - | |||
35 | ##### | 2 | void git_offmap_clear(git_offmap *map) | |
36 | - | { | ||
37 | ##### | 2 | kh_clear(off, map); | |
38 | ##### | 3 | } | |
39 | - | |||
40 | ##### | 2 | size_t git_offmap_size(git_offmap *map) | |
41 | - | { | ||
42 | ##### | 2 | return kh_size(map); | |
43 | - | } | ||
44 | - | |||
45 | 44969 | 2 | void *git_offmap_get(git_offmap *map, const off64_t key) | |
46 | - | { | ||
47 | 44969 | 2 | size_t idx = kh_get(off, map, key); | |
48 | 44969 | 3,4 | if (idx == kh_end(map) || !kh_exist(map, idx)) | |
49 | 34692 | 5 | return NULL; | |
50 | 10277 | 6 | return kh_val(map, idx); | |
51 | - | } | ||
52 | - | |||
53 | 5265 | 2 | int git_offmap_set(git_offmap *map, const off64_t key, void *value) | |
54 | - | { | ||
55 | - | size_t idx; | ||
56 | - | int rval; | ||
57 | - | |||
58 | 5265 | 2 | idx = kh_put(off, map, key, &rval); | |
59 | 5265 | 3 | if (rval < 0) | |
60 | ##### | 4 | return -1; | |
61 | - | |||
62 | 5265 | 5 | if (rval == 0) | |
63 | ##### | 6 | kh_key(map, idx) = key; | |
64 | - | |||
65 | 5265 | 7 | kh_val(map, idx) = value; | |
66 | - | |||
67 | 5265 | 7 | return 0; | |
68 | - | } | ||
69 | - | |||
70 | ##### | 2 | int git_offmap_delete(git_offmap *map, const off64_t key) | |
71 | - | { | ||
72 | ##### | 2 | khiter_t idx = kh_get(off, map, key); | |
73 | ##### | 3 | if (idx == kh_end(map)) | |
74 | ##### | 4 | return GIT_ENOTFOUND; | |
75 | ##### | 5 | kh_del(off, map, idx); | |
76 | ##### | 6 | return 0; | |
77 | - | } | ||
78 | - | |||
79 | 5265 | 2 | int git_offmap_exists(git_offmap *map, const off64_t key) | |
80 | - | { | ||
81 | 5265 | 2 | return kh_get(off, map, key) != kh_end(map); | |
82 | - | } | ||
83 | - | |||
84 | 7866 | 2 | int git_offmap_iterate(void **value, git_offmap *map, size_t *iter, off64_t *key) | |
85 | - | { | ||
86 | 7866 | 2 | size_t i = *iter; | |
87 | - | |||
88 | 13173 | 2,4,5 | while (i < map->n_buckets && !kh_exist(map, i)) | |
89 | 5307 | 3 | i++; | |
90 | - | |||
91 | 7866 | 6 | if (i >= map->n_buckets) | |
92 | 2601 | 7 | return GIT_ITEROVER; | |
93 | - | |||
94 | 5265 | 8 | if (key) | |
95 | ##### | 9 | *key = kh_key(map, i); | |
96 | 5265 | 10 | if (value) | |
97 | 5265 | 11 | *value = kh_value(map, i); | |
98 | 5265 | 12 | *iter = ++i; | |
99 | - | |||
100 | 5265 | 12 | return 0; | |
101 | - | } |