AMXX-BG.INFO hash.inc Raw include

hash.inc

Original include source with line numbers.

Back Download .inc
1 /*
2 Trie (Hash) abstraction layer
3 by Zefir<[email protected]>
4 developed for Cerberus project
5 http://cerberus.cstrike.in.ua/
6 12 jule 2009 (c) Zefir
7
8 Big tnx Exolent :)
9 */
10
11 #if defined _hash_included
12 #endinput
13 #endif
14 #define _hash_included
15
16
17
18 // Default, builtin variant
19 //#define HASH_NATIVE
20
21 #if !defined HASH_NATIVE
22 #define HASH_EMULATE
23 #endif
24
25
26 #if defined HASH_NATIVE
27 #define Hash Trie
28 #define HashCreate() TrieCreate()
29 #define HashClear(%1) TrieClear(%1)
30 #define HashDestroy(%1) TrieDestroy(%1)
31
32 #define HashKeyExists(%1,%2) TrieKeyExists(%1, %2)
33 #define HashDeleteKey(%1,%2) TrieDeleteKey(%1, %2)
34
35 #define HashSetCell(%1,%2,%3) TrieSetCell(%1, %2, %3)
36 #define HashSetString(%1,%2,%3) TrieSetString(%1, %2, %3)
37 #define HashSetArray(%1,%2,%3,%4) TrieSetArray(%1, %2, %3, %4)
38
39 #define HashGetCell(%1,%2,%3) TrieGetCell(%1, %2, %3)
40 #define HashGetString(%1,%2,%3,%4) TrieGetString(%1, %2, %3, %4)
41 #define HashGetArray(%1,%2,%3,%4) TrieGetArray(%1, %2, %3, %4)
42 #endif
43
44 #if defined HASH_EMULATE
45 #define Hash Trie
46 #define HashCreate() TrieCreate()
47
48 #define HashKeyExists(%1,%2) TrieKeyExists(%1, %2)
49
50 #define HashSetCell(%1,%2,%3) TrieSetCell(%1, %2, %3)
51 #define HashSetString(%1,%2,%3) TrieSetString(%1, %2, %3)
52
53 #define HashGetCell(%1,%2,%3) TrieGetCell(%1, %2, %3)
54 #define HashGetString(%1,%2,%3,%4) TrieGetString(%1, %2, %3, %4)
55
56 stock HashClear(Hash:handle) {
57 __HashDeleteAllKeys(handle)
58
59 return TrieClear(handle)
60 }
61
62 stock HashDestroy(&Hash:handle) {
63 __HashDeleteAllKeys(handle)
64
65 return TrieDestroy(handle)
66 }
67
68 stock __HashDeleteAllKeys(Hash:handle) {
69 if (!handle) return
70
71 new Array:keys, Trie:pos
72 if(TrieGetCell(handle, {10, 30, 'k', 0}, keys) && TrieGetCell(handle, {10, 30, 'p', 0}, pos)) {
73 TrieDestroy(pos)
74
75 new array_key[64], size = ArraySize(keys), Array:arr
76 for(new i = 0; i < size; i++) {
77 ArrayGetString(keys, i, array_key, charsmax(array_key))
78 TrieGetCell(handle, array_key, arr)
79 ArrayDestroy(arr)
80 }
81
82 ArrayDestroy(keys)
83 }
84 }
85
86 stock bool:HashDeleteKey(Hash:handle, const key[]) {
87 if(!handle || !TrieKeyExists(handle, key))
88 return false
89
90 new Array:keys, Trie:pos, index
91 if(TrieGetCell(handle, {10, 30, 'k', 0}, keys)
92 && TrieGetCell(handle, {10, 30, 'p', 0}, pos)
93 && TrieGetCell(pos, key, index))
94 {
95
96 ArrayDeleteItem(keys, index)
97
98 new array_key[64], size = ArraySize(keys)
99 for(new i = index; i < size; i++) {
100 ArrayGetString(keys, i, array_key, charsmax(array_key))
101 TrieSetCell(pos, array_key, i)
102 }
103
104 new Array:arr
105 TrieGetCell(handle, key, arr)
106 ArrayDestroy(arr)
107 }
108 return TrieDeleteKey(handle, key)
109 }
110
111 stock HashSetArray(Hash:handle, const key[], const any:buffer[], size) {
112 if (!handle) return false
113
114 new Array:arr
115 if (!TrieGetCell(handle, key, arr)) {
116 arr = ArrayCreate(size, 1)
117 ArrayPushArray(arr, buffer)
118
119 new Array:keys, Trie:pos
120 if(!TrieGetCell(handle, {10, 30, 'k', 0}, keys)) {
121 keys = ArrayCreate(64)
122 TrieSetCell(handle, {10, 30, 'k', 0}, keys)
123 }
124 if(!TrieGetCell(handle, {10, 30, 'p', 0}, pos)) {
125 pos = TrieCreate()
126 TrieSetCell(handle, {10, 30, 'p', 0}, pos)
127 }
128
129 new size = ArraySize(keys)
130 ArrayPushString(keys, key)
131 TrieSetCell(pos, key, size)
132 } else
133 ArraySetArray(arr, 0, buffer)
134
135 return TrieSetCell(handle, key, arr)
136 }
137
138 stock bool:HashGetArray(Hash:handle, const key[], any:output[], outputsize) {
139 outputsize++
140 new Array:arr
141
142 if (!handle || !TrieGetCell(handle, key, arr))
143 return false
144
145 ArrayGetArray(arr, 0, output)
146
147 return true
148 }
149 #endif