Freeciv21
Develop your civilization from humble roots to a global empire
genhash.h
Go to the documentation of this file.
1 /**************************************************************************
2  Copyright (c) 1996-2020 Freeciv21 and Freeciv contributors. This file is
3  __ __ part of Freeciv21. Freeciv21 is free software: you can
4 / \\..// \ redistribute it and/or modify it under the terms of the GNU
5  ( oo ) General Public License as published by the Free Software
6  \__/ Foundation, either version 3 of the License, or (at your
7  option) any later version. You should have received
8  a copy of the GNU General Public License along with Freeciv21. If not,
9  see https://www.gnu.org/licenses/.
10 **************************************************************************/
11 #pragma once
12 
13 /****************************************************************************
14  A general-purpose generic hash table implementation.
15  See comments in "genhash.c".
16 ****************************************************************************/
17 
18 // utility
19 #include "iterator.h"
20 #include "support.h" // bool type
21 
22 #include <stddef.h>
23 
24 struct genhash; // opaque
25 
26 // Hash value type.
27 typedef unsigned int genhash_val_t;
28 
29 // Function typedefs:
30 typedef genhash_val_t (*genhash_val_fn_t)(const void *);
31 typedef bool (*genhash_comp_fn_t)(const void *, const void *);
32 typedef void *(*genhash_copy_fn_t)(const void *);
33 typedef void (*genhash_free_fn_t)(void *);
34 
35 /* Supplied functions (matching above typedefs) appropriate for
36  * keys being normal nul-terminated strings: */
37 genhash_val_t genhash_str_val_func(const char *vkey);
38 bool genhash_str_comp_func(const char *vkey1, const char *vkey2);
39 // and malloc'ed strings:
40 char *genhash_str_copy_func(const char *vkey);
41 void genhash_str_free_func(char *vkey);
42 
43 // General functions:
44 struct genhash *
54  size_t nentries) fc__warn_unused_result;
59  size_t nentries) fc__warn_unused_result;
60 void genhash_destroy(struct genhash *pgenhash);
61 
62 bool genhash_set_no_shrink(struct genhash *pgenhash, bool no_shrink);
63 size_t genhash_size(const struct genhash *pgenhash);
64 size_t genhash_capacity(const struct genhash *pgenhash);
65 
66 struct genhash *
67 genhash_copy(const struct genhash *pgenhash) fc__warn_unused_result;
68 void genhash_clear(struct genhash *pgenhash);
69 
70 bool genhash_insert(struct genhash *pgenhash, const void *key,
71  const void *data);
72 bool genhash_replace(struct genhash *pgenhash, const void *key,
73  const void *data);
74 bool genhash_replace_full(struct genhash *pgenhash, const void *key,
75  const void *data, void **old_pkey,
76  void **old_pdata);
77 
78 bool genhash_lookup(const struct genhash *pgenhash, const void *key,
79  void **pdata);
80 
81 bool genhash_remove(struct genhash *pgenhash, const void *key);
82 bool genhash_remove_full(struct genhash *pgenhash, const void *key,
83  void **deleted_pkey, void **deleted_pdata);
84 
85 bool genhashs_are_equal(const struct genhash *pgenhash1,
86  const struct genhash *pgenhash2);
87 bool genhashs_are_equal_full(const struct genhash *pgenhash1,
88  const struct genhash *pgenhash2,
89  genhash_comp_fn_t data_comp_func);
90 
91 // Iteration.
92 struct genhash_iter;
93 size_t genhash_iter_sizeof();
94 
95 struct iterator *genhash_key_iter_init(struct genhash_iter *iter,
96  const struct genhash *hash);
97 #define genhash_keys_iterate(ARG_ht, NAME_key) \
98  generic_iterate(struct genhash_iter, const void *, NAME_key, \
99  genhash_iter_sizeof, genhash_key_iter_init, (ARG_ht))
100 #define genhash_keys_iterate_end generic_iterate_end
101 
102 struct iterator *genhash_value_iter_init(struct genhash_iter *iter,
103  const struct genhash *hash);
104 #define genhash_values_iterate(ARG_ht, NAME_value) \
105  generic_iterate(struct genhash_iter, void *, NAME_value, \
106  genhash_iter_sizeof, genhash_value_iter_init, (ARG_ht))
107 #define genhash_values_iterate_end generic_iterate_end
108 
109 struct iterator *genhash_iter_init(struct genhash_iter *iter,
110  const struct genhash *hash);
111 void *genhash_iter_key(const struct iterator *genhash_iter);
112 void *genhash_iter_value(const struct iterator *genhash_iter);
113 #define genhash_iterate(ARG_ht, NAME_iter) \
114  generic_iterate(struct genhash_iter, struct iterator *, NAME_iter, \
115  genhash_iter_sizeof, genhash_iter_init, (ARG_ht))
116 #define genhash_iterate_end generic_iterate_end
struct genhash * genhash_copy(const struct genhash *pgenhash) fc__warn_unused_result
Returns a newly allocated mostly deep copy of the given genhash table.
Definition: genhash.cpp:537
genhash_val_t(* genhash_val_fn_t)(const void *)
Definition: genhash.h:30
struct iterator * genhash_key_iter_init(struct genhash_iter *iter, const struct genhash *hash)
Returns an iterator over the genhash table's k genhashgenhashenhashys.
Definition: genhash.cpp:889
size_t genhash_iter_sizeof()
"Sizeof" function implementation for generic_iterate genhash iterators.
Definition: genhash.cpp:787
bool genhashs_are_equal(const struct genhash *pgenhash1, const struct genhash *pgenhash2)
Returns TRUE iff the hash tables contains the same pairs of key/data.
Definition: genhash.cpp:734
bool genhash_insert(struct genhash *pgenhash, const void *key, const void *data)
Insert entry: returns TRUE if inserted, or FALSE if there was already an entry with the same key,...
Definition: genhash.cpp:597
void *(* genhash_copy_fn_t)(const void *)
Definition: genhash.h:32
bool genhash_str_comp_func(const char *vkey1, const char *vkey2)
A supplied function for comparison of nul-terminated strings:
Definition: genhash.cpp:119
bool genhashs_are_equal_full(const struct genhash *pgenhash1, const struct genhash *pgenhash2, genhash_comp_fn_t data_comp_func)
Returns TRUE iff the hash tables contains the same pairs of key/data.
Definition: genhash.cpp:743
bool genhash_set_no_shrink(struct genhash *pgenhash, bool no_shrink)
Prevent or allow the genhash table automatically shrinking.
Definition: genhash.cpp:506
size_t genhash_size(const struct genhash *pgenhash)
Returns the number of entries in the genhash table.
Definition: genhash.cpp:519
void genhash_destroy(struct genhash *pgenhash)
Destructor: free internal memory.
Definition: genhash.cpp:284
size_t genhash_capacity(const struct genhash *pgenhash)
Returns the number of buckets in the genhash table.
Definition: genhash.cpp:528
void genhash_clear(struct genhash *pgenhash)
Remove all entries of the genhash table.
Definition: genhash.cpp:575
bool(* genhash_comp_fn_t)(const void *, const void *)
Definition: genhash.h:31
struct genhash * genhash_new_nentries_full(genhash_val_fn_t key_val_func, genhash_comp_fn_t key_comp_func, genhash_copy_fn_t key_copy_func, genhash_free_fn_t key_free_func, genhash_copy_fn_t data_copy_func, genhash_free_fn_t data_free_func, size_t nentries) fc__warn_unused_result
Constructor specifying number of entries.
Definition: genhash.cpp:228
struct genhash * genhash_new_nentries(genhash_val_fn_t key_val_func, genhash_comp_fn_t key_comp_func, size_t nentries) fc__warn_unused_result
Constructor specifying number of entries.
Definition: genhash.cpp:244
void(* genhash_free_fn_t)(void *)
Definition: genhash.h:33
struct genhash * genhash_new_full(genhash_val_fn_t key_val_func, genhash_comp_fn_t key_comp_func, genhash_copy_fn_t key_copy_func, genhash_free_fn_t key_free_func, genhash_copy_fn_t data_copy_func, genhash_free_fn_t data_free_func) fc__warn_unused_result
Constructor with unspecified number of entries.
Definition: genhash.cpp:259
bool genhash_lookup(const struct genhash *pgenhash, const void *key, void **pdata)
Lookup data.
Definition: genhash.cpp:675
struct genhash * genhash_new(genhash_val_fn_t key_val_func, genhash_comp_fn_t key_comp_func) fc__warn_unused_result
Constructor with unspecified number of entries.
Definition: genhash.cpp:274
void * genhash_iter_key(const struct iterator *genhash_iter)
Helper function for genhash (key, value) pair iteration.
Definition: genhash.cpp:792
bool genhash_remove(struct genhash *pgenhash, const void *key)
Delete an entry from the genhash table.
Definition: genhash.cpp:696
bool genhash_replace_full(struct genhash *pgenhash, const void *key, const void *data, void **old_pkey, void **old_pdata)
Insert entry, replacing any existing entry which has the same key.
Definition: genhash.cpp:640
char * genhash_str_copy_func(const char *vkey)
Copy function for string allocation.
Definition: genhash.cpp:127
struct iterator * genhash_iter_init(struct genhash_iter *iter, const struct genhash *hash)
Returns an iterator that iterates over both keys and values of the genhash table.
Definition: genhash.cpp:880
void * genhash_iter_value(const struct iterator *genhash_iter)
Helper function for genhash (key, value) pair iteration.
Definition: genhash.cpp:801
void genhash_str_free_func(char *vkey)
Free function for string allocation.
Definition: genhash.cpp:135
bool genhash_replace(struct genhash *pgenhash, const void *key, const void *data)
Insert entry, replacing any existing entry which has the same key.
Definition: genhash.cpp:625
genhash_val_t genhash_str_val_func(const char *vkey)
A supplied genhash function appropriate to nul-terminated strings.
Definition: genhash.cpp:104
unsigned int genhash_val_t
Definition: genhash.h:24
bool genhash_remove_full(struct genhash *pgenhash, const void *key, void **deleted_pkey, void **deleted_pdata)
Delete an entry from the genhash table.
Definition: genhash.cpp:708
struct iterator * genhash_value_iter_init(struct genhash_iter *iter, const struct genhash *hash)
Returns an iterator over the hash table's values.
Definition: genhash.cpp:898
genhash_comp_fn_t key_comp_func
Definition: genhash.cpp:82
genhash_val_fn_t key_val_func
Definition: genhash.cpp:81
genhash_free_fn_t key_free_func
Definition: genhash.cpp:84
bool no_shrink
Definition: genhash.cpp:89
genhash_copy_fn_t data_copy_func
Definition: genhash.cpp:85
genhash_free_fn_t data_free_func
Definition: genhash.cpp:86
genhash_copy_fn_t key_copy_func
Definition: genhash.cpp:83
#define fc__warn_unused_result
Definition: support.h:41