/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* 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 TRANSFRMX_EXPANDEDNAMEMAP_H #define TRANSFRMX_EXPANDEDNAMEMAP_H #include "nsAutoPtr.h" #include "nsError.h" #include "txExpandedName.h" #include "nsTArray.h" class txExpandedNameMap_base { protected: /** * Adds an item, if an item with this key already exists an error is * returned * @param aKey key for item to add * @param aValue value of item to add * @return errorcode */ nsresult addItem(const txExpandedName& aKey, void* aValue); /** * Sets an item, if an item with this key already exists it is overwritten * with the new value * @param aKey key for item to set * @param aValue value of item to set * @return errorcode */ nsresult setItem(const txExpandedName& aKey, void* aValue, void** aOldValue); /** * Gets an item * @param aKey key for item to get * @return item with specified key, or null if no such item exists */ void* getItem(const txExpandedName& aKey) const; /** * Removes an item, deleting it if the map owns the values * @param aKey key for item to remove * @return item with specified key, or null if it has been deleted * or no such item exists */ void* removeItem(const txExpandedName& aKey); /** * Clears the items */ void clearItems() { mItems.Clear(); } class iterator_base { public: explicit iterator_base(txExpandedNameMap_base& aMap) : mMap(aMap), mCurrentPos(uint32_t(-1)) { } bool next() { return ++mCurrentPos < mMap.mItems.Length(); } const txExpandedName key() { NS_ASSERTION(mCurrentPos < mMap.mItems.Length(), "invalid position in txExpandedNameMap::iterator"); return txExpandedName(mMap.mItems[mCurrentPos].mNamespaceID, mMap.mItems[mCurrentPos].mLocalName); } protected: void* itemValue() { NS_ASSERTION(mCurrentPos < mMap.mItems.Length(), "invalid position in txExpandedNameMap::iterator"); return mMap.mItems[mCurrentPos].mValue; } private: txExpandedNameMap_base& mMap; uint32_t mCurrentPos; }; friend class iterator_base; friend class txMapItemComparator; struct MapItem { int32_t mNamespaceID; nsCOMPtr mLocalName; void* mValue; }; nsTArray mItems; }; template class txExpandedNameMap : public txExpandedNameMap_base { public: nsresult add(const txExpandedName& aKey, E* aValue) { return addItem(aKey, (void*)aValue); } nsresult set(const txExpandedName& aKey, E* aValue) { void* oldValue; return setItem(aKey, (void*)aValue, &oldValue); } E* get(const txExpandedName& aKey) const { return (E*)getItem(aKey); } E* remove(const txExpandedName& aKey) { return (E*)removeItem(aKey); } void clear() { clearItems(); } class iterator : public iterator_base { public: explicit iterator(txExpandedNameMap& aMap) : iterator_base(aMap) { } E* value() { return (E*)itemValue(); } }; }; template class txOwningExpandedNameMap : public txExpandedNameMap_base { public: ~txOwningExpandedNameMap() { clear(); } nsresult add(const txExpandedName& aKey, E* aValue) { return addItem(aKey, (void*)aValue); } nsresult set(const txExpandedName& aKey, E* aValue) { nsAutoPtr oldValue; return setItem(aKey, (void*)aValue, getter_Transfers(oldValue)); } E* get(const txExpandedName& aKey) const { return (E*)getItem(aKey); } void remove(const txExpandedName& aKey) { delete (E*)removeItem(aKey); } void clear() { uint32_t i, len = mItems.Length(); for (i = 0; i < len; ++i) { delete (E*)mItems[i].mValue; } clearItems(); } class iterator : public iterator_base { public: explicit iterator(txOwningExpandedNameMap& aMap) : iterator_base(aMap) { } E* value() { return (E*)itemValue(); } }; }; #endif //TRANSFRMX_EXPANDEDNAMEMAP_H