DOMNodeVector.cpp
上传用户:zhuqijet
上传日期:2013-06-25
资源大小:10074k
文件大小:6k
源码类别:

词法分析

开发平台:

Visual C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
  5.  * reserved.
  6.  *
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  *
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  *
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in
  16.  *    the documentation and/or other materials provided with the
  17.  *    distribution.
  18.  *
  19.  * 3. The end-user documentation included with the redistribution,
  20.  *    if any, must include the following acknowledgment:
  21.  *       "This product includes software developed by the
  22.  *        Apache Software Foundation (http://www.apache.org/)."
  23.  *    Alternately, this acknowledgment may appear in the software itself,
  24.  *    if and wherever such third-party acknowledgments normally appear.
  25.  *
  26.  * 4. The names "Xerces" and "Apache Software Foundation" must
  27.  *    not be used to endorse or promote products derived from this
  28.  *    software without prior written permission. For written
  29.  *    permission, please contact apache@apache.org.
  30.  *
  31.  * 5. Products derived from this software may not be called "Apache",
  32.  *    nor may "Apache" appear in their name, without prior written
  33.  *    permission of the Apache Software Foundation.
  34.  *
  35.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47.  * ====================================================================
  48.  *
  49.  * This software consists of voluntary contributions made by many
  50.  * individuals on behalf of the Apache Software Foundation, and was
  51.  * originally based on software copyright (c) 2001, International
  52.  * Business Machines, Inc., http://www.ibm.com .  For more information
  53.  * on the Apache Software Foundation, please see
  54.  * <http://www.apache.org/>.
  55.  */
  56. /*
  57.  * $Id: DOMNodeVector.cpp,v 1.3 2002/11/04 15:07:34 tng Exp $
  58.  */
  59. //
  60. // file:   DOMNodeVector.cpp
  61. // Implementation of class DOMNodeVector.
  62. // (Use of STL vector, or equivalent, would have been nice,
  63. // but is not available.  'DOMNode *' is the only type
  64. // kept in Vectors in this DOM implementation, so this is
  65. // a hardwired implementation for that type.
  66. //
  67. #include "DOMNodeVector.hpp"
  68. #include "DOMDocumentImpl.hpp"
  69. #include <assert.h>
  70. XERCES_CPP_NAMESPACE_BEGIN
  71. DOMNodeVector::DOMNodeVector(DOMDocument *doc)
  72. {
  73. init(doc, 10);
  74. };
  75. DOMNodeVector::DOMNodeVector(DOMDocument *doc, XMLSize_t size) {
  76. init(doc, size);
  77. };
  78. void DOMNodeVector::init(DOMDocument *doc, XMLSize_t size) {
  79.     assert(size > 0);
  80.     //data = new (doc) DOMNode *[size];
  81.     data = (DOMNode**) ((DOMDocumentImpl *)doc)->allocate(sizeof(DOMNode*) * size);
  82.     assert(data != 0);
  83.     XMLSize_t i;
  84.     for (i=0; i<size; i++)
  85.         data[i] = 0;
  86.     allocatedSize = size;
  87.     nextFreeSlot = 0;
  88. };
  89. DOMNodeVector::~DOMNodeVector() {
  90. };
  91. void DOMNodeVector::addElement(DOMNode *elem) {
  92. checkSpace();
  93. data[nextFreeSlot] = elem;
  94. ++nextFreeSlot;
  95. };
  96. void DOMNodeVector::checkSpace() {
  97.     if (nextFreeSlot == allocatedSize) {
  98.         XMLSize_t grow = allocatedSize/2;
  99.         if (grow < 50) grow = 50;
  100.         XMLSize_t newAllocatedSize = allocatedSize + grow;
  101.         DOMDocument *doc = data[0]->getOwnerDocument();
  102.         //DOMNode **newData = new (doc) DOMNode *[newAllocatedSize];
  103.         DOMNode **newData = (DOMNode**) ((DOMDocumentImpl *)doc)->allocate(sizeof(DOMNode*) * newAllocatedSize);
  104.         assert(newData != 0);
  105.         for (XMLSize_t i=0; i<allocatedSize; i++) {
  106.             newData[i] = data[i];
  107.         };
  108.         // delete [] data;  // revisit.  Can't delete!  Recycle?
  109.         allocatedSize = newAllocatedSize;
  110.         data = newData;
  111.     }
  112. }
  113. DOMNode *DOMNodeVector::elementAt(XMLSize_t index) {
  114.     if (index >= nextFreeSlot)
  115.         return 0;
  116. return data[index];
  117. };
  118. DOMNode *DOMNodeVector::lastElement() {
  119. if (nextFreeSlot == 0)
  120. return 0;
  121. return data[nextFreeSlot-1];
  122. };
  123. void DOMNodeVector::insertElementAt(DOMNode *elem, XMLSize_t index) {
  124. XMLSize_t i;
  125. assert(index <= nextFreeSlot);
  126. checkSpace();
  127. for (i=nextFreeSlot; i>index; --i) {
  128. data[i] = data[i-1];
  129. }
  130. data[index] = elem;
  131. ++nextFreeSlot;
  132. };
  133. void DOMNodeVector::removeElementAt(XMLSize_t index) {
  134. assert(index < nextFreeSlot);
  135. for (XMLSize_t i=index; i<nextFreeSlot-1; ++i) {
  136. data[i] = data[i+1];
  137. }
  138. --nextFreeSlot;
  139. };
  140. void DOMNodeVector::reset() {
  141. nextFreeSlot = 0;
  142. };
  143. void DOMNodeVector::setElementAt(DOMNode *elem, XMLSize_t index) {
  144. assert(index < nextFreeSlot);
  145. data[index] = elem;
  146. };
  147. XMLSize_t DOMNodeVector::size() {
  148. return nextFreeSlot;
  149. };
  150. XERCES_CPP_NAMESPACE_END