michael@0: /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- michael@0: * michael@0: * This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef nsNameSpaceMap_h__ michael@0: #define nsNameSpaceMap_h__ michael@0: michael@0: #include "nsCOMPtr.h" michael@0: #include "nsString.h" michael@0: #include "nsIAtom.h" michael@0: michael@0: class nsNameSpaceMap michael@0: { michael@0: public: michael@0: class Entry { michael@0: public: michael@0: Entry(const nsCSubstring& aURI, nsIAtom* aPrefix) michael@0: : mURI(aURI), mPrefix(aPrefix), mNext(nullptr) { michael@0: MOZ_COUNT_CTOR(nsNameSpaceMap::Entry); } michael@0: michael@0: ~Entry() { MOZ_COUNT_DTOR(nsNameSpaceMap::Entry); } michael@0: michael@0: nsCString mURI; michael@0: nsCOMPtr mPrefix; michael@0: michael@0: Entry* mNext; michael@0: }; michael@0: michael@0: nsNameSpaceMap(); michael@0: ~nsNameSpaceMap(); michael@0: michael@0: nsresult michael@0: Put(const nsAString& aURI, nsIAtom* aPrefix); michael@0: michael@0: nsresult michael@0: Put(const nsCSubstring& aURI, nsIAtom* aPrefix); michael@0: michael@0: class const_iterator { michael@0: protected: michael@0: friend class nsNameSpaceMap; michael@0: michael@0: const_iterator(const Entry* aCurrent) michael@0: : mCurrent(aCurrent) {} michael@0: michael@0: const Entry* mCurrent; michael@0: michael@0: public: michael@0: const_iterator() michael@0: : mCurrent(nullptr) {} michael@0: michael@0: const_iterator(const const_iterator& iter) michael@0: : mCurrent(iter.mCurrent) {} michael@0: michael@0: const_iterator& michael@0: operator=(const const_iterator& iter) { michael@0: mCurrent = iter.mCurrent; michael@0: return *this; } michael@0: michael@0: const_iterator& michael@0: operator++() { michael@0: mCurrent = mCurrent->mNext; michael@0: return *this; } michael@0: michael@0: const_iterator michael@0: operator++(int) { michael@0: const_iterator tmp(*this); michael@0: mCurrent = mCurrent->mNext; michael@0: return tmp; } michael@0: michael@0: const Entry* operator->() const { return mCurrent; } michael@0: michael@0: const Entry& operator*() const { return *mCurrent; } michael@0: michael@0: bool michael@0: operator==(const const_iterator& iter) const { michael@0: return mCurrent == iter.mCurrent; } michael@0: michael@0: bool michael@0: operator!=(const const_iterator& iter) const { michael@0: return ! iter.operator==(*this); } michael@0: }; michael@0: michael@0: const_iterator first() const { michael@0: return const_iterator(mEntries); } michael@0: michael@0: const_iterator last() const { michael@0: return const_iterator(nullptr); } michael@0: michael@0: const_iterator GetNameSpaceOf(const nsCSubstring& aURI) const; michael@0: michael@0: protected: michael@0: Entry* mEntries; michael@0: }; michael@0: michael@0: michael@0: #endif // nsNameSpaceMap_h__