Nilorea Library
C utilities for networking, threading, graphics
Loading...
Searching...
No Matches
ex_hash.c
1
7#include "nilorea/n_str.h"
8#include "nilorea/n_log.h"
9#include "nilorea/n_list.h"
10#include "nilorea/n_hash.h"
11
12#define NB_HASH_ELEMENTS 24
13
15typedef struct DATA {
19 int value;
20} DATA;
21
26void destroy_data(void* ptr) {
27 DATA* data = (DATA*)ptr;
28 free_nstr(&data->rnd_str);
29 Free(data);
30}
31
32int main(void) {
34
35 HASH_TABLE* htable = new_ht(NB_HASH_ELEMENTS / 3);
36 LIST* keys_list = new_generic_list(NB_HASH_ELEMENTS + 1);
37 DATA* data = NULL;
38 char* str = NULL;
39
40 n_log(LOG_INFO, "Filling HashTable with %d random elements", NB_HASH_ELEMENTS);
41 for (int it = 0; it < NB_HASH_ELEMENTS; it++) {
42 N_STR* nkey = NULL;
43 int randomizator = rand() % 4;
44 nstrprintf(nkey, "key%d_%d", it, randomizator);
45 switch (randomizator) {
46 default:
47 case 0:
48 ht_put_int(htable, _nstr(nkey), 666);
49 n_log(LOG_INFO, "Put int 666 with key %s", _nstr(nkey));
50 break;
51 case 1:
52 ht_put_double(htable, _nstr(nkey), 3.14);
53 n_log(LOG_INFO, "Put double 3.14 with key %s", _nstr(nkey));
54 break;
55 case 2:
56 Malloc(data, DATA, 1);
57 data->rnd_str = NULL;
58 nstrprintf(data->rnd_str, "%s%d", _nstr(nkey), rand() % 10);
59 data->value = 7;
60 ht_put_ptr(htable, _nstr(nkey), data, &destroy_data);
61 n_log(LOG_INFO, "Put ptr rnd_str %s value %d with key %s", _nstr(data->rnd_str), data->value, _nstr(nkey));
62 break;
63 case 3:
64 Malloc(str, char, 64);
65 snprintf(str, 64, "%s%d", _nstr(nkey), rand() % 10);
66 ht_put_string(htable, _nstr(nkey), str);
67 n_log(LOG_INFO, "Put string %s key %s", str, _nstr(nkey));
68 Free(str);
69 break;
70 }
71 /* asving key for ulterior use */
72 list_push(keys_list, nkey, free_nstr_ptr);
73 }
74
75 n_log(LOG_INFO, "Reading hash table with ht_foreach");
76 HT_FOREACH(node, htable,
77 {
78 n_log(LOG_INFO, "HT_FOREACH hash: %u, key:%s", node->hash_value, _str(node->key));
79 });
80 HT_FOREACH_R(node, htable, hash_iterator,
81 {
82 n_log(LOG_INFO, "HT_FOREACH_R hash: %u, key:%s", node->hash_value, _str(node->key));
83 });
84
85 unsigned long int optimal_size = ht_get_optimal_size(htable);
86 n_log(LOG_INFO, "########");
87 n_log(LOG_INFO, "collisions: %d %%", ht_get_table_collision_percentage(htable));
88 n_log(LOG_INFO, "table size: %ld , table optimal size: %ld", htable->size, optimal_size);
89 n_log(LOG_INFO, "resizing to %ld returned %d", optimal_size, ht_resize(&htable, optimal_size));
90 n_log(LOG_INFO, "collisions after resize: %d %%", ht_get_table_collision_percentage(htable));
91 n_log(LOG_INFO, "########");
92
93 if (ht_optimize(&htable) == FALSE) {
94 n_log(LOG_ERR, "Error when optimizing table %p", htable);
95 }
96 n_log(LOG_INFO, "collisions after ht_optimize: %d %%", ht_get_table_collision_percentage(htable));
97 n_log(LOG_INFO, "########");
98
99 LIST* results = ht_get_completion_list(htable, "key", NB_HASH_ELEMENTS);
100 if (results) {
101 list_foreach(node, results) {
102 n_log(LOG_INFO, "completion result: %s", (char*)node->ptr);
103 }
104 list_destroy(&results);
105 }
106
107 int matching_nodes(HASH_NODE * node) {
108 if (strncasecmp("key", node->key, 3) == 0)
109 return TRUE;
110 return FALSE;
111 }
112 results = ht_search(htable, &matching_nodes);
113 list_foreach(node, results) {
114 n_log(LOG_INFO, "htsearch: key: %s", (char*)node->ptr);
115 }
116 list_destroy(&results);
117
118 list_destroy(&keys_list);
119 destroy_ht(&htable);
120
121 /* testing empty destroy */
122 htable = new_ht(1024);
123 empty_ht(htable);
124 destroy_ht(&htable);
125
126 htable = new_ht_trie(256, 32);
127
128 ht_put_int(htable, "TestInt", 1);
129 ht_put_double(htable, "TestDouble", 2.0);
130 ht_put_string(htable, "TestString", "MyString");
131 HASH_INT_TYPE ival = -1;
132 double fval = -1.0;
133 ht_get_int(htable, "TestInt", &ival);
134 ht_get_double(htable, "TestDouble", &fval);
135 char* string = NULL;
136 ht_get_string(htable, "TestString", &string);
137 n_log(LOG_INFO, "Trie:%ld %f %s", (long)ival, fval, string);
138
139 results = ht_get_completion_list(htable, "Test", 10);
140 if (results) {
141 list_foreach(node, results) {
142 n_log(LOG_INFO, "completion result: %s", (char*)node->ptr);
143 }
144 list_destroy(&results);
145 }
146
147 destroy_ht(&htable);
148
149 exit(0);
150
151} /* END_OF_MAIN */
#define Malloc(__ptr, __struct, __size)
Malloc Handler to get errors and set to 0.
Definition n_common.h:187
#define _str(__PTR)
define true
Definition n_common.h:176
#define Free(__ptr)
Free Handler to get errors.
Definition n_common.h:242
#define _nstr(__PTR)
N_STR or "NULL" string for logging purposes.
Definition n_common.h:182
char * key
string key of the node if any, else NULL
Definition n_hash.h:92
size_t size
size of the hash table
Definition n_hash.h:116
LIST * ht_search(HASH_TABLE *table, int(*node_is_matching)(HASH_NODE *node))
seach table for matching nodes
Definition n_hash.c:2160
int destroy_ht(HASH_TABLE **table)
empty a table and destroy it
Definition n_hash.c:2180
#define HT_FOREACH_R(__ITEM_, __HASH_, __ITERATOR,...)
ForEach macro helper.
Definition n_hash.h:238
HASH_TABLE * new_ht(size_t size)
Create a hash table with the given size.
Definition n_hash.c:1948
int ht_get_table_collision_percentage(HASH_TABLE *table)
get table collision percentage (HASH_CLASSIC mode only)
Definition n_hash.c:2420
int ht_get_double(HASH_TABLE *table, const char *key, double *val)
get double at 'key' from 'table'
Definition n_hash.c:2021
int empty_ht(HASH_TABLE *table)
empty a table
Definition n_hash.c:2170
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:2335
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:2073
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:2442
int ht_get_string(HASH_TABLE *table, const char *key, char **val)
get string at 'key' from 'table'
Definition n_hash.c:2060
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:2113
int ht_resize(HASH_TABLE **table, size_t size)
rehash table according to size (HASH_CLASSIC mode only)
Definition n_hash.c:2457
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:1902
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:2100
int ht_optimize(HASH_TABLE **table)
try an automatic optimization of the table
Definition n_hash.c:2532
#define HT_FOREACH(__ITEM_, __HASH_,...)
ForEach macro helper.
Definition n_hash.h:192
structure of a hash table node
Definition n_hash.h:90
structure of a hash table
Definition n_hash.h:114
int list_push(LIST *list, void *ptr, void(*destructor)(void *ptr))
Add a pointer to the end of the list.
Definition n_list.c:199
#define list_foreach(__ITEM_, __LIST_)
ForEach macro helper.
Definition n_list.h:65
int list_destroy(LIST **list)
Empty and Free a list container.
Definition n_list.c:518
Structure of a generic LIST container.
Definition n_list.h:39
#define n_log(__LEVEL__,...)
Logging function wrapper to get line and func.
Definition n_log.h:69
#define LOG_DEBUG
debug-level messages
Definition n_log.h:64
#define LOG_ERR
error conditions
Definition n_log.h:56
void set_log_level(const int log_level)
Set the global log level value ( static int LOG_LEVEL )
Definition n_log.c:91
#define LOG_INFO
informational
Definition n_log.h:62
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.
string and int holder
Definition ex_hash.c:15
int value
int value
Definition ex_hash.c:19
N_STR * rnd_str
string holder
Definition ex_hash.c:17