webperimental: killstack decides stack protects.
[freeciv.git] / utility / genhash.h
blob640510bca9c1e454fbb6630b131123c708a594e1
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.
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
16 #ifdef __cplusplus
17 extern "C" {
18 #endif /* __cplusplus */
20 /****************************************************************************
21 A general-purpose generic hash table implementation.
22 See comments in "genhash.c".
23 ****************************************************************************/
25 /* utility */
26 #include "iterator.h"
27 #include "support.h" /* bool type */
29 struct genhash; /* opaque */
31 /* Hash value type. */
32 typedef unsigned int genhash_val_t;
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 *);
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);
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);
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);
80 struct genhash *genhash_copy(const struct genhash *pgenhash)
81 fc__warn_unused_result;
82 void genhash_clear(struct genhash *pgenhash);
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);
92 bool genhash_lookup(const struct genhash *pgenhash, const void *key,
93 void **pdata);
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);
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);
106 /* Iteration. */
107 struct genhash_iter;
108 size_t genhash_iter_sizeof(void);
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
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
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
133 #ifdef __cplusplus
135 #endif /* __cplusplus */
137 #endif /* FC__GENHASH_H */