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 */ 15struct hashmap_entry internal_entry; 16 17struct object_id oid; 18}; 19 20struct oidmap { 21struct 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 */ 35externvoidoidmap_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 */ 43externvoidoidmap_free(struct oidmap *map,int free_entries); 44 45/* 46 * Returns the oidmap entry for the specified oid, or NULL if not found. 47 */ 48externvoid*oidmap_get(const struct oidmap *map, 49const 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 */ 59externvoid*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 */ 66externvoid*oidmap_remove(struct oidmap *map,const struct object_id *key); 67 68 69struct oidmap_iter { 70struct hashmap_iter h_iter; 71}; 72 73staticinlinevoidoidmap_iter_init(struct oidmap *map,struct oidmap_iter *iter) 74{ 75hashmap_iter_init(&map->map, &iter->h_iter); 76} 77 78staticinlinevoid*oidmap_iter_next(struct oidmap_iter *iter) 79{ 80returnhashmap_iter_next(&iter->h_iter); 81} 82 83staticinlinevoid*oidmap_iter_first(struct oidmap *map, 84struct oidmap_iter *iter) 85{ 86oidmap_iter_init(map, iter); 87returnoidmap_iter_next(iter); 88} 89 90#endif