RefArrayOf.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: RefArrayOf.c,v $
  58.  * Revision 1.3  2000/03/02 19:54:44  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:03  rahulj
  64.  * Year 2K copyright swat.
  65.  *
  66.  * Revision 1.1.1.1  1999/11/09 01:04:56  twl
  67.  * Initial checkin
  68.  *
  69.  * Revision 1.2  1999/11/08 20:45:12  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/RefArrayOf.hpp>
  78. #endif
  79. // ---------------------------------------------------------------------------
  80. //  RefArrayOf: Contructors and Destructor
  81. // ---------------------------------------------------------------------------
  82. template <class TElem> RefArrayOf<TElem>::RefArrayOf(const unsigned int size) :
  83.     fSize(size)
  84.     , fArray(0)
  85. {
  86.     fArray = new TElem*[fSize];
  87.     for (unsigned int index = 0; index < fSize; index++)
  88.         fArray[index] = 0;
  89. }
  90. template <class TElem> RefArrayOf<TElem>::
  91. RefArrayOf(TElem* values[], const unsigned int size) :
  92.     fSize(size)
  93.     , fArray(0)
  94. {
  95.     fArray = new TElem*[fSize];
  96.     for (unsigned int index = 0; index < fSize; index++)
  97.         fArray[index] = values[index];
  98. }
  99. template <class TElem> RefArrayOf<TElem>::
  100. RefArrayOf(const RefArrayOf<TElem>& source) :
  101.     fSize(source.fSize)
  102.     , fArray(0)
  103. {
  104.     fArray = new TElem*[fSize];
  105.     for (unsigned int index = 0; index < fSize; index++)
  106.         fArray[index] = source.fArray[index];
  107. }
  108. template <class TElem> RefArrayOf<TElem>::~RefArrayOf()
  109. {
  110.     delete [] fArray;
  111. }
  112. // ---------------------------------------------------------------------------
  113. //  RefArrayOf: Public operators
  114. // ---------------------------------------------------------------------------
  115. template <class TElem> TElem*& RefArrayOf<TElem>::
  116. operator[](const unsigned int index)
  117. {
  118.     if (index >= fSize)
  119.         ThrowXML(ArrayIndexOutOfBoundsException, XMLExcepts::Array_BadIndex);
  120.     return fArray[index];
  121. }
  122. template <class TElem> const TElem* RefArrayOf<TElem>::
  123. operator[](const unsigned int index) const
  124. {
  125.     if (index >= fSize)
  126.         ThrowXML(ArrayIndexOutOfBoundsException, XMLExcepts::Array_BadIndex);
  127.     return fArray[index];
  128. }
  129. template <class TElem> RefArrayOf<TElem>& RefArrayOf<TElem>::
  130. operator=(const RefArrayOf<TElem>& toAssign)
  131. {
  132.     if (this == &toAssign)
  133.         return *this;
  134.     // Reallocate if not the same size
  135.     if (toAssign.fSize != fSize)
  136.     {
  137.         delete [] fArray;
  138.         fSize = toAssign.fSize;
  139.         fArray = new TElem*[fSize];
  140.     }
  141.     // Copy over the source elements
  142.     for (unsigned int index = 0; index < fSize; index++)
  143.         fArray[index] = toAssign.fArray[index];
  144.     return *this;
  145. }
  146. template <class TElem> bool RefArrayOf<TElem>::
  147. operator==(const RefArrayOf<TElem>& toCompare) const
  148. {
  149.     if (this == &toCompare)
  150.         return true;
  151.     if (fSize != toCompare.fSize)
  152.         return false;
  153.     for (unsigned int index = 0; index < fSize; index++)
  154.     {
  155.         if (fArray[index] != toCompare.fArray[index])
  156.             return false;
  157.     }
  158.     return true;
  159. }
  160. template <class TElem> bool RefArrayOf<TElem>::
  161. operator!=(const RefArrayOf<TElem>& toCompare) const
  162. {
  163.     return !operator==(toCompare);
  164. }
  165. // ---------------------------------------------------------------------------
  166. //  RefArrayOf: Copy operations
  167. // ---------------------------------------------------------------------------
  168. template <class TElem> unsigned int RefArrayOf<TElem>::
  169. copyFrom(const RefArrayOf<TElem>& srcArray)
  170. {
  171.     //
  172.     //  Copy over as many of the source elements as will fit into
  173.     //  this array.
  174.     //
  175.     const unsigned int count = fSize < srcArray.fSize ?
  176.                                     fSize : srcArray.fSize;
  177.     for (unsigned int index = 0; index < fSize; index++)
  178.         fArray[index] = srcArray.fArray[index];
  179.     return count;
  180. }
  181. // ---------------------------------------------------------------------------
  182. //  RefArrayOf: Getter methods
  183. // ---------------------------------------------------------------------------
  184. template <class TElem> unsigned int RefArrayOf<TElem>::length() const
  185. {
  186.     return fSize;
  187. }
  188. template <class TElem> TElem** RefArrayOf<TElem>::rawData() const
  189. {
  190.     return fArray;
  191. }
  192. // ---------------------------------------------------------------------------
  193. //  RefArrayOf: Element management methods
  194. // ---------------------------------------------------------------------------
  195. template <class TElem> void RefArrayOf<TElem>::deleteAt(const unsigned int index)
  196. {
  197.     if (index >= fSize)
  198.         ThrowXML(ArrayIndexOutOfBoundsException, XMLExcepts::Array_BadIndex);
  199.     delete fArray[index];
  200.     fArray[index] = 0;
  201. }
  202. template <class TElem> void RefArrayOf<TElem>::deleteAllElements()
  203. {
  204.     for (unsigned int index = 0; index < fSize; index++)
  205.     {
  206.         delete fArray[index];
  207.         fArray[index] = 0;
  208.     }
  209. }
  210. template <class TElem> void RefArrayOf<TElem>::resize(const unsigned int newSize)
  211. {
  212.     if (newSize == fSize)
  213.         return;
  214.     if (newSize < fSize)
  215.         ThrowXML(IllegalArgumentException, XMLExcepts::Array_BadNewSize);
  216.     // Allocate the new array
  217.     TElem** newArray = new TElem*[newSize];
  218.     // Copy the existing values
  219.     unsigned int index = 0;
  220.     for (; index < fSize; index++)
  221.         newArray[index] = fArray[index];
  222.     for (; index < newSize; index++)
  223.         newArray[index] = 0;
  224.     // Delete the old array and udpate our members
  225.     delete [] fArray;
  226.     fArray = newArray;
  227.     fSize = newSize;
  228. }
  229. // ---------------------------------------------------------------------------
  230. //  RefArrayEnumerator: Constructors and Destructor
  231. // ---------------------------------------------------------------------------
  232. template <class TElem> RefArrayEnumerator<TElem>::
  233. RefArrayEnumerator(         RefArrayOf<TElem>* const    toEnum
  234.                     , const bool                        adopt) :
  235.     fAdopted(adopt)
  236.     , fCurIndex(0)
  237.     , fToEnum(toEnum)
  238. {
  239. }
  240. template <class TElem> RefArrayEnumerator<TElem>::~RefArrayEnumerator()
  241. {
  242.     if (fAdopted)
  243.         delete fToEnum;
  244. }
  245. // ---------------------------------------------------------------------------
  246. //  RefArrayEnumerator: Enum interface
  247. // ---------------------------------------------------------------------------
  248. template <class TElem> bool RefArrayEnumerator<TElem>::hasMoreElements() const
  249. {
  250.     if (fCurIndex >= fToEnum->length())
  251.         return false;
  252.     return true;
  253. }
  254. template <class TElem> TElem& RefArrayEnumerator<TElem>::nextElement()
  255. {
  256.     return *(*fToEnum)[fCurIndex++];
  257. }
  258. template <class TElem> void RefArrayEnumerator<TElem>::Reset()
  259. {
  260.     fCurIndex = 0;
  261. }