oidmap.hon commit Merge remote-tracking branch 'git-po/maint' (adf9927)
   1#ifndef OIDMAP_H
   2#define OIDMAP_H
   3
   4#include "hashmap.h"
   5
   6/*
   7 * struct oidmap_entry is a structure representing an entry in the hash table,
   8 * which must be used as first member of user data structures.
   9 *
  10 * Users should set the oid field. oidmap_put() will populate the
  11 * internal_entry field.
  12 */
  13struct oidmap_entry {
  14        /* For internal use only */
  15        struct hashmap_entry internal_entry;
  16
  17        struct object_id oid;
  18};
  19
  20struct oidmap {
  21        struct hashmap map;
  22};
  23
  24#define OIDMAP_INIT { { NULL } }
  25
  26/*
  27 * Initializes an oidmap structure.
  28 *
  29 * `map` is the oidmap to initialize.
  30 *
  31 * If the total number of entries is known in advance, the `initial_size`
  32 * parameter may be used to preallocate a sufficiently large table and thus
  33 * prevent expensive resizing. If 0, the table is dynamically resized.
  34 */
  35extern void oidmap_init(struct oidmap *map, size_t initial_size);
  36
  37/*
  38 * Frees an oidmap structure and allocated memory.
  39 *
  40 * If `free_entries` is true, each oidmap_entry in the map is freed as well
  41 * using stdlibs free().
  42 */
  43extern void oidmap_free(struct oidmap *map, int free_entries);
  44
  45/*
  46 * Returns the oidmap entry for the specified oid, or NULL if not found.
  47 */
  48extern void *oidmap_get(const struct oidmap *map,
  49                        const struct object_id *key);
  50
  51/*
  52 * Adds or replaces an oidmap entry.
  53 *
  54 * ((struct oidmap_entry *) entry)->internal_entry will be populated by this
  55 * function.
  56 *
  57 * Returns the replaced entry, or NULL if not found (i.e. the entry was added).
  58 */
  59extern void *oidmap_put(struct oidmap *map, void *entry);
  60
  61/*
  62 * Removes an oidmap entry matching the specified oid.
  63 *
  64 * Returns the removed entry, or NULL if not found.
  65 */
  66extern void *oidmap_remove(struct oidmap *map, const struct object_id *key);
  67
  68
  69struct oidmap_iter {
  70        struct hashmap_iter h_iter;
  71};
  72
  73static inline void oidmap_iter_init(struct oidmap *map, struct oidmap_iter *iter)
  74{
  75        hashmap_iter_init(&map->map, &iter->h_iter);
  76}
  77
  78static inline void *oidmap_iter_next(struct oidmap_iter *iter)
  79{
  80        return hashmap_iter_next(&iter->h_iter);
  81}
  82
  83static inline void *oidmap_iter_first(struct oidmap *map,
  84                                      struct oidmap_iter *iter)
  85{
  86        oidmap_iter_init(map, iter);
  87        return oidmap_iter_next(iter);
  88}
  89
  90#endif