/* * Copyright 1999-2002,2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * $Id: NodeVector.cpp 176026 2004-09-08 13:57:07Z peiyongz $ */ // // file: NodeVector.cpp // Implementation of class NodeVector. // (Use of STL vector, or equivalent, would have been nice, // but is not available. 'NodeImpl *' is the only type // kept in Vectors in this DOM implementation, so this is // a hardwired implementation for that type. // #include "NodeVector.hpp" #include #include XERCES_CPP_NAMESPACE_BEGIN NodeVector::NodeVector(MemoryManager* const manager) : fMemoryManager(manager) { init(10); }; NodeVector::NodeVector(unsigned int size, MemoryManager* const manager) : fMemoryManager(manager) { init(size); }; void NodeVector::init(unsigned int size) { assert(size > 0); data = (NodeImpl**) fMemoryManager->allocate(size * sizeof(NodeImpl*));//new NodeImpl *[size]; assert(data != 0); allocatedSize = size; nextFreeSlot = 0; }; NodeVector::~NodeVector() { fMemoryManager->deallocate(data);//delete [] data; }; void NodeVector::addElement(NodeImpl *elem) { checkSpace(); data[nextFreeSlot] = elem; ++nextFreeSlot; }; void NodeVector::checkSpace() { if (nextFreeSlot == allocatedSize) { unsigned int grow = allocatedSize/2; if (grow < 50) grow = 50; unsigned int newAllocatedSize = allocatedSize + grow; NodeImpl **newData = (NodeImpl**) fMemoryManager->allocate ( newAllocatedSize * sizeof(NodeImpl*) );//new NodeImpl *[newAllocatedSize]; assert(newData != 0); for (unsigned int i=0; ideallocate(data);//delete [] data; allocatedSize = newAllocatedSize; data = newData; }; }; NodeImpl *NodeVector::elementAt(unsigned int index) { if (index >= nextFreeSlot) return 0; return data[index]; }; NodeImpl *NodeVector::lastElement() { if (nextFreeSlot == 0) return 0; return data[nextFreeSlot-1]; }; void NodeVector::insertElementAt(NodeImpl *elem, unsigned int index) { unsigned int i; assert(index <= nextFreeSlot); checkSpace(); for (i=nextFreeSlot; i>index; --i) { data[i] = data[i-1]; } data[index] = elem; ++nextFreeSlot; }; void NodeVector::removeElementAt(unsigned int index) { assert(index < nextFreeSlot); for (unsigned int i=index; i