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