From 4002c7682ecadf8089e1e5c4867cec74adc057f9 Mon Sep 17 00:00:00 2001
From: David Abram Cargill <cargilld@apache.org>
Date: Fri, 19 Nov 2004 00:50:22 +0000
Subject: [PATCH] Memory improvement to utility classes from Christian Will. 
 Remove dependency on XMemory.

git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@176205 13f79535-47bb-0310-9956-ffa450edef68
---
 src/xercesc/util/NameIdPool.c            | 20 ++++++++++--------
 src/xercesc/util/NameIdPool.hpp          |  5 ++++-
 src/xercesc/util/RefHash2KeysTableOf.c   | 26 +++++++++++++++++-------
 src/xercesc/util/RefHash2KeysTableOf.hpp |  5 ++++-
 src/xercesc/util/RefHash3KeysIdPool.c    | 14 +++++++++----
 src/xercesc/util/RefHash3KeysIdPool.hpp  |  6 +++++-
 src/xercesc/util/RefHashTableOf.c        | 24 ++++++++++++++++++----
 src/xercesc/util/RefHashTableOf.hpp      |  6 +++++-
 src/xercesc/util/ValueHashTableOf.c      | 18 +++++++++++-----
 src/xercesc/util/ValueHashTableOf.hpp    |  3 ++-
 10 files changed, 93 insertions(+), 34 deletions(-)

