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)
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 ***********************************************************************/
18 #endif /* __cplusplus */
20 /****************************************************************************
21 A general-purpose generic hash table implementation.
22 See comments in "genhash.c".
23 ****************************************************************************/
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
,
64 fc__warn_unused_result
;
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
,
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
,
86 bool genhash_replace(struct genhash
*pgenhash
, const void *key
,
88 bool genhash_replace_full(struct genhash
*pgenhash
, const void *key
,
89 const void *data
, void **old_pkey
,
92 bool genhash_lookup(const struct genhash
*pgenhash
, const void *key
,
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
);
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
135 #endif /* __cplusplus */
137 #endif /* FC__GENHASH_H */