]>
Commit | Line | Data |
---|---|---|
c0f4a011 CMN |
1 | /* |
2 | * Copyright (C) 2012 the libgit2 contributors | |
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 | #ifndef INCLUDE_offmap_h__ | |
8 | #define INCLUDE_offmap_h__ | |
9 | ||
10 | #include "common.h" | |
11 | #include "git2/types.h" | |
12 | ||
13 | #define kmalloc git__malloc | |
14 | #define kcalloc git__calloc | |
15 | #define krealloc git__realloc | |
650e45f6 | 16 | #define kreallocarray git__reallocarray |
c0f4a011 CMN |
17 | #define kfree git__free |
18 | #include "khash.h" | |
19 | ||
c8e02b87 | 20 | __KHASH_TYPE(off, git_off_t, void *) |
c0f4a011 CMN |
21 | typedef khash_t(off) git_offmap; |
22 | ||
23 | #define GIT__USE_OFFMAP \ | |
c8e02b87 | 24 | __KHASH_IMPL(off, static kh_inline, git_off_t, void *, 1, kh_int64_hash_func, kh_int64_hash_equal) |
c0f4a011 CMN |
25 | |
26 | #define git_offmap_alloc() kh_init(off) | |
27 | #define git_offmap_free(h) kh_destroy(off, h), h = NULL | |
28 | #define git_offmap_clear(h) kh_clear(off, h) | |
29 | ||
30 | #define git_offmap_num_entries(h) kh_size(h) | |
31 | ||
32 | #define git_offmap_lookup_index(h, k) kh_get(off, h, k) | |
33 | #define git_offmap_valid_index(h, idx) (idx != kh_end(h)) | |
34 | ||
35 | #define git_offmap_exists(h, k) (kh_get(off, h, k) != kh_end(h)) | |
36 | ||
37 | #define git_offmap_value_at(h, idx) kh_val(h, idx) | |
38 | #define git_offmap_set_value_at(h, idx, v) kh_val(h, idx) = v | |
39 | #define git_offmap_delete_at(h, idx) kh_del(off, h, idx) | |
40 | ||
41 | #define git_offmap_insert(h, key, val, rval) do { \ | |
42 | khiter_t __pos = kh_put(off, h, key, &rval); \ | |
43 | if (rval >= 0) { \ | |
44 | if (rval == 0) kh_key(h, __pos) = key; \ | |
45 | kh_val(h, __pos) = val; \ | |
46 | } } while (0) | |
47 | ||
48 | #define git_offmap_insert2(h, key, val, oldv, rval) do { \ | |
49 | khiter_t __pos = kh_put(off, h, key, &rval); \ | |
50 | if (rval >= 0) { \ | |
51 | if (rval == 0) { \ | |
52 | oldv = kh_val(h, __pos); \ | |
53 | kh_key(h, __pos) = key; \ | |
54 | } else { oldv = NULL; } \ | |
55 | kh_val(h, __pos) = val; \ | |
56 | } } while (0) | |
57 | ||
58 | #define git_offmap_delete(h, key) do { \ | |
59 | khiter_t __pos = git_offmap_lookup_index(h, key); \ | |
60 | if (git_offmap_valid_index(h, __pos)) \ | |
61 | git_offmap_delete_at(h, __pos); } while (0) | |
62 | ||
63 | #define git_offmap_foreach kh_foreach | |
64 | #define git_offmap_foreach_value kh_foreach_value | |
65 | ||
66 | #endif |