xpcom/glue/nsClassHashtable.h

branch
TOR_BUG_9701
changeset 8
97036ab72558
equal deleted inserted replaced
-1:000000000000 0:fc831fd2842e
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
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
6 #ifndef nsClassHashtable_h__
7 #define nsClassHashtable_h__
8
9 #include "nsBaseHashtable.h"
10 #include "nsHashKeys.h"
11 #include "nsAutoPtr.h"
12
13 /**
14 * templated hashtable class maps keys to C++ object pointers.
15 * See nsBaseHashtable for complete declaration.
16 * @param KeyClass a wrapper-class for the hashtable key, see nsHashKeys.h
17 * for a complete specification.
18 * @param Class the class-type being wrapped
19 * @see nsInterfaceHashtable, nsClassHashtable
20 */
21 template<class KeyClass,class T>
22 class nsClassHashtable :
23 public nsBaseHashtable< KeyClass, nsAutoPtr<T>, T* >
24 {
25 public:
26 typedef typename KeyClass::KeyType KeyType;
27 typedef T* UserDataType;
28 typedef nsBaseHashtable< KeyClass, nsAutoPtr<T>, T* > base_type;
29
30 nsClassHashtable()
31 {
32 }
33 explicit nsClassHashtable(uint32_t aInitSize)
34 : nsBaseHashtable<KeyClass,nsAutoPtr<T>,T*>(aInitSize)
35 {
36 }
37
38 /**
39 * @copydoc nsBaseHashtable::Get
40 * @param pData if the key doesn't exist, pData will be set to nullptr.
41 */
42 bool Get(KeyType aKey, UserDataType* pData) const;
43
44 /**
45 * @copydoc nsBaseHashtable::Get
46 * @returns nullptr if the key is not present.
47 */
48 UserDataType Get(KeyType aKey) const;
49
50 /**
51 * Remove the entry for the given key from the hashtable and return it in
52 * aOut. If the key is not in the hashtable, aOut's pointer is set to
53 * nullptr.
54 *
55 * Normally, an entry is deleted when it's removed from an nsClassHashtable,
56 * but this function transfers ownership of the entry back to the caller
57 * through aOut -- the entry will be deleted when aOut goes out of scope.
58 *
59 * @param aKey the key to get and remove from the hashtable
60 */
61 void RemoveAndForget(KeyType aKey, nsAutoPtr<T> &aOut);
62 };
63
64 //
65 // nsClassHashtable definitions
66 //
67
68 template<class KeyClass,class T>
69 bool
70 nsClassHashtable<KeyClass,T>::Get(KeyType aKey, T** retVal) const
71 {
72 typename base_type::EntryType* ent = this->GetEntry(aKey);
73
74 if (ent)
75 {
76 if (retVal)
77 *retVal = ent->mData;
78
79 return true;
80 }
81
82 if (retVal)
83 *retVal = nullptr;
84
85 return false;
86 }
87
88 template<class KeyClass,class T>
89 T*
90 nsClassHashtable<KeyClass,T>::Get(KeyType aKey) const
91 {
92 typename base_type::EntryType* ent = this->GetEntry(aKey);
93
94 if (!ent)
95 return nullptr;
96
97 return ent->mData;
98 }
99
100 template<class KeyClass,class T>
101 void
102 nsClassHashtable<KeyClass,T>::RemoveAndForget(KeyType aKey, nsAutoPtr<T> &aOut)
103 {
104 aOut = nullptr;
105 nsAutoPtr<T> ptr;
106
107 typename base_type::EntryType *ent = this->GetEntry(aKey);
108 if (!ent)
109 return;
110
111 // Transfer ownership from ent->mData into aOut.
112 aOut = ent->mData;
113
114 this->Remove(aKey);
115 }
116
117 #endif // nsClassHashtable_h__

mercurial