diff options
Diffstat (limited to '')
-rw-r--r-- | xpcom/ds/nsJSThingHashtable.h | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/xpcom/ds/nsJSThingHashtable.h b/xpcom/ds/nsJSThingHashtable.h new file mode 100644 index 0000000000..c84a9a9ad7 --- /dev/null +++ b/xpcom/ds/nsJSThingHashtable.h @@ -0,0 +1,60 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef nsJSThingHashtable_h__ +#define nsJSThingHashtable_h__ + +#include "js/RootingAPI.h" +#include "nsHashKeys.h" +#include "nsBaseHashtable.h" + +namespace JS { +template <class T> +class Heap; +} /* namespace JS */ + +/** + * A wrapper for hash keys that sets ALLOW_MEMMOVE to false. + * + * This is used in the implementation of nsJSThingHashtable and is not intended + * to be used directly. + * + * It is necessary for hash tables containing JS::Heap<T> values as these must + * be copied rather than memmoved. + */ +template <class T> +class nsHashKeyDisallowMemmove : public T { + public: + explicit nsHashKeyDisallowMemmove(const typename T::KeyTypePointer aKey) + : T(aKey) {} + enum { ALLOW_MEMMOVE = false }; +}; + +/** + * Templated hashtable class for use on the heap where the values are JS GC + * things. + * + * Storing JS GC thing pointers on the heap requires wrapping them in a + * JS::Heap<T>, and this class takes care of that while presenting an interface + * in terms of the wrapped type T. + * + * For example, to store a hashtable mapping strings to JSObject pointers, you + * can declare a data member like this: + * + * nsJSThingHashtable<nsStringHashKey, JSObject*> mStringToObjectMap; + * + * See nsBaseHashtable for complete declaration + * @param KeyClass a wrapper-class for the hashtable key, see nsHashKeys.h + * for a complete specification. + * @param DataType the datatype being wrapped, must be a JS GC thing. + * @see nsInterfaceHashtable, nsClassHashtable + */ +template <class KeyClass, class DataType> +class nsJSThingHashtable + : public nsBaseHashtable<nsHashKeyDisallowMemmove<KeyClass>, + JS::Heap<DataType>, DataType> {}; + +#endif // nsJSThingHashtable_h__ |