nodevector.cpp

来自「IBM的解析xml的工具Xerces的源代码」· C++ 代码 · 共 145 行

CPP
145
字号
/* * 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,v 1.5 2004/09/08 13:55:44 peiyongz Exp $ */////	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 <xercesc/framework/MemoryManager.hpp>#include <assert.h>XERCES_CPP_NAMESPACE_BEGINNodeVector::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; i<allocatedSize; i++) {			newData[i] = data[i];		};		fMemoryManager->deallocate(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<nextFreeSlot-1; ++i) {		data[i] = data[i+1];	}	--nextFreeSlot;};void NodeVector::reset() {	nextFreeSlot = 0;};void NodeVector::setElementAt(NodeImpl *elem, unsigned int index) {	assert(index < nextFreeSlot);	data[index] = elem;};unsigned int NodeVector::size() {	return nextFreeSlot;};		XERCES_CPP_NAMESPACE_END

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?