f4609b896f
This also bumps the stable nixpkgs to 20.09 as of 2020-11-21, because there is some breakage in the git build related to the netrc credentials helper which someone has taken care of in nixpkgs. The stable channel is not used for anything other than git, so this should be fine. Change-Id: I3575a19dab09e1e9556cf8231d717de9890484fb
93 lines
2.3 KiB
C
93 lines
2.3 KiB
C
#ifndef OIDMAP_H
|
|
#define OIDMAP_H
|
|
|
|
#include "cache.h"
|
|
#include "hashmap.h"
|
|
|
|
/*
|
|
* struct oidmap_entry is a structure representing an entry in the hash table,
|
|
* which must be used as first member of user data structures.
|
|
*
|
|
* Users should set the oid field. oidmap_put() will populate the
|
|
* internal_entry field.
|
|
*/
|
|
struct oidmap_entry {
|
|
/* For internal use only */
|
|
struct hashmap_entry internal_entry;
|
|
|
|
struct object_id oid;
|
|
};
|
|
|
|
struct oidmap {
|
|
struct hashmap map;
|
|
};
|
|
|
|
#define OIDMAP_INIT { { NULL } }
|
|
|
|
/*
|
|
* Initializes an oidmap structure.
|
|
*
|
|
* `map` is the oidmap to initialize.
|
|
*
|
|
* If the total number of entries is known in advance, the `initial_size`
|
|
* parameter may be used to preallocate a sufficiently large table and thus
|
|
* prevent expensive resizing. If 0, the table is dynamically resized.
|
|
*/
|
|
void oidmap_init(struct oidmap *map, size_t initial_size);
|
|
|
|
/*
|
|
* Frees an oidmap structure and allocated memory.
|
|
*
|
|
* If `free_entries` is true, each oidmap_entry in the map is freed as well
|
|
* using stdlibs free().
|
|
*/
|
|
void oidmap_free(struct oidmap *map, int free_entries);
|
|
|
|
/*
|
|
* Returns the oidmap entry for the specified oid, or NULL if not found.
|
|
*/
|
|
void *oidmap_get(const struct oidmap *map,
|
|
const struct object_id *key);
|
|
|
|
/*
|
|
* Adds or replaces an oidmap entry.
|
|
*
|
|
* ((struct oidmap_entry *) entry)->internal_entry will be populated by this
|
|
* function.
|
|
*
|
|
* Returns the replaced entry, or NULL if not found (i.e. the entry was added).
|
|
*/
|
|
void *oidmap_put(struct oidmap *map, void *entry);
|
|
|
|
/*
|
|
* Removes an oidmap entry matching the specified oid.
|
|
*
|
|
* Returns the removed entry, or NULL if not found.
|
|
*/
|
|
void *oidmap_remove(struct oidmap *map, const struct object_id *key);
|
|
|
|
|
|
struct oidmap_iter {
|
|
struct hashmap_iter h_iter;
|
|
};
|
|
|
|
static inline void oidmap_iter_init(struct oidmap *map, struct oidmap_iter *iter)
|
|
{
|
|
hashmap_iter_init(&map->map, &iter->h_iter);
|
|
}
|
|
|
|
static inline void *oidmap_iter_next(struct oidmap_iter *iter)
|
|
{
|
|
/* TODO: this API could be reworked to do compile-time type checks */
|
|
return (void *)hashmap_iter_next(&iter->h_iter);
|
|
}
|
|
|
|
static inline void *oidmap_iter_first(struct oidmap *map,
|
|
struct oidmap_iter *iter)
|
|
{
|
|
oidmap_iter_init(map, iter);
|
|
/* TODO: this API could be reworked to do compile-time type checks */
|
|
return (void *)oidmap_iter_next(iter);
|
|
}
|
|
|
|
#endif
|