diff --git a/src/xercesc/util/BaseRefVectorOf.hpp b/src/xercesc/util/BaseRefVectorOf.hpp index f7360d07b88ee0f29b54e0f1716357c20418328a..96da51777ba301e5994d84ea042f7365075d5f11 100644 --- a/src/xercesc/util/BaseRefVectorOf.hpp +++ b/src/xercesc/util/BaseRefVectorOf.hpp @@ -89,14 +89,14 @@ public : // Element management // ----------------------------------------------------------------------- void addElement(TElem* const toAdd); - void setElementAt(TElem* const toSet, const unsigned int setAt); + virtual void setElementAt(TElem* const toSet, const unsigned int setAt); void insertElementAt(TElem* const toInsert, const unsigned int insertAt); TElem* orphanElementAt(const unsigned int orphanAt); - void removeAllElements(); - void removeElementAt(const unsigned int removeAt); - void removeLastElement(); + virtual void removeAllElements(); + virtual void removeElementAt(const unsigned int removeAt); + virtual void removeLastElement(); bool containsElement(const TElem* const toCheck); - void cleanup(); + virtual void cleanup(); void reinitialize(); diff --git a/src/xercesc/util/RefArrayVectorOf.c b/src/xercesc/util/RefArrayVectorOf.c index 28b23faec58fbfa87796b16c715bd6a11044a9dc..8feae165cf3bfafb9b3ae0385da2205993d49a52 100644 --- a/src/xercesc/util/RefArrayVectorOf.c +++ b/src/xercesc/util/RefArrayVectorOf.c @@ -25,10 +25,82 @@ template <class TElem> RefArrayVectorOf<TElem>::~RefArrayVectorOf() if (fAdoptedElems) { for (unsigned int index = 0; index < fCurCount; index++) - fMemoryManager->deallocate(fElemList[index]);//delete[] fElemList[index]; + fMemoryManager->deallocate(fElemList[index]);//delete[] fElemList[index]; } fMemoryManager->deallocate(fElemList);//delete [] fElemList; } +template <class TElem> void +RefArrayVectorOf<TElem>::setElementAt(TElem* const toSet, const unsigned int setAt) +{ + if (setAt >= fCurCount) + ThrowXML(ArrayIndexOutOfBoundsException, XMLExcepts::Vector_BadIndex); + + if (fAdoptedElems) + fMemoryManager->deallocate(fElemList[setAt]); + + fElemList[setAt] = toSet; +} + +template <class TElem> void RefArrayVectorOf<TElem>::removeAllElements() +{ + for (unsigned int index = 0; index < fCurCount; index++) + { + if (fAdoptedElems) + fMemoryManager->deallocate(fElemList[index]); + + // Keep unused elements zero for sanity's sake + fElemList[index] = 0; + } + fCurCount = 0; +} + +template <class TElem> void RefArrayVectorOf<TElem>:: +removeElementAt(const unsigned int removeAt) +{ + if (removeAt >= fCurCount) + ThrowXML(ArrayIndexOutOfBoundsException, XMLExcepts::Vector_BadIndex); + + if (fAdoptedElems) + fMemoryManager->deallocate(fElemList[removeAt]); + + // Optimize if its the last element + if (removeAt == fCurCount-1) + { + fElemList[removeAt] = 0; + fCurCount--; + return; + } + + // Copy down every element above remove point + for (unsigned int index = removeAt; index < fCurCount-1; index++) + fElemList[index] = fElemList[index+1]; + + // Keep unused elements zero for sanity's sake + fElemList[fCurCount-1] = 0; + + // And bump down count + fCurCount--; +} + +template <class TElem> void RefArrayVectorOf<TElem>::removeLastElement() +{ + if (!fCurCount) + return; + fCurCount--; + + if (fAdoptedElems) + fMemoryManager->deallocate(fElemList[fCurCount]); +} + +template <class TElem> void RefArrayVectorOf<TElem>::cleanup() +{ + if (fAdoptedElems) + { + for (unsigned int index = 0; index < fCurCount; index++) + fMemoryManager->deallocate(fElemList[index]); + } + fMemoryManager->deallocate(fElemList);//delete [] fElemList; +} XERCES_CPP_NAMESPACE_END diff --git a/src/xercesc/util/RefArrayVectorOf.hpp b/src/xercesc/util/RefArrayVectorOf.hpp index 2a3a1d49b21594c109ba330c4a2665259343f85d..b73b8b65f055673a9e0b2c7a0c4fcc8b2640c06d 100644 --- a/src/xercesc/util/RefArrayVectorOf.hpp +++ b/src/xercesc/util/RefArrayVectorOf.hpp @@ -24,6 +24,14 @@ public : // ----------------------------------------------------------------------- ~RefArrayVectorOf(); + // ----------------------------------------------------------------------- + // Element management + // ----------------------------------------------------------------------- + void setElementAt(TElem* const toSet, const unsigned int setAt); + void removeAllElements(); + void removeElementAt(const unsigned int removeAt); + void removeLastElement(); + void cleanup(); }; XERCES_CPP_NAMESPACE_END