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

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: NameIdPool.hpp,v $
  58.  * Revision 1.6  2000/09/09 00:11:48  andyh
  59.  * Virtual Destructor Patch, submitted by Kirk Wylie
  60.  *
  61.  * Revision 1.5  2000/07/19 18:47:26  andyh
  62.  * More Macintosh port tweaks, submitted by James Berry.
  63.  *
  64.  * Revision 1.4  2000/03/02 19:54:42  roddey
  65.  * This checkin includes many changes done while waiting for the
  66.  * 1.1.0 code to be finished. I can't list them all here, but a list is
  67.  * available elsewhere.
  68.  *
  69.  * Revision 1.3  2000/02/24 20:05:24  abagchi
  70.  * Swat for removing Log from API docs
  71.  *
  72.  * Revision 1.2  2000/02/06 07:48:02  rahulj
  73.  * Year 2K copyright swat.
  74.  *
  75.  * Revision 1.1.1.1  1999/11/09 01:04:48  twl
  76.  * Initial checkin
  77.  *
  78.  * Revision 1.3  1999/11/08 20:45:10  rahul
  79.  * Swat for adding in Product name and CVS comment log variable.
  80.  *
  81.  */
  82. #if !defined(NAMEIDPOOL_HPP)
  83. #define NAMEIDPOOL_HPP
  84. #include <util/XercesDefs.hpp>
  85. #include <string.h>
  86. #include <util/XMLEnumerator.hpp>
  87. #include <util/XMLString.hpp>
  88. //
  89. //  Forward declare the enumerator so he can be our friend. Can you say
  90. //  friend? Sure...
  91. //
  92. template <class TElem> class NameIdPoolEnumerator;
  93. //
  94. //  This class is provided to serve as the basis of many of the pools that
  95. //  are used by the scanner and validators. They often need to be able to
  96. //  store objects in such a way that they can be quickly accessed by the
  97. //  name field of the object, and such that each element added is assigned
  98. //  a unique id via which it can be accessed almost instantly.
  99. //
  100. //  Object names are enforced as being unique, since that's what all these
  101. //  pools require. So its effectively a hash table in conjunction with an
  102. //  array of references into the hash table by id. Ids are assigned such that
  103. //  id N can be used to get the Nth element from the array of references.
  104. //  This provides very fast access by id.
  105. //
  106. //  The way these pools are used, elements are never removed except when the
  107. //  whole thing is flushed. This makes it very easy to maintain the two 
  108. //  access methods in sync.
  109. //
  110. //  For efficiency reasons, the id refererence array is never flushed until
  111. //  the dtor. This way, it does not have to be regrown every time its reused.
  112. //
  113. //  All elements are assumed to be owned by the pool!
  114. //
  115. //  We have to have a bucket element structure to use to maintain the linked
  116. //  lists for each bucket. Because some of the compilers we have to support
  117. //  are totally brain dead, it cannot be a nested class as it should be.
  118. //
  119. template <class TElem> struct NameIdPoolBucketElem
  120. {
  121. public :
  122.     NameIdPoolBucketElem
  123.     (
  124.         TElem* const                            value
  125.         , NameIdPoolBucketElem<TElem>* const    next
  126.     );
  127.     ~NameIdPoolBucketElem();
  128.     TElem*                          fData;
  129.     NameIdPoolBucketElem<TElem>*    fNext;
  130. };
  131. template <class TElem> class NameIdPool
  132. {
  133. public :
  134.     // -----------------------------------------------------------------------
  135.     //  Contructors and Destructor
  136.     // -----------------------------------------------------------------------
  137.     NameIdPool
  138.     (
  139.         const   unsigned int    hashModulus
  140.         , const unsigned int    initSize = 128
  141.     );
  142.     ~NameIdPool();
  143.     // -----------------------------------------------------------------------
  144.     //  Element management
  145.     // -----------------------------------------------------------------------
  146.     bool containsKey(const XMLCh* const key) const;
  147.     void removeAll();
  148.     // -----------------------------------------------------------------------
  149.     //  Getters
  150.     // -----------------------------------------------------------------------
  151.     TElem* getByKey(const XMLCh* const key);
  152.     const TElem* getByKey(const XMLCh* const key) const;
  153.     TElem* getById(const unsigned elemId);
  154.     const TElem* getById(const unsigned elemId) const;
  155.     // -----------------------------------------------------------------------
  156.     //  Putters
  157.     //
  158.     //  Dups are not allowed and cause an IllegalArgumentException. The id
  159.     //  of the new element is returned.
  160.     // -----------------------------------------------------------------------
  161.     unsigned int put(TElem* const valueToAdopt);
  162. protected :
  163.     // -----------------------------------------------------------------------
  164.     //  Declare the enumerator our friend so he can see our members
  165.     // -----------------------------------------------------------------------
  166.     friend class NameIdPoolEnumerator<TElem>;
  167. private :
  168.     // -----------------------------------------------------------------------
  169.     //  Unused constructors and operators
  170.     // -----------------------------------------------------------------------
  171.     NameIdPool(const NameIdPool<TElem>&);
  172.     void operator=(const NameIdPool<TElem>&);
  173.     // -----------------------------------------------------------------------
  174.     //  Private helper methods
  175.     // -----------------------------------------------------------------------
  176.     NameIdPoolBucketElem<TElem>* findBucketElem
  177.     (
  178.         const XMLCh* const      key
  179.         ,     unsigned int&     hashVal
  180.     );
  181.     const NameIdPoolBucketElem<TElem>* findBucketElem
  182.     (
  183.         const   XMLCh* const    key
  184.         ,       unsigned int&   hashVal
  185.     )   const;
  186.     // -----------------------------------------------------------------------
  187.     //  Data members
  188.     //
  189.     //  fBucketList
  190.     //      This is the array that contains the heads of all of the list
  191.     //      buckets, one for each possible hash value.
  192.     //
  193.     //  fIdPtrs
  194.     //  fIdPtrsCount
  195.     //      This is the array of pointers to the bucket elements in order of
  196.     //      their assigned ids. So taking id N and referencing this array
  197.     //      gives you the element with that id. The count field indicates
  198.     //      the current size of this list. When fIdCounter+1 reaches this
  199.     //      value the list must be expanded.
  200.     //
  201.     //  fIdCounter
  202.     //      This is used to give out unique ids to added elements. It starts
  203.     //      at zero (which means empty), and is bumped up for each newly added
  204.     //      element. So the first element is 1, the next is 2, etc... This
  205.     //      means that this value is set to the top index of the fIdPtrs array.
  206.     //
  207.     //  fHashModulus
  208.     //      This is the modulus to use in this pool. The fBucketList array
  209.     //      is of this size. It should be a prime number.
  210.     // -----------------------------------------------------------------------
  211.     NameIdPoolBucketElem<TElem>**   fBucketList;
  212.     TElem**                         fIdPtrs;
  213.     unsigned int                    fIdPtrsCount;
  214.     unsigned int                    fIdCounter;
  215.     unsigned int                    fHashModulus;
  216. };
  217. //
  218. //  An enumerator for a name id pool. It derives from the basic enumerator
  219. //  class, so that pools can be generically enumerated.
  220. //
  221. template <class TElem> class NameIdPoolEnumerator : public XMLEnumerator<TElem>
  222. {
  223. public :
  224.     // -----------------------------------------------------------------------
  225.     //  Constructors and Destructor
  226.     // -----------------------------------------------------------------------
  227.     NameIdPoolEnumerator
  228.     (
  229.                 NameIdPool<TElem>* const    toEnum
  230.     );
  231.     NameIdPoolEnumerator
  232.     (
  233.         const   NameIdPoolEnumerator<TElem>& toCopy
  234.     );
  235.     virtual ~NameIdPoolEnumerator();
  236.     // -----------------------------------------------------------------------
  237.     //  Public operators
  238.     // -----------------------------------------------------------------------
  239.     NameIdPoolEnumerator<TElem>& operator=
  240.     (
  241.         const   NameIdPoolEnumerator<TElem>& toAssign
  242.     );
  243.     // -----------------------------------------------------------------------
  244.     //  Enum interface
  245.     // -----------------------------------------------------------------------
  246.     bool hasMoreElements() const;
  247.     TElem& nextElement();
  248.     void Reset();
  249. private :    
  250.     // -----------------------------------------------------------------------
  251.     //  Data Members
  252.     //
  253.     //  fCurIndex
  254.     //      This is the current index into the pool's id mapping array. This
  255.     //      is now we enumerate it.
  256.     //
  257.     //  fToEnum
  258.     //      The name id pool that is being enumerated.
  259.     // -----------------------------------------------------------------------
  260.     unsigned int        fCurIndex;
  261.     NameIdPool<TElem>*  fToEnum;
  262. };
  263. #if !defined(XERCES_TMPLSINC)
  264. #include <util/NameIdPool.c>
  265. #endif
  266. #endif