1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
#include "map.h"
#include "../hash/fnv.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define mod_inc 4
uint64_t hash(char* c, size_t len){
return fnv_1((uint8_t*)c, len, v_a);
}
map_t* map_init(){
map_t* awa = malloc(sizeof * awa);
awa->M = malloc(sizeof * awa->M * 4);
awa->len = 0;
awa->mod = 4;
return awa;
}
void map_regraph(map_t* M){
map_t* remade = map_init();
for(int i = 0; i != M->len; i++){
//what happens if the map_set calls map_regraph??? idk
map_set(remade, M->M[i].key->c, M->M[i].value);
}
M = remade;
}
void map_set(map_t* M, char* key, void* value){
uint64_t h = hash(key, strlen(key));
if(M->len >= M->mod){
expand:
M->mod *= 4;
M->M = realloc(M->M, sizeof * M->M * M->mod);
//regraph it
map_regraph(M);
}
uint64_t ind = h % M->mod;
for(int count = 0; M->M[ind].key != NULL && M->M[ind].hash != h && strcmp(M->M[ind].key->c, key) != 0; count++){
ind++;
if(ind >= M->mod) ind = 0;
if(count > 5) goto expand;
}
M->M[ind].hash = h;
M->M[ind].key = str_init(key);
M->M[ind].value = value;
}
int map_geti(map_t* M, char* key){
uint64_t h = hash(key, strlen(key));
uint64_t ind = h % M->mod;
//melem_t sel = M->M[];
for(uint64_t initial = ind; ind != initial - 1;){
if(M->M[ind].key == NULL) return -1;
if(M->M[ind].hash == h && strcmp(M->M[ind].key->c, key)==0) return ind;
ind++;
if(ind >= M->mod) ind = 0;
}
return -1;
}
void* map_get(map_t* M, char* key){
int r = map_geti(M, key);
printf("%i\n",r);
return r == -1? NULL : M->M[r].value;
}
void map_remove(map_t* p, char* key, enum free_type free);
void map_clear(map_t*, enum free_type);
void map_lclear(map_t*);
void map_dump(map_t* M){
for(int i = 0; i != M->mod; i++){
if(M->M[i].key != NULL){
printf("%i | %s : %p\n",i,M->M[i].key->c, M->M[i].value);
}
}
}
int main(){
int i = 5;
int b = 24;
int c = 9;
map_t* m = map_init();
for(int i = 65; i != 91; i++){
//printf("%c\n",i);
int* ww = malloc(sizeof * ww * 55);
ww[0] = i;
map_set(m, ((char[]){i, 0}), ww);
}
map_dump(m);
printf("%i\n",*(int*)map_get(m, "B"));
return 0;
}
|