mirror of
https://github.com/git/git
synced 2024-08-28 12:09:19 +00:00
![Jonathan Tan](/assets/img/avatar_default.png)
This is similar to using the hashmap in hashmap.c, but with an easier-to-use API. In particular, custom entry comparisons no longer need to be written, and lookups can be done without constructing a temporary entry structure. This is implemented as a thin wrapper over the hashmap API. In particular, this means that there is an additional 4-byte overhead due to the fact that the first 4 bytes of the hash is redundantly stored. For now, I'm taking the simpler approach, but if need be, we can reimplement oidmap without affecting the callers significantly. oidset has been updated to use oidmap. Signed-off-by: Jonathan Tan <jonathantanmy@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
52 lines
1.2 KiB
C
52 lines
1.2 KiB
C
#include "cache.h"
|
|
#include "oidmap.h"
|
|
|
|
static int cmpfn(const void *hashmap_cmp_fn_data,
|
|
const void *entry, const void *entry_or_key,
|
|
const void *keydata)
|
|
{
|
|
const struct oidmap_entry *entry_ = entry;
|
|
if (keydata)
|
|
return oidcmp(&entry_->oid, (const struct object_id *) keydata);
|
|
return oidcmp(&entry_->oid,
|
|
&((const struct oidmap_entry *) entry_or_key)->oid);
|
|
}
|
|
|
|
static int hash(const struct object_id *oid)
|
|
{
|
|
int hash;
|
|
memcpy(&hash, oid->hash, sizeof(hash));
|
|
return hash;
|
|
}
|
|
|
|
void oidmap_init(struct oidmap *map, size_t initial_size)
|
|
{
|
|
hashmap_init(&map->map, cmpfn, NULL, initial_size);
|
|
}
|
|
|
|
void oidmap_free(struct oidmap *map, int free_entries)
|
|
{
|
|
if (!map)
|
|
return;
|
|
hashmap_free(&map->map, free_entries);
|
|
}
|
|
|
|
void *oidmap_get(const struct oidmap *map, const struct object_id *key)
|
|
{
|
|
return hashmap_get_from_hash(&map->map, hash(key), key);
|
|
}
|
|
|
|
void *oidmap_remove(struct oidmap *map, const struct object_id *key)
|
|
{
|
|
struct hashmap_entry entry;
|
|
hashmap_entry_init(&entry, hash(key));
|
|
return hashmap_remove(&map->map, &entry, key);
|
|
}
|
|
|
|
void *oidmap_put(struct oidmap *map, void *entry)
|
|
{
|
|
struct oidmap_entry *to_put = entry;
|
|
hashmap_entry_init(&to_put->internal_entry, hash(&to_put->oid));
|
|
return hashmap_put(&map->map, to_put);
|
|
}
|