Nilorea Library
C utilities for networking, threading, graphics
Loading...
Searching...
No Matches
ex_hash.c
Go to the documentation of this file.
1
9#include "nilorea/n_str.h"
10#include "nilorea/n_log.h"
11#include "nilorea/n_list.h"
12#include "nilorea/n_hash.h"
13
14#define NB_HASH_ELEMENTS 24
15
17typedef struct DATA {
21 int value;
22} DATA;
23
28void destroy_data(void* ptr) {
29 DATA* data = (DATA*)ptr;
30 free_nstr(&data->rnd_str);
31 Free(data);
32}
33
34int main(void) {
36
37 HASH_TABLE* htable = new_ht(NB_HASH_ELEMENTS / 3);
38 LIST* keys_list = new_generic_list(NB_HASH_ELEMENTS + 1);
39 DATA* data = NULL;
40 char* str = NULL;
41
42 n_log(LOG_INFO, "Filling HashTable with %d random elements", NB_HASH_ELEMENTS);
43 for (int it = 0; it < NB_HASH_ELEMENTS; it++) {
44 N_STR* nkey = NULL;
45 int randomizator = rand() % 4;
46 nstrprintf(nkey, "key%d_%d", it, randomizator);
47 switch (randomizator) {
48 default:
49 case 0:
50 ht_put_int(htable, _nstr(nkey), 666);
51 n_log(LOG_INFO, "Put int 666 with key %s", _nstr(nkey));
52 break;
53 case 1:
54 ht_put_double(htable, _nstr(nkey), 3.14);
55 n_log(LOG_INFO, "Put double 3.14 with key %s", _nstr(nkey));
56 break;
57 case 2:
58 Malloc(data, DATA, 1);
59 data->rnd_str = NULL;
60 nstrprintf(data->rnd_str, "%s%d", _nstr(nkey), rand() % 10);
61 data->value = 7;
62 ht_put_ptr(htable, _nstr(nkey), data, &destroy_data);
63 n_log(LOG_INFO, "Put ptr rnd_str %s value %d with key %s", _nstr(data->rnd_str), data->value, _nstr(nkey));
64 break;
65 case 3:
66 Malloc(str, char, 64);
67 snprintf(str, 64, "%s%d", _nstr(nkey), rand() % 10);
68 ht_put_string(htable, _nstr(nkey), str);
69 n_log(LOG_INFO, "Put string %s key %s", str, _nstr(nkey));
70 Free(str);
71 break;
72 }
73 /* asving key for ulterior use */
74 list_push(keys_list, nkey, free_nstr_ptr);
75 }
76
77 n_log(LOG_INFO, "Reading hash table with ht_foreach");
78 HT_FOREACH(node, htable,
79 {
80 n_log(LOG_INFO, "HT_FOREACH hash: %u, key:%s", node->hash_value, _str(node->key));
81 });
82 HT_FOREACH_R(node, htable, hash_iterator,
83 {
84 n_log(LOG_INFO, "HT_FOREACH_R hash: %u, key:%s", node->hash_value, _str(node->key));
85 });
86
87 unsigned long int optimal_size = ht_get_optimal_size(htable);
88 n_log(LOG_INFO, "########");
89 n_log(LOG_INFO, "collisions: %d %%", ht_get_table_collision_percentage(htable));
90 n_log(LOG_INFO, "table size: %ld , table optimal size: %ld", htable->size, optimal_size);
91 n_log(LOG_INFO, "resizing to %ld returned %d", optimal_size, ht_resize(&htable, optimal_size));
92 n_log(LOG_INFO, "collisions after resize: %d %%", ht_get_table_collision_percentage(htable));
93 n_log(LOG_INFO, "########");
94
95 if (ht_optimize(&htable) == FALSE) {
96 n_log(LOG_ERR, "Error when optimizing table %p", htable);
97 }
98 n_log(LOG_INFO, "collisions after ht_optimize: %d %%", ht_get_table_collision_percentage(htable));
99 n_log(LOG_INFO, "########");
100
101 LIST* results = ht_get_completion_list(htable, "key", NB_HASH_ELEMENTS);
102 if (results) {
103 list_foreach(node, results) {
104 n_log(LOG_INFO, "completion result: %s", (char*)node->ptr);
105 }
106 list_destroy(&results);
107 }
108
109 int matching_nodes(HASH_NODE * node) {
110 if (strncasecmp("key", node->key, 3) == 0)
111 return TRUE;
112 return FALSE;
113 }
114 results = ht_search(htable, &matching_nodes);
115 list_foreach(node, results) {
116 n_log(LOG_INFO, "htsearch: key: %s", (char*)node->ptr);
117 }
118 list_destroy(&results);
119
120 list_destroy(&keys_list);
121 destroy_ht(&htable);
122
123 /* testing empty destroy */
124 htable = new_ht(1024);
125 empty_ht(htable);
126 destroy_ht(&htable);
127
128 htable = new_ht_trie(256, 32);
129
130 ht_put_int(htable, "TestInt", 1);
131 ht_put_double(htable, "TestDouble", 2.0);
132 ht_put_string(htable, "TestString", "MyString");
133 HASH_INT_TYPE ival = -1;
134 double fval = -1.0;
135 ht_get_int(htable, "TestInt", &ival);
136 ht_get_double(htable, "TestDouble", &fval);
137 char* string = NULL;
138 ht_get_string(htable, "TestString", &string);
139 n_log(LOG_INFO, "Trie:%ld %f %s", (long)ival, fval, string);
140
141 results = ht_get_completion_list(htable, "Test", 10);
142 if (results) {
143 list_foreach(node, results) {
144 n_log(LOG_INFO, "completion result: %s", (char*)node->ptr);
145 }
146 list_destroy(&results);
147 }
148
149 destroy_ht(&htable);
150
151 exit(0);
152
153} /* END_OF_MAIN */
int main(void)
int value
int value
Definition ex_hash.c:21
void destroy_data(void *ptr)
destroy a DATA struct
Definition ex_hash.c:28
#define NB_HASH_ELEMENTS
Definition ex_hash.c:14
N_STR * rnd_str
string holder
Definition ex_hash.c:19
string and int holder
Definition ex_hash.c:17
#define Malloc(__ptr, __struct, __size)
Malloc Handler to get errors and set to 0.
Definition n_common.h:185
#define _str(__PTR)
define true
Definition n_common.h:174
#define Free(__ptr)
Free Handler to get errors.
Definition n_common.h:240
#define _nstr(__PTR)
N_STR or "NULL" string for logging purposes.
Definition n_common.h:180
char * key
string key of the node if any, else NULL
Definition n_hash.h:95
size_t size
size of the hash table
Definition n_hash.h:119
LIST * ht_search(HASH_TABLE *table, int(*node_is_matching)(HASH_NODE *node))
seach table for matching nodes
Definition n_hash.c:2128
int destroy_ht(HASH_TABLE **table)
empty a table and destroy it
Definition n_hash.c:2148
#define HT_FOREACH_R(__ITEM_, __HASH_, __ITERATOR,...)
ForEach macro helper.
Definition n_hash.h:241
HASH_TABLE * new_ht(size_t size)
Create a hash table with the given size.
Definition n_hash.c:1916
int ht_get_table_collision_percentage(HASH_TABLE *table)
get table collision percentage (HASH_CLASSIC mode only)
Definition n_hash.c:2388
int ht_get_double(HASH_TABLE *table, const char *key, double *val)
get double at 'key' from 'table'
Definition n_hash.c:1989
int empty_ht(HASH_TABLE *table)
empty a table
Definition n_hash.c:2138
LIST * ht_get_completion_list(HASH_TABLE *table, const char *keybud, size_t max_results)
get next matching keys in table tree
Definition n_hash.c:2303
int ht_put_double(HASH_TABLE *table, const char *key, double value)
put a double value with given key in the targeted hash table
Definition n_hash.c:2041
size_t ht_get_optimal_size(HASH_TABLE *table)
get optimal array size based on nb=(number_of_key*1.3) && if( !isprime(nb) )nb=nextprime(nb) (HASH_CL...
Definition n_hash.c:2410
int ht_get_string(HASH_TABLE *table, const char *key, char **val)
get string at 'key' from 'table'
Definition n_hash.c:2028
#define HASH_INT_TYPE
type of a HASH_INT in 64 bits
Definition n_hash.h:74
int ht_put_string(HASH_TABLE *table, const char *key, char *string)
put a string value (copy/dup) with given key in the targeted hash table
Definition n_hash.c:2081
int ht_resize(HASH_TABLE **table, size_t size)
rehash table according to size (HASH_CLASSIC mode only)
Definition n_hash.c:2425
int ht_get_int(HASH_TABLE *table, const char *key, int64_t *val)
get node at 'key' from 'table'
Definition n_hash.c:2002
HASH_TABLE * new_ht_trie(size_t alphabet_length, size_t alphabet_offset)
create a TRIE hash table with the alphabet_size, each key value beeing decreased by alphabet_offset
Definition n_hash.c:1870
int ht_put_ptr(HASH_TABLE *table, const char *key, void *ptr, void(*destructor)(void *ptr))
put a pointer to the string value with given key in the targeted hash table
Definition n_hash.c:2068
int ht_put_int(HASH_TABLE *table, const char *key, int64_t value)
put an integral value with given key in the targeted hash table
Definition n_hash.c:2054
int ht_optimize(HASH_TABLE **table)
try an automatic optimization of the table
Definition n_hash.c:2500
#define HT_FOREACH(__ITEM_, __HASH_,...)
ForEach macro helper.
Definition n_hash.h:195
structure of a hash table node
Definition n_hash.h:93
structure of a hash table
Definition n_hash.h:117
int list_push(LIST *list, void *ptr, void(*destructor)(void *ptr))
Add a pointer to the end of the list.
Definition n_list.c:200
#define list_foreach(__ITEM_, __LIST_)
ForEach macro helper.
Definition n_list.h:66
int list_destroy(LIST **list)
Empty and Free a list container.
Definition n_list.c:519
LIST * new_generic_list(size_t max_items)
Initialiaze a generic list container to max_items pointers.
Definition n_list.c:19
Structure of a generic LIST container.
Definition n_list.h:40
#define n_log(__LEVEL__,...)
Logging function wrapper to get line and func.
Definition n_log.h:70
#define LOG_DEBUG
debug-level messages
Definition n_log.h:65
#define LOG_ERR
error conditions
Definition n_log.h:57
void set_log_level(const int log_level)
Set the global log level value ( static int LOG_LEVEL )
Definition n_log.c:104
#define LOG_INFO
informational
Definition n_log.h:63
void free_nstr_ptr(void *ptr)
Free a N_STR pointer structure.
Definition n_str.c:49
#define free_nstr(__ptr)
free a N_STR structure and set the pointer to NULL
Definition n_str.h:176
#define nstrprintf(__nstr_var, __format,...)
Macro to quickly allocate and sprintf to N_STR.
Definition n_str.h:94
A box including a string and his lenght.
Definition n_str.h:39
Hash functions and table.
List structures and definitions.
Generic log system.
N_STR and string function declaration.