Archeus 0.0.0
A C library and game engine that focuses on documentation
Loading...
Searching...
No Matches
hashtable.c
Go to the documentation of this file.
1#include "arc/std/hashtable.h"
2
3#include "arc/std/errno.h"
4#include <stdlib.h>
5#include <stdio.h>
6
13
14void CRC32(void *key, size_t *keysize, uint32_t *hashval){
15 *hashval = 0xffffffff;
16
17 for(size_t i = 0; i < *keysize; i++){
18 uint8_t value = *(((uint8_t *)key) + i);
19 for(uint8_t j = 0; j < 8; j++){
20 uint8_t flag = (uint8_t)((value ^ *hashval) & 1);
21 *hashval >>= 1;
22 if(flag){ *hashval ^= 0xEDB888320; }
23 value >>= 1;
24 }
25 }
26
27 *hashval = ~*hashval;
28}
29
30int8_t ARC_Default_Key_Compare(void *key1, size_t *key1size, void *key2, size_t *key2size){
31 return key1 == key2;
32}
33
34void ARC_HashtableNode_Create(ARC_HashtableNode **node, void *key, size_t *keysize, void *data){
35 *node = (ARC_HashtableNode *) malloc(sizeof(ARC_HashtableNode));
36 (*node)->key = key;
37 (*node)->keysize = *keysize;
38 (*node)->data = data;
39 (*node)->node = NULL;
40}
41
43 if(node == NULL){
44 return;
45 }
46
47 ARC_HashtableNode_Destroy(node->node, external, userdata);
48
49 if(external){
50 external(node, userdata);
51 }
52
53 free(node);
54}
55
56void ARC_Hashtable_Create(ARC_Hashtable **htable, uint32_t bucketsize, ARC_Hashtable_Hash hash, ARC_Hashtable_KeyCompare compare){
57 *htable = (ARC_Hashtable *) malloc(sizeof(ARC_Hashtable));
58 (*htable)->size = bucketsize;
59 (*htable)->nodes = (ARC_HashtableNode **) calloc(bucketsize, sizeof(ARC_HashtableNode *));
60 (*htable)->hash = (hash)? hash : CRC32;
61 (*htable)->compare = (compare)? compare : ARC_Default_Key_Compare;
62}
63
65 for(uint32_t i = 0; i < htable->size; i++){
66 if(htable->nodes[i]){
67 ARC_HashtableNode_Destroy(htable->nodes[i], external, userdata);
68 }
69 }
70
71 free(htable->nodes);
72 free(htable);
73}
74
75void ARC_Hashtable_Add(ARC_Hashtable *htable, void *key, size_t keysize, void *data){
76 uint32_t size = 0;
77 htable->hash(key, &keysize, &size);
78
79 ARC_HashtableNode *bucket = htable->nodes[size % htable->size];
80 if(!bucket){
81 ARC_HashtableNode_Create(&bucket, key, &keysize, data);
82 htable->nodes[size % htable->size] = bucket;
83 return;
84 }
85
86 if(!htable->compare(bucket->key, &bucket->keysize, key, &keysize)){
88 return;
89 }
90
91 while(bucket->node){
92 if(!htable->compare(bucket->node->key, &bucket->node->keysize, key, &keysize)){
94 return;
95 }
96
97 bucket = bucket->node;
98 }
99
100 ARC_HashtableNode_Create(&(bucket->node), key, &keysize, data);
101}
102
103void ARC_Hashtable_Get(ARC_Hashtable *htable, void *key, size_t keysize, void **data){
104 uint32_t size = 0;
105 htable->hash(key, &keysize, &size);
106
107 ARC_HashtableNode *bucket = htable->nodes[size % htable->size];
108 if(!bucket){
109 *data = NULL;
111 return;
112 }
113
114 if(!htable->compare(bucket->key, &bucket->keysize, key, &keysize)){
115 *data = bucket->data;
116 return;
117 }
118
119 while(bucket->node){
120 if(!htable->compare(bucket->node->key, &bucket->node->keysize, key, &keysize)){
121 *data = bucket->node->data;
122 return;
123 }
124
125 bucket = bucket->node;
126 }
127
129}
130
131void ARC_Hashtable_Remove(ARC_Hashtable *htable, void *key, size_t keysize, ARC_HashtableNode_DestroyExternal external, void *userdata){
132 uint32_t size = 0;
133 htable->hash(key, &keysize, &size);
134
135 ARC_HashtableNode *bucket = htable->nodes[size % htable->size];
136 if(!bucket){
138 return;
139 }
140
141 if(!htable->compare(bucket->key, &bucket->keysize, key, &keysize)){
142 ARC_HashtableNode *temp = bucket;
143 htable->nodes[size % htable->size] = bucket->node;
144
145 if(external){
146 external(temp, userdata);
147 }
148
149 free(temp);
150 return;
151 }
152
153 while(bucket->node){
154 if(!htable->compare(bucket->node->key, &bucket->node->keysize, key, &keysize)){
155 ARC_HashtableNode *temp = bucket->node;
156 bucket->node = bucket->node->node;
157
158 if(external){
159 external(temp, userdata);
160 }
161
162 free(temp);
163 return;
164 }
165
166 bucket = bucket->node;
167 }
168
170}
int32_t arc_errno
Definition errno.c:5
#define ARC_ERRNO_EXISTS
Definition errno.h:9
#define ARC_ERRNO_NULL
Definition errno.h:6
void ARC_HashtableNode_Create(ARC_HashtableNode **node, void *key, size_t *keysize, void *data)
Definition hashtable.c:34
void ARC_Hashtable_Destroy(ARC_Hashtable *htable, ARC_HashtableNode_DestroyExternal external, void *userdata)
destroys ARC_Hashtable type
Definition hashtable.c:64
void ARC_HashtableNode_Destroy(ARC_HashtableNode *node, ARC_HashtableNode_DestroyExternal external, void *userdata)
Definition hashtable.c:42
void ARC_Hashtable_Get(ARC_Hashtable *htable, void *key, size_t keysize, void **data)
gets value from hashtable by key
Definition hashtable.c:103
void ARC_Hashtable_Create(ARC_Hashtable **htable, uint32_t bucketsize, ARC_Hashtable_Hash hash, ARC_Hashtable_KeyCompare compare)
cteates ARC_Hashtable type
Definition hashtable.c:56
void ARC_Hashtable_Remove(ARC_Hashtable *htable, void *key, size_t keysize, ARC_HashtableNode_DestroyExternal external, void *userdata)
removes value from hashtable
Definition hashtable.c:131
void ARC_Hashtable_Add(ARC_Hashtable *htable, void *key, size_t keysize, void *data)
adds value to hastable
Definition hashtable.c:75
int8_t ARC_Default_Key_Compare(void *key1, size_t *key1size, void *key2, size_t *key2size)
Definition hashtable.c:30
void CRC32(void *key, size_t *keysize, uint32_t *hashval)
Definition hashtable.c:14
int8_t(* ARC_Hashtable_KeyCompare)(void *key1, size_t *key1size, void *key2, size_t *key2size)
key comparison function ptr
Definition hashtable.h:45
void(* ARC_HashtableNode_DestroyExternal)(ARC_HashtableNode *node, void *userdata)
callback to allow memory freeing of nodes
Definition hashtable.h:53
void(* ARC_Hashtable_Hash)(void *key, size_t *keysize, uint32_t *hashval)
a hashing function ptr
Definition hashtable.h:35
ARC_HashtableNode * node
Definition hashtable.h:25
ARC_Hashtable_Hash hash
Definition hashtable.c:10
ARC_HashtableNode ** nodes
Definition hashtable.c:9
uint32_t size
Definition hashtable.c:8
ARC_Hashtable_KeyCompare compare
Definition hashtable.c:11