acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
hash_table.h
1// From map_base.h by camilo on 2022-09-12 04:01 <3ThomasBorregaardSorensen!!
2#pragma once
3
4
5#include "set_node.h"
6
7
8template < typename ITEM, const ::i32 DEFAULT_HASH_TABLE_SIZE = 17 >
9class set_dynamic_hash_table
10{
11public:
12
13
14 using BASE_NODE = set_node < ITEM >;
15
16 using BASE_ITEM = ITEM;
17
18 using ITEM_POINTER = ITEM *;
19
20 using iterator = ::list_iterator < ITEM_POINTER >;
21
22
23 BASE_NODE * m_pHashDefault[DEFAULT_HASH_TABLE_SIZE];
24 BASE_NODE ** m_ppHash;
25 ::u32 m_nHashTableSize;
26
27
28 set_dynamic_hash_table()
29 {
30
31 m_ppHash = nullptr;
32
33 m_nHashTableSize = DEFAULT_HASH_TABLE_SIZE;
34
35 }
36
37
38 ::u32 GetHashTableSize() const
39 {
40
41 return m_nHashTableSize;
42
43 }
44
45
46 void InitHashTable(::u32 nHashSize, bool bAllocNow = true)
47 {
48
49 if (nHashSize <= 0)
50 {
51
52 throw "Hash table size must be greater than 0";
53
54 }
55
56 if (m_ppHash != nullptr && m_ppHash != m_pHashDefault && m_nHashTableSize > DEFAULT_HASH_TABLE_SIZE)
57 {
58
59 delete[] m_ppHash;
60
61 }
62
63 m_ppHash = nullptr;
64
65 if (bAllocNow)
66 {
67
68 if (nHashSize <= DEFAULT_HASH_TABLE_SIZE)
69 {
70
71 m_ppHash = m_pHashDefault;
72
73 }
74 else
75 {
76
77 m_ppHash = øraw_new BASE_NODE *[nHashSize];
78
79 ENSURE(m_ppHash != nullptr);
80
81 }
82
83 ::zero(m_ppHash, sizeof(iterator) * nHashSize);
84
85 }
86
87 m_nHashTableSize = nHashSize;
88
89 }
90
91
92 void erase_all()
93 {
94
95 if (m_ppHash != nullptr && m_ppHash != m_pHashDefault && m_nHashTableSize > DEFAULT_HASH_TABLE_SIZE)
96 {
97
98 delete[] m_ppHash;
99
100 }
101
102 m_ppHash = nullptr;
103
104 }
105
106
107};
108
109
110template < ::i32 m_nHashTableSize, typename PAYLOAD >
111class set_fixed_hash_table
112{
113public:
114
115
116 typedef set_node < PAYLOAD > node;
117
118
119 node * m_ppHash[m_nHashTableSize];
120
121
122 set_fixed_hash_table()
123 {
124
125 ASSERT(m_nHashTableSize > 0);
126
127 zero(m_ppHash, sizeof(m_ppHash));
128
129 }
130
131
132 ::u32 GetHashTableSize() const
133 {
134
135 return m_nHashTableSize;
136
137 }
138
139
140 void InitHashTable(::u32 hashSize, bool bAllocNow = true) { }
141
142
143 void erase_all()
144 {
145
146 zero(m_ppHash, sizeof(m_ppHash));
147
148 }
149
150
151};
152
153
154