ValueArrayOf.c
上传用户:huihehuasu
上传日期:2007-01-10
资源大小:6948k
文件大小:9k
源码类别:

xml/soap/webservice

开发平台:

C/C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  * 
  4.  * Copyright (c) 1999-2000 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) 1999, 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.  * $Log: ValueArrayOf.c,v $
  58.  * Revision 1.3  2000/03/02 19:54:47  roddey
  59.  * This checkin includes many changes done while waiting for the
  60.  * 1.1.0 code to be finished. I can't list them all here, but a list is
  61.  * available elsewhere.
  62.  *
  63.  * Revision 1.2  2000/02/06 07:48:04  rahulj
  64.  * Year 2K copyright swat.
  65.  *
  66.  * Revision 1.1.1.1  1999/11/09 01:05:26  twl
  67.  * Initial checkin
  68.  *
  69.  * Revision 1.2  1999/11/08 20:45:17  rahul
  70.  * Swat for adding in Product name and CVS comment log variable.
  71.  *
  72.  */
  73. // ---------------------------------------------------------------------------
  74. //  Includes
  75. // ---------------------------------------------------------------------------
  76. #if defined(XERCES_TMPLSINC)
  77. #include <util/ValueArrayOf.hpp>
  78. #endif
  79. // ---------------------------------------------------------------------------
  80. //  ValueArrayOf: Contructors and Destructor
  81. // ---------------------------------------------------------------------------
  82. template <class TElem> ValueArrayOf<TElem>::
  83. ValueArrayOf(const unsigned int size) :
  84.     fSize(size)
  85.     , fArray(0)
  86. {
  87.     fArray = new TElem[fSize];
  88. }
  89. template <class TElem> ValueArrayOf<TElem>::
  90. ValueArrayOf(const TElem* values, const unsigned int size) :
  91.     fSize(size)
  92.     , fArray(0)
  93. {
  94.     fArray = new TElem[fSize];
  95.     for (unsigned int index = 0; index < fSize; index++)
  96.         fArray[index] = values[index];
  97. }
  98. template <class TElem> ValueArrayOf<TElem>::
  99. ValueArrayOf(const ValueArrayOf<TElem>& source) :
  100.     fSize(source.fSize)
  101.     , fArray(0)
  102. {
  103.     fArray = new TElem[fSize];
  104.     for (unsigned int index = 0; index < fSize; index++)
  105.         fArray[index] = source.fArray[index];
  106. }
  107. template <class TElem> ValueArrayOf<TElem>::~ValueArrayOf()
  108. {
  109.     delete [] fArray;
  110. }
  111. // ---------------------------------------------------------------------------
  112. //  ValueArrayOf: Public operators
  113. // ---------------------------------------------------------------------------
  114. template <class TElem> TElem& ValueArrayOf<TElem>::
  115. operator[](const unsigned int index)
  116. {
  117.     if (index >= fSize)
  118.         ThrowXML(ArrayIndexOutOfBoundsException, XMLExcepts::Array_BadIndex);
  119.     return fArray[index];
  120. }
  121. template <class TElem> const TElem& ValueArrayOf<TElem>::
  122. operator[](const unsigned int index) const
  123. {
  124.     if (index >= fSize)
  125.         ThrowXML(ArrayIndexOutOfBoundsException, XMLExcepts::Array_BadIndex);
  126.     return fArray[index];
  127. }
  128. template <class TElem> ValueArrayOf<TElem>& ValueArrayOf<TElem>::
  129. operator=(const ValueArrayOf<TElem>& toAssign)
  130. {
  131.     if (this == &toAssign)
  132.         return *this;
  133.     // Reallocate if not the same size
  134.     if (toAssign.fSize != fSize)
  135.     {
  136.         delete [] fArray;
  137.         fSize = toAssign.fSize;
  138.         fArray = new TElem[fSize];
  139.     }
  140.     // Copy over the source elements
  141.     for (unsigned int index = 0; index < fSize; index++)
  142.         fArray[index] = toAssign.fArray[index];
  143.     return *this;
  144. }
  145. template <class TElem> bool ValueArrayOf<TElem>::
  146. operator==(const ValueArrayOf<TElem>& toCompare) const
  147. {
  148.     if (this == &toCompare)
  149.         return true;
  150.     if (fSize != toCompare.fSize)
  151.         return false;
  152.     for (unsigned int index = 0; index < fSize; index++)
  153.     {
  154.         if (fArray[index] != toCompare.fArray[index])
  155.             return false;
  156.     }
  157.     return true;
  158. }
  159. template <class TElem> bool ValueArrayOf<TElem>::
  160. operator!=(const ValueArrayOf<TElem>& toCompare) const
  161. {
  162.     return !operator==(toCompare);
  163. }
  164. // ---------------------------------------------------------------------------
  165. //  ValueArrayOf: Copy operations
  166. // ---------------------------------------------------------------------------
  167. template <class TElem> unsigned int ValueArrayOf<TElem>::
  168. copyFrom(const ValueArrayOf<TElem>& srcArray)
  169. {
  170.     //
  171.     //  Copy over as many of the source elements as will fit into
  172.     //  this array.
  173.     //
  174.     const unsigned int count = fSize < srcArray.fSize ?
  175.                                 fSize : srcArray.fSize;
  176.     for (unsigned int index = 0; index < count; index++)
  177.         fArray[index] = srcArray.fArray[index];
  178.     return count;
  179. }
  180. // ---------------------------------------------------------------------------
  181. //  ValueArrayOf: Getter methods
  182. // ---------------------------------------------------------------------------
  183. template <class TElem> unsigned int ValueArrayOf<TElem>::
  184. length() const
  185. {
  186.     return fSize;
  187. }
  188. template <class TElem> TElem* ValueArrayOf<TElem>::
  189. rawData() const
  190. {
  191.     return fArray;
  192. }
  193. // ---------------------------------------------------------------------------
  194. //  ValueArrayOf: Miscellaneous methods
  195. // ---------------------------------------------------------------------------
  196. template <class TElem> void ValueArrayOf<TElem>::
  197. resize(const unsigned int newSize)
  198. {
  199.     if (newSize == fSize)
  200.         return;
  201.     if (newSize < fSize)
  202.         ThrowXML(IllegalArgumentException, XMLExcepts::Array_BadNewSize);
  203.     // Allocate the new array
  204.     TElem* newArray = new TElem[newSize];
  205.     // Copy the existing values
  206.     unsigned int index = 0;
  207.     for (; index < fSize; index++)
  208.         newArray[index] = fArray[index];
  209.     for (; index < newSize; index++)
  210.         newArray[index] = TElem(0);
  211.     // Delete the old array and udpate our members
  212.     delete [] fArray;
  213.     fArray = newArray;
  214.     fSize = newSize;
  215. }
  216. // ---------------------------------------------------------------------------
  217. //  ValueArrayEnumerator: Constructors and Destructor
  218. // ---------------------------------------------------------------------------
  219. template <class TElem> ValueArrayEnumerator<TElem>::
  220. ValueArrayEnumerator(ValueArrayOf<TElem>* const toEnum, const bool adopt) :
  221.     fAdopted(adopt)
  222.     , fCurIndex(0)
  223.     , fToEnum(toEnum)
  224. {
  225. }
  226. template <class TElem> ValueArrayEnumerator<TElem>::~ValueArrayEnumerator()
  227. {
  228.     if (fAdopted)
  229.         delete fToEnum;
  230. }
  231. // ---------------------------------------------------------------------------
  232. //  ValueArrayEnumerator: Enum interface
  233. // ---------------------------------------------------------------------------
  234. template <class TElem> bool ValueArrayEnumerator<TElem>::hasMoreElements() const
  235. {
  236.     if (fCurIndex >= fToEnum->length())
  237.         return false;
  238.     return true;
  239. }
  240. template <class TElem> TElem& ValueArrayEnumerator<TElem>::nextElement()
  241. {
  242.     return (*fToEnum)[fCurIndex++];
  243. }
  244. template <class TElem> void ValueArrayEnumerator<TElem>::Reset()
  245. {
  246.     fCurIndex = 0;
  247. }