]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/common/hash.cpp
wxFileSystem now compiles if wxUSE_HTML (required by wxHTML)
[wxWidgets.git] / src / common / hash.cpp
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: hash.cpp
3// Purpose: wxHashTable implementation
4// Author: Julian Smart
5// Modified by:
6// Created: 01/02/97
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart and Markus Holzem
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
13#pragma implementation "hash.h"
14#endif
15
16// For compilers that support precompilation, includes "wx.h".
17#include "wx/wxprec.h"
18
19#ifdef __BORLANDC__
20#pragma hdrstop
21#endif
22
23#ifndef WX_PRECOMP
24#include "wx/list.h"
25#endif
26
27#include "wx/hash.h"
28
29#include <string.h>
30#include <stdarg.h>
31
32IMPLEMENT_DYNAMIC_CLASS(wxHashTable, wxObject)
33
34wxHashTable::wxHashTable (int the_key_type, int size)
35{
36 n = 0;
37 hash_table = (wxList**) NULL;
38 Create(the_key_type, size);
39/*
40 n = size;
41 current_position = -1;
42 current_node = (wxNode *) NULL;
43
44 key_type = the_key_type;
45 hash_table = new wxList *[size];
46 int i;
47 for (i = 0; i < size; i++)
48 hash_table[i] = (wxList *) NULL;
49*/
50}
51
52wxHashTable::~wxHashTable (void)
53{
54 Destroy();
55}
56
57void wxHashTable::Destroy(void)
58{
59 if (!hash_table) return;
60 int i;
61 for (i = 0; i < n; i++)
62 if (hash_table[i])
63 delete hash_table[i];
64 delete[] hash_table;
65 hash_table = NULL;
66}
67
68bool wxHashTable::Create(int the_key_type, int size)
69{
70 Destroy();
71
72 n = size;
73 current_position = -1;
74 current_node = (wxNode *) NULL;
75
76 key_type = the_key_type;
77 hash_table = new wxList *[size];
78 int i;
79 for (i = 0; i < size; i++)
80 hash_table[i] = (wxList *) NULL;
81 return TRUE;
82}
83
84
85void wxHashTable::DoCopy(const wxHashTable& table)
86{
87 n = table.n;
88 current_position = table.current_position;
89 current_node = NULL; // doesn't matter - Next() will reconstruct it
90 key_type = table.key_type;
91
92 hash_table = new wxList *[n];
93 for (int i = 0; i < n; i++) {
94 if (table.hash_table[i] == NULL)
95 hash_table[i] = NULL;
96 else {
97 hash_table[i] = new wxList(key_type);
98 *(hash_table[i]) = *(table.hash_table[i]);
99 }
100 }
101}
102
103void wxHashTable::Put (long key, long value, wxObject * object)
104{
105 // Should NEVER be
106 long k = (long) key;
107 if (k < 0)
108 k = -k;
109
110 int position = (int) (k % n);
111 if (!hash_table[position])
112 hash_table[position] = new wxList (wxKEY_INTEGER);
113
114 hash_table[position]->Append (value, object);
115}
116
117void wxHashTable::Put (long key, const wxChar *value, wxObject * object)
118{
119 // Should NEVER be
120 long k = (long) key;
121 if (k < 0)
122 k = -k;
123
124 int position = (int) (k % n);
125 if (!hash_table[position])
126 hash_table[position] = new wxList (wxKEY_INTEGER);
127
128 hash_table[position]->Append (value, object);
129}
130
131void wxHashTable::Put (long key, wxObject * object)
132{
133 // Should NEVER be
134 long k = (long) key;
135 if (k < 0)
136 k = -k;
137
138 int position = (int) (k % n);
139 if (!hash_table[position])
140 hash_table[position] = new wxList (wxKEY_INTEGER);
141
142 hash_table[position]->Append (k, object);
143}
144
145void wxHashTable::Put (const wxChar *key, wxObject * object)
146{
147 int position = (int) (MakeKey (key) % n);
148
149 if (!hash_table[position])
150 hash_table[position] = new wxList (wxKEY_STRING);
151
152 hash_table[position]->Append (key, object);
153}
154
155wxObject *wxHashTable::Get (long key, long value) const
156{
157 // Should NEVER be
158 long k = (long) key;
159 if (k < 0)
160 k = -k;
161
162 int position = (int) (k % n);
163 if (!hash_table[position])
164 return (wxObject *) NULL;
165 else
166 {
167 wxNode *node = hash_table[position]->Find (value);
168 if (node)
169 return node->Data ();
170 else
171 return (wxObject *) NULL;
172 }
173}
174
175wxObject *wxHashTable::Get (long key, const wxChar *value) const
176{
177 // Should NEVER be
178 long k = (long) key;
179 if (k < 0)
180 k = -k;
181
182 int position = (int) (k % n);
183 if (!hash_table[position])
184 return (wxObject *) NULL;
185 else
186 {
187 wxNode *node = hash_table[position]->Find (value);
188 if (node)
189 return node->Data ();
190 else
191 return (wxObject *) NULL;
192 }
193}
194
195wxObject *wxHashTable::Get (long key) const
196{
197 // Should NEVER be
198 long k = (long) key;
199 if (k < 0)
200 k = -k;
201
202 int position = (int) (k % n);
203 if (!hash_table[position])
204 return (wxObject *) NULL;
205 else
206 {
207 wxNode *node = hash_table[position]->Find (k);
208 return node ? node->Data () : (wxObject*)NULL;
209 }
210}
211
212wxObject *wxHashTable::Get (const wxChar *key) const
213{
214 int position = (int) (MakeKey (key) % n);
215
216 if (!hash_table[position])
217 return (wxObject *) NULL;
218 else
219 {
220 wxNode *node = hash_table[position]->Find (key);
221 return node ? node->Data () : (wxObject*)NULL;
222 }
223}
224
225wxObject *wxHashTable::Delete (long key)
226{
227 // Should NEVER be
228 long k = (long) key;
229 if (k < 0)
230 k = -k;
231
232 int position = (int) (k % n);
233 if (!hash_table[position])
234 return (wxObject *) NULL;
235 else
236 {
237 wxNode *node = hash_table[position]->Find (k);
238 if (node)
239 {
240 wxObject *data = node->Data ();
241 delete node;
242 return data;
243 }
244 else
245 return (wxObject *) NULL;
246 }
247}
248
249wxObject *wxHashTable::Delete (const wxChar *key)
250{
251 int position = (int) (MakeKey (key) % n);
252 if (!hash_table[position])
253 return (wxObject *) NULL;
254 else
255 {
256 wxNode *node = hash_table[position]->Find (key);
257 if (node)
258 {
259 wxObject *data = node->Data ();
260 delete node;
261 return data;
262 }
263 else
264 return (wxObject *) NULL;
265 }
266}
267
268wxObject *wxHashTable::Delete (long key, int value)
269{
270 // Should NEVER be
271 long k = (long) key;
272 if (k < 0)
273 k = -k;
274
275 int position = (int) (k % n);
276 if (!hash_table[position])
277 return (wxObject *) NULL;
278 else
279 {
280 wxNode *node = hash_table[position]->Find (value);
281 if (node)
282 {
283 wxObject *data = node->Data ();
284 delete node;
285 return data;
286 }
287 else
288 return (wxObject *) NULL;
289 }
290}
291
292wxObject *wxHashTable::Delete (long key, const wxChar *value)
293{
294 int position = (int) (key % n);
295 if (!hash_table[position])
296 return (wxObject *) NULL;
297 else
298 {
299 wxNode *node = hash_table[position]->Find (value);
300 if (node)
301 {
302 wxObject *data = node->Data ();
303 delete node;
304 return data;
305 }
306 else
307 return (wxObject *) NULL;
308 }
309}
310
311long wxHashTable::MakeKey (const wxChar *string) const
312{
313 long int_key = 0;
314
315 while (*string)
316 int_key += (wxUChar) *string++;
317
318 return int_key;
319}
320
321void wxHashTable::BeginFind (void)
322{
323 current_position = -1;
324 current_node = (wxNode *) NULL;
325}
326
327wxNode *wxHashTable::Next (void)
328{
329 wxNode *found = (wxNode *) NULL;
330 bool end = FALSE;
331 while (!end && !found)
332 {
333 if (!current_node)
334 {
335 current_position++;
336 if (current_position >= n)
337 {
338 current_position = -1;
339 current_node = (wxNode *) NULL;
340 end = TRUE;
341 }
342 else
343 {
344 if (hash_table[current_position])
345 {
346 current_node = hash_table[current_position]->First ();
347 found = current_node;
348 }
349 }
350 }
351 else
352 {
353 current_node = current_node->Next ();
354 found = current_node;
355 }
356 }
357 return found;
358}
359
360void wxHashTable::DeleteContents (bool flag)
361{
362 int i;
363 for (i = 0; i < n; i++)
364 {
365 if (hash_table[i])
366 hash_table[i]->DeleteContents (flag);
367 }
368}
369
370void wxHashTable::Clear (void)
371{
372 int i;
373 for (i = 0; i < n; i++)
374 {
375 if (hash_table[i])
376 hash_table[i]->Clear ();
377 }
378}
379