-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhashovani.h
56 lines (42 loc) · 1.15 KB
/
hashovani.h
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
#ifndef HASHOVANI
#define HASHOVANI
#define BASIC_HASH_SIZE 8
typedef enum {
EMPTY_HASH,
FULL_HASH,
DELETED_HASH,
} HASH_TYPE;
// pri zmene treba zmenit clone
typedef struct SHashMember {
char *name;
int info;
HASH_TYPE full;
unsigned long int hash;
unsigned long int link;
} HashMember;
typedef struct SHash {
HashMember *hashes;
unsigned int size;
unsigned int used;
} Hash;
Hash *new_Hash();
HashMember *add_Hash(Hash *h, unsigned long int hash, unsigned long int p);
HashMember *add_string_Hash(Hash *h, char *name, unsigned long int p);
HashMember *get_Hash(Hash *h, unsigned long int hash);
#define get_string_Hash(h, name) get_Hash((h), hash_string(name))
Hash *del_HashMember(Hash *h, HashMember *hm);
#define del_Hash(h, hash) del_HashMember((h), get_Hash((h), (hash)))
#define del_string_Hash(h, name) del_Hash((h), hash_string(name))
Hash *clone_Hash(Hash *h);
void free_Hash(Hash *h);
unsigned long int hash_string(char *s);
#define FOR_ALL_HASHES(h, hm, body)\
{\
HashMember* hm; \
for (int _i_=0; _i_<(h)->size; _i_++) { \
if ((h)->hashes[_i_].full != FULL_HASH) continue; \
hm = &((h)->hashes[_i_]); \
body\
}\
}
#endif