27#include "mem_blockalloc.h"
30# include "../fgame/g_local.h"
32# define ARRAYSET_Alloc gi.Malloc
33# define ARRAYSET_Free gi.Free
35#elif defined(CGAME_DLL)
36# include "../cgame/cg_local.h"
38# define ARRAYSET_Alloc cgi.Malloc
39# define ARRAYSET_Free cgi.Free
42# include "../renderercommon/tr_common.h"
44# define ARRAYSET_Alloc ri.Malloc
45# define ARRAYSET_Free ri.Free
50# define ARRAYSET_Alloc Z_Malloc
51# define ARRAYSET_Free Z_Free
54template<
typename k,
typename v>
57template<
typename k,
typename v>
60template<
typename k,
typename v>
61class con_arrayset_Entry
71 con_arrayset_Entry *next;
74 void *
operator new(
size_t size) {
return con_arrayset<k, v>::NewEntry(size); }
76 void operator delete(
void *ptr) { con_arrayset<k, v>::DeleteEntry(ptr); }
87#ifdef ARCHIVE_SUPPORTED
92template<
typename k,
typename v>
105 unsigned int tableLength;
106 unsigned int threshold;
108 short unsigned int tableLengthIndex;
110 Entry **reverseTable;
113 Entry *findKeyEntry(
const k& key)
const;
114 Entry *addKeyEntry(
const k& key);
115 Entry *addNewKeyEntry(
const k& key);
118 static void *NewEntry(
size_t size);
119 static void DeleteEntry(
void *entry);
120 static void *NewTable(
size_t count);
121 static void DeleteTable(
void *table);
127#ifdef ARCHIVE_SUPPORTED
132 void resize(
int count = 0);
133 unsigned int size()
const;
135 unsigned int findKeyIndex(
const k& key);
136 unsigned int addKeyIndex(
const k& key);
137 unsigned int addNewKeyIndex(
const k& key);
138 bool remove(
const k& key);
140 v& operator[](
unsigned int index);
143template<
typename k,
typename v>
146template<
typename k,
typename v>
147void *con_arrayset<k, v>::NewEntry(
size_t size)
149 return Entry_allocator.Alloc();
152template<
typename k,
typename v>
153void con_arrayset<k, v>::DeleteEntry(
void *entry)
155 Entry_allocator.Free(entry);
158template<
typename k,
typename v>
159void *con_arrayset<k, v>::NewTable(
size_t count)
161 return ARRAYSET_Alloc(
sizeof(Entry *) * (
int)count);
164template<
typename k,
typename v>
165void con_arrayset<k, v>::DeleteTable(
void *table)
167 ARRAYSET_Free(table);
170template<
typename key,
typename value>
171con_arrayset<key, value>::con_arrayset()
174 table = &defaultEntry;
178 tableLengthIndex = 0;
181 reverseTable = &this->defaultEntry;
184template<
typename key,
typename value>
185con_arrayset<key, value>::~con_arrayset()
190template<
typename key,
typename value>
191void con_arrayset<key, value>::resize(
int count)
193 Entry **oldReverseTable = reverseTable;
194 Entry **oldTable = table;
197 unsigned int oldTableLength = tableLength;
201 tableLength += count;
202 threshold = tableLength;
205 threshold = (
unsigned int)((
float)tableLength * 0.75);
210 tableLength += threshold;
214 table =
new (NewTable(tableLength)) Entry *[tableLength]();
217 for (i = oldTableLength; i > 0; i--) {
219 for (e = oldTable[i - 1]; e != NULL; e = old) {
223 index = HashCode<key>(e->key) % tableLength;
225 e->next = table[index];
230 if (oldTableLength > 1) {
232 DeleteTable(oldTable);
236 reverseTable =
new (NewTable(tableLength)) Entry *[this->tableLength]();
238 for (i = 0; i < oldTableLength; i++) {
239 reverseTable[i] = oldReverseTable[i];
242 if (oldTableLength > 1) {
243 DeleteTable(oldReverseTable);
247template<
typename k,
typename v>
248unsigned int con_arrayset<k, v>::size()
const
253template<
typename key,
typename value>
254void con_arrayset<key, value>::clear()
260 if (tableLength > 1) {
261 DeleteTable(reverseTable);
262 reverseTable = &defaultEntry;
265 for (i = 0; i < tableLength; i++) {
266 for (entry = table[i]; entry != NULL; entry = next) {
272 if (tableLength > 1) {
277 table = &defaultEntry;
281 tableLengthIndex = 0;
286template<
typename k,
typename v>
287typename con_arrayset<k, v>::Entry *con_arrayset<k, v>::findKeyEntry(
const k& key)
const
291 entry = table[HashCode<k>(key) % tableLength];
293 for (; entry != NULL; entry = entry->next) {
294 if (entry->key == key) {
302template<
typename k,
typename v>
303typename con_arrayset<k, v>::Entry *con_arrayset<k, v>::addKeyEntry(
const k& key)
307 entry = findKeyEntry(key);
312 return addNewKeyEntry(key);
316template<
typename k,
typename v>
317typename con_arrayset<k, v>::Entry *con_arrayset<k, v>::addNewKeyEntry(
const k& key)
322 if (count >= threshold) {
326 index = HashCode<k>(key) % tableLength;
330 if (defaultEntry == NULL) {
331 defaultEntry = entry;
334 entry->next = table[index];
337 reverseTable[count] = entry;
341 entry->index = count;
342 table[index] = entry;
347template<
typename k,
typename v>
348unsigned int con_arrayset<k, v>::addKeyIndex(
const k& key)
350 Entry *entry = this->addKeyEntry(key);
355template<
typename k,
typename v>
356unsigned int con_arrayset<k, v>::addNewKeyIndex(
const k& key)
358 Entry *entry = this->addNewKeyEntry(key);
363template<
typename k,
typename v>
364unsigned int con_arrayset<k, v>::findKeyIndex(
const k& key)
366 Entry *entry = this->findKeyEntry(key);
375template<
typename k,
typename v>
376bool con_arrayset<k, v>::remove(
const k& key)
380 for (i = 0; i < tableLength; i++) {
381 if (reverseTable[i] && reverseTable[i]->key == key) {
382 reverseTable[i] = NULL;
386 return con_set<k, v>::remove(key);
389template<
typename key,
typename value>
390value& con_arrayset<key, value>::operator[](
unsigned int index)
392 return reverseTable[index - 1]->key;
395template<
typename key,
typename value>
396class con_arrayset_enum
401 using Entry =
typename con_arrayset<key, value>::Entry;
405 unsigned int m_Index;
406 Entry *m_CurrentEntry;
415 Entry *NextElement(
void);
416 Entry *CurrentElement(
void);
419template<
typename key,
typename value>
420con_arrayset_enum<key, value>::con_arrayset_enum()
424 m_CurrentEntry = NULL;
428template<
typename key,
typename value>
434template<
typename key,
typename value>
438 m_Index = m_Set->tableLength;
439 m_CurrentEntry = NULL;
445template<
typename key,
typename value>
446typename con_arrayset_enum<key, value>::Entry *con_arrayset_enum<key, value>::CurrentElement(
void)
448 return m_CurrentEntry;
451template<
typename key,
typename value>
452typename con_arrayset_enum<key, value>::Entry *con_arrayset_enum<key, value>::NextElement(
void)
461 m_NextEntry = m_Set->table[m_Index];
469 m_CurrentEntry = NULL;
474 m_CurrentEntry = m_NextEntry;
475 m_NextEntry = m_NextEntry->next;
477 return m_CurrentEntry;
Definition mem_blockalloc.h:172
Definition con_arrayset.h:62
Definition con_arrayset.h:397
Definition con_arrayset.h:94