1 /********************************************************************** 2 Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold 3 This program is free software; you can redistribute it and/or modify 4 it under the terms of the GNU General Public License as published by 5 the Free Software Foundation; either version 2, or (at your option) 6 any later version. 7 8 This program is distributed in the hope that it will be useful, 9 but WITHOUT ANY WARRANTY; without even the implied warranty of 10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 GNU General Public License for more details. 12 ***********************************************************************/ 13 #ifndef FC__GENHASH_H 14 #define FC__GENHASH_H 15 16 #ifdef __cplusplus 17 extern "C" { 18 #endif /* __cplusplus */ 19 20 /**************************************************************************** 21 A general-purpose generic hash table implementation. 22 See comments in "genhash.c". 23 ****************************************************************************/ 24 25 /* utility */ 26 #include "iterator.h" 27 #include "support.h" /* bool type */ 28 29 struct genhash; /* opaque */ 30 31 /* Hash value type. */ 32 typedef unsigned int genhash_val_t; 33 34 /* Function typedefs: */ 35 typedef genhash_val_t (*genhash_val_fn_t) (const void *); 36 typedef bool (*genhash_comp_fn_t) (const void *, const void *); 37 typedef void * (*genhash_copy_fn_t) (const void *); 38 typedef void (*genhash_free_fn_t) (void *); 39 40 41 /* Supplied functions (matching above typedefs) appropriate for 42 * keys being normal nul-terminated strings: */ 43 genhash_val_t genhash_str_val_func(const char *vkey); 44 bool genhash_str_comp_func(const char *vkey1, const char *vkey2); 45 /* and malloc'ed strings: */ 46 char *genhash_str_copy_func(const char *vkey); 47 void genhash_str_free_func(char *vkey); 48 49 50 /* General functions: */ 51 struct genhash *genhash_new(genhash_val_fn_t key_val_func, 52 genhash_comp_fn_t key_comp_func) 53 fc__warn_unused_result; 54 struct genhash *genhash_new_full(genhash_val_fn_t key_val_func, 55 genhash_comp_fn_t key_comp_func, 56 genhash_copy_fn_t key_copy_func, 57 genhash_free_fn_t key_free_func, 58 genhash_copy_fn_t data_copy_func, 59 genhash_free_fn_t data_free_func) 60 fc__warn_unused_result; 61 struct genhash *genhash_new_nentries(genhash_val_fn_t key_val_func, 62 genhash_comp_fn_t key_comp_func, 63 size_t nentries) 64 fc__warn_unused_result; 65 struct genhash * 66 genhash_new_nentries_full(genhash_val_fn_t key_val_func, 67 genhash_comp_fn_t key_comp_func, 68 genhash_copy_fn_t key_copy_func, 69 genhash_free_fn_t key_free_func, 70 genhash_copy_fn_t data_copy_func, 71 genhash_free_fn_t data_free_func, 72 size_t nentries) 73 fc__warn_unused_result; 74 void genhash_destroy(struct genhash *pgenhash); 75 76 bool genhash_set_no_shrink(struct genhash *pgenhash, bool no_shrink); 77 size_t genhash_size(const struct genhash *pgenhash); 78 size_t genhash_capacity(const struct genhash *pgenhash); 79 80 struct genhash *genhash_copy(const struct genhash *pgenhash) 81 fc__warn_unused_result; 82 void genhash_clear(struct genhash *pgenhash); 83 84 bool genhash_insert(struct genhash *pgenhash, const void *key, 85 const void *data); 86 bool genhash_replace(struct genhash *pgenhash, const void *key, 87 const void *data); 88 bool genhash_replace_full(struct genhash *pgenhash, const void *key, 89 const void *data, void **old_pkey, 90 void **old_pdata); 91 92 bool genhash_lookup(const struct genhash *pgenhash, const void *key, 93 void **pdata); 94 95 bool genhash_remove(struct genhash *pgenhash, const void *key); 96 bool genhash_remove_full(struct genhash *pgenhash, const void *key, 97 void **deleted_pkey, void **deleted_pdata); 98 99 bool genhashs_are_equal(const struct genhash *pgenhash1, 100 const struct genhash *pgenhash2); 101 bool genhashs_are_equal_full(const struct genhash *pgenhash1, 102 const struct genhash *pgenhash2, 103 genhash_comp_fn_t data_comp_func); 104 105 106 /* Iteration. */ 107 struct genhash_iter; 108 size_t genhash_iter_sizeof(void); 109 110 struct iterator *genhash_key_iter_init(struct genhash_iter *iter, 111 const struct genhash *hash); 112 #define genhash_keys_iterate(ARG_ht, NAME_key) \ 113 generic_iterate(struct genhash_iter, const void *, NAME_key, \ 114 genhash_iter_sizeof, genhash_key_iter_init, (ARG_ht)) 115 #define genhash_keys_iterate_end generic_iterate_end 116 117 struct iterator *genhash_value_iter_init(struct genhash_iter *iter, 118 const struct genhash *hash); 119 #define genhash_values_iterate(ARG_ht, NAME_value) \ 120 generic_iterate(struct genhash_iter, void *, NAME_value, \ 121 genhash_iter_sizeof, genhash_value_iter_init, (ARG_ht)) 122 #define genhash_values_iterate_end generic_iterate_end 123 124 struct iterator *genhash_iter_init(struct genhash_iter *iter, 125 const struct genhash *hash); 126 void *genhash_iter_key(const struct iterator *genhash_iter); 127 void *genhash_iter_value(const struct iterator *genhash_iter); 128 #define genhash_iterate(ARG_ht, NAME_iter) \ 129 generic_iterate(struct genhash_iter, struct iterator *, NAME_iter, \ 130 genhash_iter_sizeof, genhash_iter_init, (ARG_ht)) 131 #define genhash_iterate_end generic_iterate_end 132 133 #ifdef __cplusplus 134 } 135 #endif /* __cplusplus */ 136 137 #endif /* FC__GENHASH_H */ 138