Polygon Crucher SDK - Documentation
Documentation
Loading...
Searching...
No Matches
HashAssocMap.h
Go to the documentation of this file.
1//! @file HashAssocMap.h
2//! CHashAssocMap is a template class that associate a key to a severals values
3//!
4// KEY: must have zero-parameter and copy constructor,
5// operator= and operator!=
6// unsigned int Hash( const KEY & Key, int TableSize )
7// must be defined
8// CONSTRUCTION: with (a) no initializer;
9// Copy constructon of CHashAssocMap objects is DISALLOWED
10// Deep copy is supported
11//
12// ******************PUBLIC OPERATIONS*********************
13// int Insert( KEY X ) --> Insert X
14// int Remove( KEY X ) --> Remove X
15// KEY Find( KEY X ) --> Return item that matches X
16// int IsFound( KEY X ) --> Return 1 if X would be found
17// int IsEmpty( ) --> Return 1 if empty; else return 0
18// void Clear( ) --> Remove all items
19// ******************ERRORS********************************
20// Predefined exception is propogated if new fails
21
22#ifndef __CHASHEXMAP_H
23#define __CHASHEXMAP_H
24
25#include "HashMap.h"
26
27BEGIN_MOOTOOLS_NAMESPACE
28
29 #if defined(__WINDOWS__) && (_MSC_VER <= 1500)
30 #pragma warning(push)
31 #pragma warning(disable : 4181)
32 #endif
33
34 //! @class CHashAssocMap
35 //! @brief CHashAssocMap is a template class that associate a key to a severals values.
36 //! @details CHashAssocMap is an hash table of hash table.
37 //! Use of CAssociationMap is more compact and should be used whenever possible.
38 template <class KEY, class ARG_KEY, class VALUE>
39 class CHashAssocMap : protected CHashMap<KEY, ARG_KEY, CHashTable<VALUE> *>
40 {
41 public:
42 unsigned int GetCount() const; // Return the number of entries
43 unsigned int GetAssociationCount() const; // Return the total number of association
44 unsigned int GetAssociationCount(const ARG_KEY X) const; // Return the number of association for a given key
45
46 void MergeAssociation(const ARG_KEY K, const CHashTable<VALUE>& V);
47 int AddAssociation(const ARG_KEY K, const VALUE V);
48 int RemoveAssociation(const ARG_KEY K, const VALUE V, bool enableResize = false); // Return 1 if found, 0 if not. enableResize must be false if removal is done in a GetFirst/GetNext loop
49 int RemoveAssociations(const ARG_KEY K, bool enableResize = false); // Return 1 if found, 0 if not. enableResize must be false if removal is done in a GetFirst/GetNext loop
50 int IsAssociationFound(const ARG_KEY K, VALUE& V);
51 int GetFirstAssociationKey(const ARG_KEY X);
52 int GetFirstAssociationValue(const ARG_KEY X, VALUE& V);
53 // using CHashMap::IsFound;
54 CHashTable<VALUE> *GetAssociations(const ARG_KEY X) const;
55 HashPos GetFirst() const;
56 void GetNext(HashPos& pos, KEY *K, CHashTable<VALUE> *&Associations) const;
57 void GetNext(HashPos& pos, KEY& K, CHashTable<VALUE> *&Associations) const;
58 void GetNextKey(HashPos& pos, KEY *K) const;
59 void GetNextKey(HashPos& pos, KEY& K) const;
60 void Clear();
61 void Free();
62
63 virtual ~CHashAssocMap( );
64 };
65
66 template <class KEY, class ARG_KEY, class VALUE>
68 {
69 return CHashMap<KEY, ARG_KEY, CHashTable<VALUE> *>::GetCount();
70 }
71
72 template <class KEY, class ARG_KEY, class VALUE>
74 {
75 return CHashMap<KEY, ARG_KEY, CHashTable<VALUE> *>::GetFirst();
76 }
77
78 template <class KEY, class ARG_KEY, class VALUE>
80 {
82 }
83
84 template <class KEY, class ARG_KEY, class VALUE>
86 {
88 }
89
90 template <class KEY, class ARG_KEY, class VALUE>
92 {
95 }
96
97 template <class KEY, class ARG_KEY, class VALUE>
99 {
102 }
103
104 template <class KEY, class ARG_KEY, class VALUE>
106 {
107 KEY K;
109
110 HashPos pos = GetFirst();
111 while(pos != HashEnd)
112 {
113 GetNext(pos, K, values);
114 xDelete(values);
115 }
116
118 }
119
120 template <class KEY, class ARG_KEY, class VALUE>
121 void
123 {
126 }
127
128 template <class KEY, class ARG_KEY, class VALUE>
130 {
131 Clear();
132 }
133
134 // Insert X into hash table
135 // Return false if Xis a duplicate; true otherwise
136 // Rehash automatically as needed
137 template <class KEY, class ARG_KEY, class VALUE>
139 {
141
142 if (!Find(X, values))
143 {
145 values->Merge(V);
146 Insert(X, values);
147 }
148 else
149 values->Merge(V);
150 }
151
152 // Insert X into hash table
153 // Return false if Xis a duplicate; true otherwise
154 // Rehash automatically as needed
155 template <class KEY, class ARG_KEY, class VALUE>
157 {
159
160 if (!this->Find(X, values))
161 {
163 this->Insert(X, values);
164 }
165
166 return values->Insert(V);
167 }
168
169 template <class KEY, class ARG_KEY, class VALUE>
171 {
173
174 if (Find(X, values))
175 {
176 xDelete(values);
177 Remove(X, enableResize);
178
179 return 1;
180 }
181
182 return 0;
183 }
184
185 // Created 17/10/2001, Never tested
186 template <class KEY, class ARG_KEY, class VALUE>
188 {
190
191 if (Find(X, values) && values->Find(V))
192 return 1;
193
194 return 0;
195 }
196
197 template <class KEY, class ARG_KEY, class VALUE>
199 {
201
202 if (this->Find(X, values))
203 {
204 int result = values->Remove(V, enableResize);
205
206 // Remove association and key if empty
207 if (values->GetCount() == 0)
208 {
209 xDelete(values);
210 this->Remove(X, enableResize);
211 }
212
213 return result;
214 }
215
216 return 0;
217 }
218
219 template <class KEY, class ARG_KEY, class VALUE>
221 {
223
224 if (this->Find(X, values))
225 return values;
226
227 return NULL;
228 }
229
230 // Get the first value in a association
231 template <class KEY, class ARG_KEY, class VALUE>
233 {
234 HashPos pos = GetFirst();
235 if (pos == HashEnd)
236 {
237 XASSERT(0);
238 return false;
239 }
240
242 GetNext(pos, X, values);
243
244 return true;
245 }
246
247 // Get the first value in a association
248 template <class KEY, class ARG_KEY, class VALUE>
250 {
252
253 if (this->Find(X, values))
254 {
255 HashPos pos;
256 pos = values->GetFirst();
257 if (pos == HashEnd)
258 {
259 XASSERT(0);
260 return false;
261 }
262
263 values->GetNext(pos, V);
264 return true;
265 }
266
267 return false;
268 }
269
270 // Get the first value in a association
271 template <class KEY, class ARG_KEY, class VALUE>
273 {
275
276 if (Find(X, values))
277 return values->GetCount();
278
279 return 0;
280 }
281
282 // Get the first value in a association
283 template <class KEY, class ARG_KEY, class VALUE>
285 {
286 KEY X;
287 unsigned int count = 0;
288
289 CHashTable<VALUE> *assocs;
290 HashPos pos = GetFirst();
291 while (pos != HashEnd)
292 {
293 const_cast<CHashAssocMap<KEY, ARG_KEY, VALUE> *>(this)->GetNext(pos, X, assocs);
294 count += assocs->GetCount();
295 }
296
297 return count;
298 }
299
300 #if defined(__WINDOWS__) && (_MSC_VER <= 1500)
301 #pragma warning(pop)
302 #endif
303
304END_MOOTOOLS_NAMESPACE
305
306#endif // __CHASHEXMAP_H
Associates key to a single value through an hash table.
The class defines an x, y, z 3D point which can use int, float or double.
Definition 3DPoint.h:27
CHashAssocMap is a template class that associate a key to a severals values.
Definition HashAssocMap.h:40
CHashMap is a template class that associates key to a single value through an hash table.
Definition HashMap.h:42