Back to index

lightning-sunbird  0.9+nobinonly
nsElementMap.h
Go to the documentation of this file.
00001 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
00002  *
00003  * ***** BEGIN LICENSE BLOCK *****
00004  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
00005  *
00006  * The contents of this file are subject to the Mozilla Public License Version
00007  * 1.1 (the "License"); you may not use this file except in compliance with
00008  * the License. You may obtain a copy of the License at
00009  * http://www.mozilla.org/MPL/
00010  *
00011  * Software distributed under the License is distributed on an "AS IS" basis,
00012  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
00013  * for the specific language governing rights and limitations under the
00014  * License.
00015  *
00016  * The Original Code is Mozilla Communicator client code.
00017  *
00018  * The Initial Developer of the Original Code is
00019  * Netscape Communications Corporation.
00020  * Portions created by the Initial Developer are Copyright (C) 1998
00021  * the Initial Developer. All Rights Reserved.
00022  *
00023  * Contributor(s):
00024  *
00025  * Alternatively, the contents of this file may be used under the terms of
00026  * either of the GNU General Public License Version 2 or later (the "GPL"),
00027  * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00028  * in which case the provisions of the GPL or the LGPL are applicable instead
00029  * of those above. If you wish to allow use of your version of this file only
00030  * under the terms of either the GPL or the LGPL, and not to allow others to
00031  * use your version of this file under the terms of the MPL, indicate your
00032  * decision by deleting the provisions above and replace them with the notice
00033  * and other provisions required by the GPL or the LGPL. If you do not delete
00034  * the provisions above, a recipient may use your version of this file under
00035  * the terms of any one of the MPL, the GPL or the LGPL.
00036  *
00037  * ***** END LICENSE BLOCK *****
00038  *
00039  *
00040  * This Original Code has been modified by IBM Corporation.
00041  * Modifications made by IBM described herein are
00042  * Copyright (c) International Business Machines
00043  * Corporation, 2000
00044  *
00045  * Modifications to Mozilla code or documentation
00046  * identified per MPL Section 3.3
00047  *
00048  * Date         Modified by     Description of modification
00049  * 03/27/2000   IBM Corp.       Added PR_CALLBACK for Optlink
00050  *                               use in OS2
00051  */
00052 
00053 /*
00054 
00055    Maintains one-to-many mapping between element IDs and content
00056    nodes.
00057 
00058  */
00059 
00060 #ifndef nsElementMap_h__
00061 #define nsElementMap_h__
00062 
00063 #include "nscore.h"
00064 #include "nsError.h"
00065 #include "plhash.h"
00066 #include "nsIContent.h"
00067 #include "nsFixedSizeAllocator.h"
00068 
00069 class nsString;
00070 class nsISupportsArray;
00071 
00072 class nsElementMap
00073 {
00074 protected:
00075     PLHashTable* mMap;
00076     nsFixedSizeAllocator mPool;
00077 
00078     static PLHashAllocOps gAllocOps;
00079 
00080     class ContentListItem {
00081     public:
00082         ContentListItem* mNext;
00083         nsCOMPtr<nsIContent> mContent;
00084 
00085         static ContentListItem*
00086         Create(nsFixedSizeAllocator& aPool, nsIContent* aContent) {
00087             void* bytes = aPool.Alloc(sizeof(ContentListItem));
00088             return bytes ? new (bytes) ContentListItem(aContent) : nsnull; }
00089 
00090         static void
00091         Destroy(nsFixedSizeAllocator& aPool, ContentListItem* aItem) {
00092             delete aItem;
00093             aPool.Free(aItem, sizeof(*aItem)); }
00094 
00095     protected:
00096         static void* operator new(size_t aSize, void* aPtr) CPP_THROW_NEW {
00097             return aPtr; }
00098 
00099         static void operator delete(void* aPtr, size_t aSize) {
00100             /* do nothing; memory free()'d in Destroy() */ }
00101 
00102         ContentListItem(nsIContent* aContent) : mNext(nsnull), mContent(aContent) {
00103             MOZ_COUNT_CTOR(nsElementMap::ContentListItem); }
00104 
00105         ~ContentListItem() {
00106             MOZ_COUNT_DTOR(nsElementMap::ContentListItem); }
00107     };
00108 
00109     static PLHashNumber PR_CALLBACK
00110     Hash(const void* akey);
00111 
00112     static PRIntn PR_CALLBACK
00113     Compare(const void* aLeft, const void* aRight);
00114 
00115     static PRIntn PR_CALLBACK
00116     ReleaseContentList(PLHashEntry* aHashEntry, PRIntn aIndex, void* aClosure);
00117 
00118 public:
00119     nsElementMap(void);
00120     virtual ~nsElementMap();
00121 
00122     nsresult
00123     Add(const nsAString& aID, nsIContent* aContent);
00124 
00125     nsresult
00126     Remove(const nsAString& aID, nsIContent* aContent);
00127 
00128     nsresult
00129     Find(const nsAString& aID, nsISupportsArray* aResults);
00130 
00131     nsresult
00132     FindFirst(const nsAString& aID, nsIContent** aContent);
00133 
00134     typedef PRIntn (*nsElementMapEnumerator)(const PRUnichar* aID,
00135                                              nsIContent* aElement,
00136                                              void* aClosure);
00137 
00138     nsresult
00139     Enumerate(nsElementMapEnumerator aEnumerator, void* aClosure);
00140 
00141 private:
00142     struct EnumerateClosure {
00143         nsElementMap*          mSelf;
00144         nsElementMapEnumerator mEnumerator;
00145         void*                  mClosure;
00146     };
00147         
00148     static PRIntn PR_CALLBACK
00149     EnumerateImpl(PLHashEntry* aHashEntry, PRIntn aIndex, void* aClosure);
00150 };
00151 
00152 
00153 #endif // nsElementMap_h__