diff --git a/src/xercesc/util/NameIdPool.c b/src/xercesc/util/NameIdPool.c
index 873f14cad..74f35f4f1 100644
--- a/src/xercesc/util/NameIdPool.c
+++ b/src/xercesc/util/NameIdPool.c
@@ -16,8 +16,8 @@
 
 /**
  * $Log$
- * Revision 1.10  2004/11/18 01:35:20  cargilld
- * Performance improvement to utility classes from Christian Will.  Avoid unnecessary checks and replace with assert calls.
+ * Revision 1.11  2004/11/19 00:50:22  cargilld
+ * Memory improvement to utility classes from Christian Will.  Remove dependency on XMemory.
  *
  * Revision 1.9  2004/09/08 13:56:22  peiyongz
  * Apache License Version 2.0
@@ -73,6 +73,7 @@
 #include <xercesc/util/IllegalArgumentException.hpp>
 #include <xercesc/util/NoSuchElementException.hpp>
 #include <xercesc/util/RuntimeException.hpp>
+#include <new>
 #include <assert.h>
 
 XERCES_CPP_NAMESPACE_BEGIN
@@ -172,7 +173,9 @@ template <class TElem> void NameIdPool<TElem>::removeAll()
             nextElem = curElem->fNext;
 
             delete curElem->fData;
-            delete curElem;
+            // destructor is empty...
+            // curElem->~NameIdPoolBucketElem();
+            fMemoryManager->deallocate(curElem);
 
             curElem = nextElem;
         }
@@ -255,11 +258,9 @@ unsigned int NameIdPool<TElem>::put(TElem* const elemToAdopt)
     }
 
     // Create a new bucket element and add it to the appropriate list
-    NameIdPoolBucketElem<TElem>* newBucket = new (fMemoryManager) NameIdPoolBucketElem<TElem>
-    (
-        elemToAdopt
-        , fBucketList[hashVal]
-    );
+    NameIdPoolBucketElem<TElem>* newBucket =
+        new (fMemoryManager->allocate(sizeof(NameIdPoolBucketElem<TElem>)))
+        NameIdPoolBucketElem<TElem>(elemToAdopt,fBucketList[hashVal]);
     fBucketList[hashVal] = newBucket;
 
     //
@@ -304,7 +305,7 @@ findBucketElem(const XMLCh* const key, unsigned int& hashVal)
     // Hash the key
     hashVal = XMLString::hash(key, fHashModulus, fMemoryManager);
 
-    assert(hashVal < fHashModulus);
+    assert(hashVal < fHashModulus);        
 
     // Search that bucket for the key
     NameIdPoolBucketElem<TElem>* curElem = fBucketList[hashVal];
@@ -323,6 +324,7 @@ findBucketElem(const XMLCh* const key, unsigned int& hashVal) const
 {
     // Hash the key
     hashVal = XMLString::hash(key, fHashModulus, fMemoryManager);
+
     assert(hashVal < fHashModulus);
 
     // Search that bucket for the key
diff --git a/src/xercesc/util/NameIdPool.hpp b/src/xercesc/util/NameIdPool.hpp
index 244377e93..280023179 100644
--- a/src/xercesc/util/NameIdPool.hpp
+++ b/src/xercesc/util/NameIdPool.hpp
@@ -16,6 +16,9 @@
 
 /*
  * $Log$
+ * Revision 1.12  2004/11/19 00:50:22  cargilld
+ * Memory improvement to utility classes from Christian Will.  Remove dependency on XMemory.
+ *
  * Revision 1.11  2004/09/23 07:10:13  amassari
  * Removed const from variable declaration (jira#1259)
  *
@@ -117,7 +120,7 @@ template <class TElem> class NameIdPoolEnumerator;
 //  lists for each bucket. Because some of the compilers we have to support
 //  are totally brain dead, it cannot be a nested class as it should be.
 //
-template <class TElem> struct NameIdPoolBucketElem : public XMemory
+template <class TElem> struct NameIdPoolBucketElem
 {
 public :
     NameIdPoolBucketElem
diff --git a/src/xercesc/util/RefHash2KeysTableOf.c b/src/xercesc/util/RefHash2KeysTableOf.c
index 9ba5c40bc..85e680f8d 100644
--- a/src/xercesc/util/RefHash2KeysTableOf.c
+++ b/src/xercesc/util/RefHash2KeysTableOf.c
@@ -16,8 +16,8 @@
 
 /**
  * $Log$
- * Revision 1.12  2004/11/18 01:35:20  cargilld
- * Performance improvement to utility classes from Christian Will.  Avoid unnecessary checks and replace with assert calls.
+ * Revision 1.13  2004/11/19 00:50:22  cargilld
+ * Memory improvement to utility classes from Christian Will.  Remove dependency on XMemory.
  *
  * Revision 1.11  2004/09/22 11:14:22  amassari
  * Reorder initialization of variables in constructor
@@ -80,6 +80,7 @@
 
 #include <xercesc/util/NullPointerException.hpp>
 #include <assert.h>
+#include <new>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -208,7 +209,9 @@ template <class TVal> void RefHash2KeysTableOf<TVal>::removeAll()
                 delete curElem->fData;
 
             // Then delete the current element and move forward
-            delete curElem;
+            // destructor is empty...
+            // curElem->~RefHash2KeysTableBucketElem();
+            fMemoryManager->deallocate(curElem);
             curElem = nextElem;
         }
 
@@ -223,6 +226,7 @@ template <class TVal> void RefHash2KeysTableOf<TVal>::transferElement(const void
     // Hash the key
     unsigned int hashVal = fHash->getHashVal(key1, fHashModulus);
     assert(hashVal < fHashModulus);
+
     //
     //  Search the given bucket for this key. Keep up with the previous
     //  element so we can patch around it.
@@ -254,7 +258,10 @@ template <class TVal> void RefHash2KeysTableOf<TVal>::transferElement(const void
             curElem = curElem->fNext;
 
             // Delete the current element
-            delete elemToDelete;
+            // delete elemToDelete;
+            // destructor is empty...
+            // curElem->~RefHash2KeysTableBucketElem();
+            fMemoryManager->deallocate(elemToDelete);           
         }
         else
         {
@@ -324,7 +331,9 @@ template <class TVal> void RefHash2KeysTableOf<TVal>::put(void* key1, int key2,
     }
      else
     {
-        newBucket = new (fMemoryManager) RefHash2KeysTableBucketElem<TVal>(key1, key2, valueToAdopt, fBucketList[hashVal]);
+        newBucket =
+            new (fMemoryManager->allocate(sizeof(RefHash2KeysTableBucketElem<TVal>)))
+            RefHash2KeysTableBucketElem<TVal>(key1, key2, valueToAdopt, fBucketList[hashVal]);
         fBucketList[hashVal] = newBucket;
     }
 }
@@ -407,8 +416,11 @@ removeBucketElem(const void* const key1, const int key2, unsigned int& hashVal)
                 delete curElem->fData;
 
             // Delete the current element
-            delete curElem;
-
+            // delete curElem;
+            // destructor is empty...
+            // curElem->~RefHash2KeysTableBucketElem();
+            fMemoryManager->deallocate(curElem);
+            
             return;
         }
 
diff --git a/src/xercesc/util/RefHash2KeysTableOf.hpp b/src/xercesc/util/RefHash2KeysTableOf.hpp
index 0a1bb2a45..7bf287d34 100644
--- a/src/xercesc/util/RefHash2KeysTableOf.hpp
+++ b/src/xercesc/util/RefHash2KeysTableOf.hpp
@@ -16,6 +16,9 @@
 
 /*
  * $Log$
+ * Revision 1.13  2004/11/19 00:50:22  cargilld
+ * Memory improvement to utility classes from Christian Will.  Remove dependency on XMemory.
+ *
  * Revision 1.12  2004/09/08 13:56:22  peiyongz
  * Apache License Version 2.0
  *
@@ -101,7 +104,7 @@ template <class TVal> struct RefHash2KeysTableBucketElem;
 //  This should really be a nested class, but some of the compilers we
 //  have to support cannot deal with that!
 //
-template <class TVal> struct RefHash2KeysTableBucketElem : public XMemory
+template <class TVal> struct RefHash2KeysTableBucketElem
 {
     RefHash2KeysTableBucketElem(void* key1, int key2, TVal* const value, RefHash2KeysTableBucketElem<TVal>* next)
 		: fData(value), fNext(next), fKey1(key1), fKey2(key2)
diff --git a/src/xercesc/util/RefHash3KeysIdPool.c b/src/xercesc/util/RefHash3KeysIdPool.c
index 9fb9294e1..f678ac10a 100644
--- a/src/xercesc/util/RefHash3KeysIdPool.c
+++ b/src/xercesc/util/RefHash3KeysIdPool.c
@@ -16,8 +16,8 @@
 
 /**
  * $Log$
- * Revision 1.14  2004/11/18 01:35:20  cargilld
- * Performance improvement to utility classes from Christian Will.  Avoid unnecessary checks and replace with assert calls.
+ * Revision 1.15  2004/11/19 00:50:22  cargilld
+ * Memory improvement to utility classes from Christian Will.  Remove dependency on XMemory.
  *
  * Revision 1.13  2004/09/08 13:56:22  peiyongz
  * Apache License Version 2.0
@@ -83,6 +83,7 @@
 
 #include <xercesc/util/NullPointerException.hpp>
 #include <assert.h>
+#include <new>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -251,7 +252,10 @@ template <class TVal> void RefHash3KeysIdPool<TVal>::removeAll()
                 delete curElem->fData;
 
             // Then delete the current element and move forward
-            delete curElem;
+            // delete curElem;
+            // destructor is empty...
+            // curElem->~RefHash3KeysTableBucketElem();
+            fMemoryManager->deallocate(curElem);
             curElem = nextElem;
         }
 
@@ -350,7 +354,9 @@ RefHash3KeysIdPool<TVal>::put(void* key1, int key2, int key3, TVal* const valueT
 #if defined (XML_GCC_VERSION) && (XML_GCC_VERSION < 29600)
         newBucket = new RefHash3KeysTableBucketElem<TVal>(key1, key2, key3, valueToAdopt, fBucketList[hashVal]);
 #else
-        newBucket = new (fMemoryManager) RefHash3KeysTableBucketElem<TVal>(key1, key2, key3, valueToAdopt, fBucketList[hashVal]);
+        newBucket =
+            new (fMemoryManager->allocate(sizeof(RefHash3KeysTableBucketElem<TVal>)))
+            RefHash3KeysTableBucketElem<TVal>(key1, key2, key3, valueToAdopt, fBucketList[hashVal]);
 #endif
         fBucketList[hashVal] = newBucket;
     }
diff --git a/src/xercesc/util/RefHash3KeysIdPool.hpp b/src/xercesc/util/RefHash3KeysIdPool.hpp
index 95fa056b5..b80966422 100644
--- a/src/xercesc/util/RefHash3KeysIdPool.hpp
+++ b/src/xercesc/util/RefHash3KeysIdPool.hpp
@@ -16,6 +16,9 @@
 
 /*
  * $Log$
+ * Revision 1.12  2004/11/19 00:50:22  cargilld
+ * Memory improvement to utility classes from Christian Will.  Remove dependency on XMemory.
+ *
  * Revision 1.11  2004/09/08 13:56:22  peiyongz
  * Apache License Version 2.0
  *
@@ -98,7 +101,7 @@ template <class TVal> struct RefHash3KeysTableBucketElem;
 //  This should really be a nested class, but some of the compilers we
 //  have to support cannot deal with that!
 //
-template <class TVal> struct RefHash3KeysTableBucketElem : public XMemory
+template <class TVal> struct RefHash3KeysTableBucketElem
 {
     RefHash3KeysTableBucketElem(
               void* key1
@@ -115,6 +118,7 @@ template <class TVal> struct RefHash3KeysTableBucketElem : public XMemory
     }
     
     RefHash3KeysTableBucketElem() {};
+    ~RefHash3KeysTableBucketElem() {};
 
     TVal*  fData;
     RefHash3KeysTableBucketElem<TVal>*   fNext;
diff --git a/src/xercesc/util/RefHashTableOf.c b/src/xercesc/util/RefHashTableOf.c
index 1c49592b1..73c80fa2d 100644
--- a/src/xercesc/util/RefHashTableOf.c
+++ b/src/xercesc/util/RefHashTableOf.c
@@ -16,6 +16,9 @@
 
 /**
  * $Log$
+ * Revision 1.18  2004/11/19 00:50:22  cargilld
+ * Memory improvement to utility classes from Christian Will.  Remove dependency on XMemory.
+ *
  * Revision 1.17  2004/11/18 01:35:20  cargilld
  * Performance improvement to utility classes from Christian Will.  Avoid unnecessary checks and replace with assert calls.
  *
@@ -117,6 +120,7 @@
 
 #include <xercesc/util/NullPointerException.hpp>
 #include <assert.h>
+#include <new>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -254,7 +258,10 @@ template <class TVal> void RefHashTableOf<TVal>::removeAll()
                 delete curElem->fData;
 
             // Then delete the current element and move forward
-            delete curElem;
+ 	        // delete curElem;
+            // destructor doesn't do anything...
+			// curElem->~RefHashTableBucketElem();
+            fMemoryManager->deallocate(curElem);            
             curElem = nextElem;
         }
 
@@ -302,7 +309,10 @@ orphanKey(const void* const key)
             retVal = curElem->fData;
 
             // Delete the current element
-            delete curElem;
+            // delete curElem;
+            // destructor doesn't do anything...
+			// curElem->~RefHashTableBucketElem();
+            fMemoryManager->deallocate(curElem);            
             break;
         }
 
@@ -440,7 +450,10 @@ template <class TVal> void RefHashTableOf<TVal>::put(void* key, TVal* const valu
     }
      else
     {
-        newBucket = new (fMemoryManager) RefHashTableBucketElem<TVal>(key, valueToAdopt, fBucketList[hashVal]);
+        //newBucket = new (fMemoryManager) RefHashTableBucketElem<TVal>(key, valueToAdopt, fBucketList[hashVal]);
+		newBucket =
+             new (fMemoryManager->allocate(sizeof(RefHashTableBucketElem<TVal>)))
+             RefHashTableBucketElem<TVal>(key, valueToAdopt, fBucketList[hashVal]);        
         fBucketList[hashVal] = newBucket;
         fCount++;
     }
@@ -568,7 +581,10 @@ removeBucketElem(const void* const key, unsigned int& hashVal)
                 delete curElem->fData;
 
             // Delete the current element
-            delete curElem;
+            // delete curElem;
+            // destructor doesn't do anything...
+			// curElem->~RefHashTableBucketElem();
+            fMemoryManager->deallocate(curElem);            
 
             fCount--;
 
diff --git a/src/xercesc/util/RefHashTableOf.hpp b/src/xercesc/util/RefHashTableOf.hpp
index 5f806182f..94d32ad6e 100644
--- a/src/xercesc/util/RefHashTableOf.hpp
+++ b/src/xercesc/util/RefHashTableOf.hpp
@@ -16,6 +16,9 @@
 
 /*
  * $Log$
+ * Revision 1.16  2004/11/19 00:50:22  cargilld
+ * Memory improvement to utility classes from Christian Will.  Remove dependency on XMemory.
+ *
  * Revision 1.15  2004/09/08 13:56:23  peiyongz
  * Apache License Version 2.0
  *
@@ -130,7 +133,7 @@ template <class TVal> struct RefHashTableBucketElem;
 //  This should really be a nested class, but some of the compilers we
 //  have to support cannot deal with that!
 //
-template <class TVal> struct RefHashTableBucketElem : public XMemory
+template <class TVal> struct RefHashTableBucketElem
 {
     RefHashTableBucketElem(void* key, TVal* const value, RefHashTableBucketElem<TVal>* next)
 		: fData(value), fNext(next), fKey(key)
@@ -138,6 +141,7 @@ template <class TVal> struct RefHashTableBucketElem : public XMemory
         }
 
     RefHashTableBucketElem(){};
+    ~RefHashTableBucketElem(){};
 
     TVal*                           fData;
     RefHashTableBucketElem<TVal>*   fNext;
diff --git a/src/xercesc/util/ValueHashTableOf.c b/src/xercesc/util/ValueHashTableOf.c
index 2e9ce6325..549a34560 100644
--- a/src/xercesc/util/ValueHashTableOf.c
+++ b/src/xercesc/util/ValueHashTableOf.c
@@ -16,8 +16,8 @@
 
 /**
  * $Log$
- * Revision 1.10  2004/11/18 01:35:20  cargilld
- * Performance improvement to utility classes from Christian Will.  Avoid unnecessary checks and replace with assert calls.
+ * Revision 1.11  2004/11/19 00:50:22  cargilld
+ * Memory improvement to utility classes from Christian Will.  Remove dependency on XMemory.
  *
  * Revision 1.9  2004/09/08 13:56:23  peiyongz
  * Apache License Version 2.0
@@ -52,6 +52,7 @@
 
 #include <xercesc/util/NullPointerException.hpp>
 #include <assert.h>
+#include <new>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -153,7 +154,9 @@ template <class TVal> void ValueHashTableOf<TVal>::removeAll()
             nextElem = curElem->fNext;
 
             // delete the current element and move forward
-            delete curElem;
+            // destructor is empty...
+            // curElem->~ValueHashTableBucketElem();
+            fMemoryManager->deallocate(curElem);
             curElem = nextElem;
         }
 
@@ -208,7 +211,9 @@ template <class TVal> void ValueHashTableOf<TVal>::put(void* key, const TVal& va
     }
      else
     {
-        newBucket = new (fMemoryManager) ValueHashTableBucketElem<TVal>(key, valueToAdopt, fBucketList[hashVal]);
+        newBucket =            
+            new (fMemoryManager->allocate(sizeof(ValueHashTableBucketElem<TVal>)))
+            ValueHashTableBucketElem<TVal>(key, valueToAdopt, fBucketList[hashVal]);
         fBucketList[hashVal] = newBucket;
     }
 }
@@ -287,7 +292,10 @@ removeBucketElem(const void* const key, unsigned int& hashVal)
             }
 
             // Delete the current element
-            delete curElem;
+            // delete curElem;
+			// destructor is empty...
+            // curElem->~ValueHashTableBucketElem();
+            fMemoryManager->deallocate(curElem);                        
 
             return;
         }
diff --git a/src/xercesc/util/ValueHashTableOf.hpp b/src/xercesc/util/ValueHashTableOf.hpp
index fb2e658cf..9823096ca 100644
--- a/src/xercesc/util/ValueHashTableOf.hpp
+++ b/src/xercesc/util/ValueHashTableOf.hpp
@@ -45,13 +45,14 @@ template <class TVal> struct ValueHashTableBucketElem;
 //  This should really be a nested class, but some of the compilers we
 //  have to support cannot deal with that!
 //
-template <class TVal> struct ValueHashTableBucketElem : public XMemory
+template <class TVal> struct ValueHashTableBucketElem
 {
     ValueHashTableBucketElem(void* key, const TVal& value, ValueHashTableBucketElem<TVal>* next)
 		: fData(value), fNext(next), fKey(key)
         {
         }
     ValueHashTableBucketElem(){};
+    ~ValueHashTableBucketElem(){};
 
     TVal                           fData;
     ValueHashTableBucketElem<TVal>* fNext;
-- 
GitLab