?? domnodevector.cpp
字號:
/* * Copyright 2001-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: DOMNodeVector.cpp,v 1.6 2004/09/08 13:55:52 peiyongz Exp $ *///// file: DOMNodeVector.cpp// Implementation of class DOMNodeVector.// (Use of STL vector, or equivalent, would have been nice,// but is not available. 'DOMNode *' is the only type// kept in Vectors in this DOM implementation, so this is// a hardwired implementation for that type.//#include "DOMNodeVector.hpp"#include "DOMDocumentImpl.hpp"#include <assert.h>XERCES_CPP_NAMESPACE_BEGINDOMNodeVector::DOMNodeVector(DOMDocument *doc){ init(doc, 10);}DOMNodeVector::DOMNodeVector(DOMDocument *doc, XMLSize_t size) { init(doc, size);}void DOMNodeVector::init(DOMDocument *doc, XMLSize_t size) { assert(size > 0); //data = new (doc) DOMNode *[size]; data = (DOMNode**) ((DOMDocumentImpl *)doc)->allocate(sizeof(DOMNode*) * size); assert(data != 0); XMLSize_t i; for (i=0; i<size; i++) data[i] = 0; allocatedSize = size; nextFreeSlot = 0;}DOMNodeVector::~DOMNodeVector() {}void DOMNodeVector::addElement(DOMNode *elem) { checkSpace(); data[nextFreeSlot] = elem; ++nextFreeSlot;}void DOMNodeVector::checkSpace() { if (nextFreeSlot == allocatedSize) { XMLSize_t grow = allocatedSize/2; if (grow < 10) grow = 10; XMLSize_t newAllocatedSize = allocatedSize + grow; DOMDocument *doc = data[0]->getOwnerDocument(); //DOMNode **newData = new (doc) DOMNode *[newAllocatedSize]; DOMNode **newData = (DOMNode**) ((DOMDocumentImpl *)doc)->allocate(sizeof(DOMNode*) * newAllocatedSize); assert(newData != 0); for (XMLSize_t i=0; i<allocatedSize; i++) { newData[i] = data[i]; } // delete [] data; // revisit. Can't delete! Recycle? allocatedSize = newAllocatedSize; data = newData; }} DOMNode *DOMNodeVector::elementAt(XMLSize_t index) { if (index >= nextFreeSlot) return 0; return data[index];}DOMNode *DOMNodeVector::lastElement() { if (nextFreeSlot == 0) return 0; return data[nextFreeSlot-1];}void DOMNodeVector::insertElementAt(DOMNode *elem, XMLSize_t index) { XMLSize_t i; assert(index <= nextFreeSlot); checkSpace(); for (i=nextFreeSlot; i>index; --i) { data[i] = data[i-1]; } data[index] = elem; ++nextFreeSlot;}void DOMNodeVector::removeElementAt(XMLSize_t index) { assert(index < nextFreeSlot); for (XMLSize_t i=index; i<nextFreeSlot-1; ++i) { data[i] = data[i+1]; } --nextFreeSlot;}void DOMNodeVector::reset() { nextFreeSlot = 0;}void DOMNodeVector::setElementAt(DOMNode *elem, XMLSize_t index) { assert(index < nextFreeSlot); data[index] = elem;}XMLSize_t DOMNodeVector::size() { return nextFreeSlot;} XERCES_CPP_NAMESPACE_END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -