Line data Source code
1 : /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 : /* This Source Code Form is subject to the terms of the Mozilla Public
4 : * License, v. 2.0. If a copy of the MPL was not distributed with this
5 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 :
7 : #ifndef nsDataHashtable_h__
8 : #define nsDataHashtable_h__
9 :
10 : #include "nsHashKeys.h"
11 : #include "nsBaseHashtable.h"
12 : #include "mozilla/Maybe.h"
13 :
14 : /**
15 : * templated hashtable class maps keys to simple datatypes.
16 : * See nsBaseHashtable for complete declaration
17 : * @param KeyClass a wrapper-class for the hashtable key, see nsHashKeys.h
18 : * for a complete specification.
19 : * @param DataType the simple datatype being wrapped
20 : * @see nsInterfaceHashtable, nsClassHashtable
21 : */
22 : template<class KeyClass, class DataType>
23 948 : class nsDataHashtable
24 : : public nsBaseHashtable<KeyClass, DataType, DataType>
25 : {
26 : private:
27 : typedef nsBaseHashtable<KeyClass, DataType, DataType> BaseClass;
28 :
29 : public:
30 : using typename BaseClass::KeyType;
31 : using typename BaseClass::EntryType;
32 :
33 2272 : nsDataHashtable() {}
34 340 : explicit nsDataHashtable(uint32_t aInitLength)
35 340 : : BaseClass(aInitLength)
36 : {
37 340 : }
38 :
39 : /**
40 : * Retrieve the value for a key and remove the corresponding entry at
41 : * the same time.
42 : *
43 : * @param aKey the key to retrieve and remove
44 : * @return the found value, or Nothing if no entry was found with the
45 : * given key.
46 : */
47 0 : mozilla::Maybe<DataType> GetAndRemove(KeyType aKey)
48 : {
49 0 : mozilla::Maybe<DataType> value;
50 0 : if (EntryType* ent = this->GetEntry(aKey)) {
51 0 : value.emplace(mozilla::Move(ent->mData));
52 0 : this->RemoveEntry(ent);
53 : }
54 0 : return value;
55 : }
56 : };
57 :
58 : #endif // nsDataHashtable_h__
|