1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
| | #include "cache.h"
#include "oidmap.h"
static int oidmap_neq(const void *hashmap_cmp_fn_data,
const struct hashmap_entry *e1,
const struct hashmap_entry *e2,
const void *keydata)
{
const struct oidmap_entry *a, *b;
a = container_of(e1, const struct oidmap_entry, internal_entry);
b = container_of(e2, const struct oidmap_entry, internal_entry);
if (keydata)
return !oideq(&a->oid, (const struct object_id *) keydata);
return !oideq(&a->oid, &b->oid);
}
void oidmap_init(struct oidmap *map, size_t initial_size)
{
hashmap_init(&map->map, oidmap_neq, NULL, initial_size);
}
void oidmap_free(struct oidmap *map, int free_entries)
{
if (!map)
return;
if (free_entries)
hashmap_free_entries(
&map->map, struct oidmap_entry, internal_entry);
else
hashmap_free(&map->map);
}
struct oidmap_entry *oidmap_get(const struct oidmap *map,
const struct object_id *key)
{
if (!map->map.cmpfn)
return NULL;
return oidmap_entry_from_hashmap_entry(
hashmap_get_from_hash(&map->map, oidhash(key), key));
}
struct oidmap_entry *oidmap_remove(struct oidmap *map,
const struct object_id *key)
{
struct hashmap_entry entry;
if (!map->map.cmpfn)
oidmap_init(map, 0);
hashmap_entry_init(&entry, oidhash(key));
return oidmap_entry_from_hashmap_entry(
hashmap_remove(&map->map, &entry, key));
}
struct oidmap_entry *oidmap_put(struct oidmap *map, struct oidmap_entry *entry)
{
if (!map->map.cmpfn)
oidmap_init(map, 0);
hashmap_entry_init(&entry->internal_entry, oidhash(&entry->oid));
return oidmap_entry_from_hashmap_entry(
hashmap_put(&map->map, &entry->internal_entry));
}
|