-
Notifications
You must be signed in to change notification settings - Fork 72
/
id.c
129 lines (105 loc) · 2.38 KB
/
id.c
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include "id.h"
#include "debug.h"
#include <__mem.h>
HSD_ObjAllocData hsd_iddata;
HSD_IDTable default_table;
HSD_ObjAllocData* HSD_IDGetAllocData(void)
{
return &hsd_iddata;
}
void HSD_IDInitAllocData(void)
{
HSD_ObjAllocInit(&hsd_iddata, sizeof(IDEntry), 4);
}
void HSD_IDSetup(void)
{
memset(&default_table, 0, sizeof(HSD_IDTable));
}
inline u32 hash(u32 id)
{
return id % 0x65;
}
inline IDEntry* IDEntryAlloc(void)
{
IDEntry* entry;
entry = HSD_ObjAlloc(&hsd_iddata);
if (entry == NULL) {
__assert("id.c", 67, "entry");
}
memset(entry, 0, sizeof(IDEntry));
return entry;
}
void HSD_IDInsertToTable(HSD_IDTable* table, u32 id, void* data)
{
IDEntry* entry;
if (table == NULL) {
table = &default_table;
}
entry = table->table[hash(id)];
while (entry != NULL) {
if (entry->id == id) {
break;
}
entry = entry->next;
}
if (entry != NULL) {
entry->id = id;
entry->data = data;
} else {
entry = IDEntryAlloc();
entry->id = id;
entry->data = data;
entry->next = table->table[hash(id)];
table->table[hash(id)] = entry;
}
}
inline void IDEntryFree(IDEntry* entry)
{
HSD_ObjFree(&hsd_iddata, entry);
}
void HSD_IDRemoveByIDFromTable(HSD_IDTable* table, u32 id)
{
IDEntry* entry;
IDEntry* prev;
if (table == NULL) {
table = &default_table;
}
prev = NULL;
for (entry = table->table[hash(id)]; entry != NULL; entry = entry->next) {
if (entry->id == id) {
if (prev != NULL) {
prev->next = entry->next;
} else {
table->table[hash(id)] = entry->next;
}
IDEntryFree(entry);
return;
}
prev = entry;
}
}
void* HSD_IDGetDataFromTable(HSD_IDTable* table, u32 id, s32* success)
{
IDEntry* entry;
if (table == NULL) {
table = &default_table;
}
entry = table->table[hash(id)];
while (entry != NULL) {
if (entry->id == id) {
if (success != NULL) {
*success = 1;
}
return entry->data;
}
entry = entry->next;
}
if (success != NULL) {
*success = 0;
}
return NULL;
}
void _HSD_IDForgetMemory(void* low, void* high)
{
memset(&default_table, 0, sizeof(HSD_IDTable));
}