|
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
|
2 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
3 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. |
|
5 * This Original Code has been modified by IBM Corporation. |
|
6 * Modifications made by IBM described herein are |
|
7 * Copyright (c) International Business Machines |
|
8 * Corporation, 2000 |
|
9 * |
|
10 * Modifications to Mozilla code or documentation |
|
11 * identified per MPL Section 3.3 |
|
12 * |
|
13 * Date Modified by Description of modification |
|
14 * 04/20/2000 IBM Corp. Added PR_CALLBACK for Optlink use in OS2 |
|
15 */ |
|
16 |
|
17 /** |
|
18 * nsHashtable is OBSOLETE. Use nsTHashtable or a derivative instead. |
|
19 */ |
|
20 |
|
21 #ifndef nsHashtable_h__ |
|
22 #define nsHashtable_h__ |
|
23 |
|
24 #include "pldhash.h" |
|
25 #include "nscore.h" |
|
26 #include "nsISupports.h" |
|
27 #include "nsISupportsImpl.h" |
|
28 #include "nsStringFwd.h" |
|
29 |
|
30 class nsIObjectInputStream; |
|
31 class nsIObjectOutputStream; |
|
32 |
|
33 struct PRLock; |
|
34 |
|
35 class nsHashKey { |
|
36 protected: |
|
37 nsHashKey(void) { |
|
38 #ifdef DEBUG |
|
39 mKeyType = UnknownKey; |
|
40 #endif |
|
41 MOZ_COUNT_CTOR(nsHashKey); |
|
42 } |
|
43 |
|
44 |
|
45 public: |
|
46 // Virtual destructor because all hash keys are |delete|d via a |
|
47 // nsHashKey pointer. |
|
48 |
|
49 virtual ~nsHashKey(void); |
|
50 virtual uint32_t HashCode(void) const = 0; |
|
51 virtual bool Equals(const nsHashKey *aKey) const = 0; |
|
52 virtual nsHashKey *Clone() const = 0; |
|
53 virtual nsresult Write(nsIObjectOutputStream* aStream) const; |
|
54 |
|
55 #ifdef DEBUG |
|
56 public: |
|
57 // used for verification that we're casting to the correct key type |
|
58 enum nsHashKeyType { |
|
59 UnknownKey, |
|
60 SupportsKey, |
|
61 PRUint32Key, |
|
62 VoidKey, |
|
63 IDKey, |
|
64 CStringKey, |
|
65 StringKey |
|
66 }; |
|
67 nsHashKeyType GetKeyType() const { return mKeyType; } |
|
68 protected: |
|
69 nsHashKeyType mKeyType; |
|
70 #endif |
|
71 }; |
|
72 |
|
73 // Enumerator and Read/Write callback functions. |
|
74 |
|
75 // Return values for nsHashtableEnumFunc |
|
76 enum { |
|
77 kHashEnumerateStop = false, |
|
78 kHashEnumerateNext = true |
|
79 }; |
|
80 |
|
81 typedef bool |
|
82 (* nsHashtableEnumFunc)(nsHashKey *aKey, void *aData, void* aClosure); |
|
83 |
|
84 typedef nsresult |
|
85 (* nsHashtableReadEntryFunc)(nsIObjectInputStream *aStream, nsHashKey **aKey, |
|
86 void **aData); |
|
87 |
|
88 // NB: may be called with null aKey or aData, to free just one of the two. |
|
89 typedef void |
|
90 (* nsHashtableFreeEntryFunc)(nsIObjectInputStream *aStream, nsHashKey *aKey, |
|
91 void *aData); |
|
92 |
|
93 typedef nsresult |
|
94 (* nsHashtableWriteDataFunc)(nsIObjectOutputStream *aStream, void *aData); |
|
95 |
|
96 class nsHashtable { |
|
97 protected: |
|
98 // members |
|
99 PRLock* mLock; |
|
100 PLDHashTable mHashtable; |
|
101 bool mEnumerating; |
|
102 |
|
103 public: |
|
104 nsHashtable(uint32_t aSize = 16, bool aThreadSafe = false); |
|
105 virtual ~nsHashtable(); |
|
106 |
|
107 int32_t Count(void) { return mHashtable.entryCount; } |
|
108 bool Exists(nsHashKey *aKey); |
|
109 void *Put(nsHashKey *aKey, void *aData); |
|
110 void *Get(nsHashKey *aKey); |
|
111 void *Remove(nsHashKey *aKey); |
|
112 nsHashtable *Clone(); |
|
113 void Enumerate(nsHashtableEnumFunc aEnumFunc, void* aClosure = nullptr); |
|
114 void Reset(); |
|
115 void Reset(nsHashtableEnumFunc destroyFunc, void* aClosure = nullptr); |
|
116 |
|
117 nsHashtable(nsIObjectInputStream* aStream, |
|
118 nsHashtableReadEntryFunc aReadEntryFunc, |
|
119 nsHashtableFreeEntryFunc aFreeEntryFunc, |
|
120 nsresult *aRetVal); |
|
121 nsresult Write(nsIObjectOutputStream* aStream, |
|
122 nsHashtableWriteDataFunc aWriteDataFunc) const; |
|
123 }; |
|
124 |
|
125 //////////////////////////////////////////////////////////////////////////////// |
|
126 // nsObjectHashtable: an nsHashtable where the elements are C++ objects to be |
|
127 // deleted |
|
128 |
|
129 typedef void* (* nsHashtableCloneElementFunc)(nsHashKey *aKey, void *aData, void* aClosure); |
|
130 |
|
131 class nsObjectHashtable : public nsHashtable { |
|
132 public: |
|
133 nsObjectHashtable(nsHashtableCloneElementFunc cloneElementFun, |
|
134 void* cloneElementClosure, |
|
135 nsHashtableEnumFunc destroyElementFun, |
|
136 void* destroyElementClosure, |
|
137 uint32_t aSize = 16, bool threadSafe = false); |
|
138 ~nsObjectHashtable(); |
|
139 |
|
140 nsHashtable *Clone(); |
|
141 void Reset(); |
|
142 bool RemoveAndDelete(nsHashKey *aKey); |
|
143 |
|
144 protected: |
|
145 static PLDHashOperator CopyElement(PLDHashTable* table, |
|
146 PLDHashEntryHdr* hdr, |
|
147 uint32_t i, void *arg); |
|
148 |
|
149 nsHashtableCloneElementFunc mCloneElementFun; |
|
150 void* mCloneElementClosure; |
|
151 nsHashtableEnumFunc mDestroyElementFun; |
|
152 void* mDestroyElementClosure; |
|
153 }; |
|
154 |
|
155 //////////////////////////////////////////////////////////////////////////////// |
|
156 |
|
157 class nsPRUint32Key : public nsHashKey { |
|
158 protected: |
|
159 uint32_t mKey; |
|
160 public: |
|
161 nsPRUint32Key(uint32_t key) { |
|
162 #ifdef DEBUG |
|
163 mKeyType = PRUint32Key; |
|
164 #endif |
|
165 mKey = key; |
|
166 } |
|
167 |
|
168 uint32_t HashCode(void) const { |
|
169 return mKey; |
|
170 } |
|
171 |
|
172 bool Equals(const nsHashKey *aKey) const { |
|
173 return mKey == ((const nsPRUint32Key *) aKey)->mKey; |
|
174 } |
|
175 nsHashKey *Clone() const { |
|
176 return new nsPRUint32Key(mKey); |
|
177 } |
|
178 uint32_t GetValue() { return mKey; } |
|
179 }; |
|
180 |
|
181 // for null-terminated c-strings |
|
182 class nsCStringKey : public nsHashKey { |
|
183 public: |
|
184 |
|
185 // NB: when serializing, NEVER_OWN keys are deserialized as OWN. |
|
186 enum Ownership { |
|
187 NEVER_OWN, // very long lived, even clones don't need to copy it. |
|
188 OWN_CLONE, // as long lived as this key. But clones make a copy. |
|
189 OWN // to be free'd in key dtor. Clones make their own copy. |
|
190 }; |
|
191 |
|
192 nsCStringKey(const nsCStringKey& aStrKey); |
|
193 nsCStringKey(const char* str, int32_t strLen = -1, Ownership own = OWN_CLONE); |
|
194 nsCStringKey(const nsAFlatCString& str); |
|
195 nsCStringKey(const nsACString& str); |
|
196 ~nsCStringKey(void); |
|
197 |
|
198 uint32_t HashCode(void) const; |
|
199 bool Equals(const nsHashKey* aKey) const; |
|
200 nsHashKey* Clone() const; |
|
201 nsCStringKey(nsIObjectInputStream* aStream, nsresult *aResult); |
|
202 nsresult Write(nsIObjectOutputStream* aStream) const; |
|
203 |
|
204 // For when the owner of the hashtable wants to peek at the actual |
|
205 // string in the key. No copy is made, so be careful. |
|
206 const char* GetString() const { return mStr; } |
|
207 uint32_t GetStringLength() const { return mStrLen; } |
|
208 |
|
209 protected: |
|
210 char* mStr; |
|
211 uint32_t mStrLen; |
|
212 Ownership mOwnership; |
|
213 }; |
|
214 |
|
215 //////////////////////////////////////////////////////////////////////////////// |
|
216 |
|
217 #endif // nsHashtable_h__ |