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

词法分析

开发平台:

Visual C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 1999-2001 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: ContentSpecNode.hpp,v $
  58.  * Revision 1.7  2003/05/18 14:02:06  knoaman
  59.  * Memory manager implementation: pass per instance manager.
  60.  *
  61.  * Revision 1.6  2003/05/15 18:48:27  knoaman
  62.  * Partial implementation of the configurable memory manager.
  63.  *
  64.  * Revision 1.5  2002/11/04 14:54:58  tng
  65.  * C++ Namespace Support.
  66.  *
  67.  * Revision 1.4  2002/10/30 21:52:00  tng
  68.  * [Bug 13641] compiler-generated copy-constructor for QName doesn't do the right thing.
  69.  *
  70.  * Revision 1.3  2002/04/04 14:42:41  knoaman
  71.  * Change min/maxOccurs from unsigned int to int.
  72.  *
  73.  * Revision 1.2  2002/03/21 15:41:48  knoaman
  74.  * Move behavior from TraverseSchema.
  75.  *
  76.  * Revision 1.1.1.1  2002/02/01 22:22:38  peiyongz
  77.  * sane_include
  78.  *
  79.  * Revision 1.19  2001/12/06 17:50:42  tng
  80.  * Performance Enhancement. The ContentSpecNode constructor always copied the QName
  81.  * that was passed to it.  Added a second constructor that allows the QName to be just assigned, not copied.
  82.  * That was because there are some cases in which a temporary QName was constructed, passed to ContentSpecNode, and then deleted.
  83.  * There were examples of that in TraverseSchema and DTDScanner.
  84.  * By Henry Zongaro.
  85.  *
  86.  * Revision 1.18  2001/11/07 21:50:28  tng
  87.  * Fix comment log that lead to error.
  88.  *
  89.  * Revision 1.17  2001/11/07 21:12:15  tng
  90.  * Performance: Create QName in ContentSpecNode only if it is a leaf/Any/PCDataNode.
  91.  *
  92.  * Revision 1.16  2001/08/28 20:21:08  peiyongz
  93.  * * AIX 4.2, xlC 3 rev.1 compilation error: get*() declared with external linkage
  94.  * and called or defined before being declared as inline
  95.  *
  96.  * Revision 1.15  2001/08/24 12:48:48  tng
  97.  * Schema: AllContentModel
  98.  *
  99.  * Revision 1.14  2001/08/23 11:54:26  tng
  100.  * Add newline at the end and various typo fixes.
  101.  *
  102.  * Revision 1.13  2001/08/22 16:04:07  tng
  103.  * ContentSpecNode copy constructor should copy Min and Max as well.
  104.  *
  105.  * Revision 1.12  2001/08/21 18:47:42  peiyongz
  106.  * AIX 4.2, xlC 3 rev.1 compilation error: dtor() declared with external linkage
  107.  *                                 and called or defined before being declared as inline
  108.  *
  109.  * Revision 1.11  2001/08/21 16:06:11  tng
  110.  * Schema: Unique Particle Attribution Constraint Checking.
  111.  *
  112.  * Revision 1.10  2001/08/20 13:18:58  tng
  113.  * bug in ContentSpecNode copy constructor.
  114.  *
  115.  * Revision 1.9  2001/07/24 18:33:13  knoaman
  116.  * Added support for <group> + extra constraint checking for complexType
  117.  *
  118.  * Revision 1.8  2001/07/09 15:22:36  knoaman
  119.  * complete <any> declaration.
  120.  *
  121.  * Revision 1.7  2001/05/11 13:27:18  tng
  122.  * Copyright update.
  123.  *
  124.  * Revision 1.6  2001/05/10 16:33:08  knoaman
  125.  * Traverse Schema Part III + error messages.
  126.  *
  127.  * Revision 1.5  2001/05/03 20:34:39  tng
  128.  * Schema: SchemaValidator update
  129.  *
  130.  * Revision 1.4  2001/04/19 18:17:29  tng
  131.  * Schema: SchemaValidator update, and use QName in Content Model
  132.  *
  133.  * Revision 1.3  2001/03/21 21:56:26  tng
  134.  * Schema: Add Schema Grammar, Schema Validator, and split the DTDValidator into DTDValidator, DTDScanner, and DTDGrammar.
  135.  *
  136.  * Revision 1.2  2001/02/27 14:48:49  tng
  137.  * Schema: Add CMAny and ContentLeafNameTypeVector, by Pei Yong Zhang
  138.  *
  139.  * Revision 1.1  2001/02/16 14:17:29  tng
  140.  * Schema: Move the common Content Model files that are shared by DTD
  141.  * and schema from 'DTD' folder to 'common' folder.  By Pei Yong Zhang.
  142.  *
  143.  * Revision 1.4  2000/03/02 19:55:38  roddey
  144.  * This checkin includes many changes done while waiting for the
  145.  * 1.1.0 code to be finished. I can't list them all here, but a list is
  146.  * available elsewhere.
  147.  *
  148.  * Revision 1.3  2000/02/24 20:16:48  abagchi
  149.  * Swat for removing Log from API docs
  150.  *
  151.  * Revision 1.2  2000/02/09 21:42:37  abagchi
  152.  * Copyright swat
  153.  *
  154.  * Revision 1.1.1.1  1999/11/09 01:03:14  twl
  155.  * Initial checkin
  156.  *
  157.  * Revision 1.2  1999/11/08 20:45:38  rahul
  158.  * Swat for adding in Product name and CVS comment log variable.
  159.  *
  160.  */
  161. #if !defined(CONTENTSPECNODE_HPP)
  162. #define CONTENTSPECNODE_HPP
  163. #include <xercesc/framework/XMLElementDecl.hpp>
  164. #include <xercesc/framework/MemoryManager.hpp>
  165. XERCES_CPP_NAMESPACE_BEGIN
  166. class XMLBuffer;
  167. class Grammar;
  168. class ContentSpecNode : public XMemory
  169. {
  170. public :
  171.     // -----------------------------------------------------------------------
  172.     //  Class specific types
  173.     // -----------------------------------------------------------------------
  174.     enum NodeTypes
  175.     {
  176.         Leaf = 0
  177.         , ZeroOrOne
  178.         , ZeroOrMore
  179.         , OneOrMore
  180.         , Choice
  181.         , Sequence
  182.         , Any
  183.         , Any_Other
  184.         , Any_NS = 8
  185.         , All = 9
  186.         , Any_Lax = 22
  187.         , Any_Other_Lax = 23
  188.         , Any_NS_Lax = 24
  189.         , Any_Skip = 38
  190.         , Any_Other_Skip = 39
  191.         , Any_NS_Skip = 40
  192.         , UnknownType = -1
  193.     };
  194.     // -----------------------------------------------------------------------
  195.     //  Constructors and Destructor
  196.     // -----------------------------------------------------------------------
  197.     ContentSpecNode(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
  198.     ContentSpecNode
  199.     (
  200.         QName* const toAdopt
  201.         , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
  202.     );
  203.     ContentSpecNode
  204.     (
  205.         QName* const toAdopt
  206.         , const bool copyQName
  207.         , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
  208.     );
  209.     ContentSpecNode
  210.     (
  211.         const   NodeTypes               type
  212.         ,       ContentSpecNode* const  firstToAdopt
  213.         ,       ContentSpecNode* const  secondToAdopt
  214.         , const bool                    adoptFirst = true
  215.         , const bool                    adoptSecond = true
  216.         ,       MemoryManager* const    manager = XMLPlatformUtils::fgMemoryManager
  217.     );
  218.     ContentSpecNode(const ContentSpecNode&);
  219. ~ContentSpecNode();
  220.     // -----------------------------------------------------------------------
  221.     //  Getter methods
  222.     // -----------------------------------------------------------------------
  223.     QName* getElement();
  224.     const QName* getElement() const;
  225.     ContentSpecNode* getFirst();
  226.     const ContentSpecNode* getFirst() const;
  227.     ContentSpecNode* getSecond();
  228.     const ContentSpecNode* getSecond() const;
  229.     NodeTypes getType() const;
  230.     ContentSpecNode* orphanFirst();
  231.     ContentSpecNode* orphanSecond();
  232.     int getMinOccurs() const;
  233.     int getMaxOccurs() const;
  234.     bool isFirstAdopted() const;
  235.     bool isSecondAdopted() const;
  236.     // -----------------------------------------------------------------------
  237.     //  Setter methods
  238.     // -----------------------------------------------------------------------
  239.     void setElement(QName* const toAdopt);
  240.     void setFirst(ContentSpecNode* const toAdopt);
  241.     void setSecond(ContentSpecNode* const toAdopt);
  242.     void setType(const NodeTypes type);
  243.     void setMinOccurs(int min);
  244.     void setMaxOccurs(int max);
  245.     void setAdoptFirst(bool adoptFirst);
  246.     void setAdoptSecond(bool adoptSecond);
  247.     // -----------------------------------------------------------------------
  248.     //  Miscellaneous
  249.     // -----------------------------------------------------------------------
  250.     void formatSpec (XMLBuffer&      bufToFill)   const;
  251.     bool hasAllContent();
  252.     int  getMinTotalRange() const;
  253.     int  getMaxTotalRange() const;
  254. private :
  255.     // -----------------------------------------------------------------------
  256.     //  Unimplemented constructors and operators
  257.     // -----------------------------------------------------------------------
  258.     // -----------------------------------------------------------------------
  259.     //  Private Data Members
  260.     //
  261.     //  fElement
  262.     //      If the type is Leaf/Any*, then this is the qName of the element. If the URI
  263.     //      is fgPCDataElemId, then its a PCData node.  Else, it is zero.
  264.     //
  265.     //  fFirst
  266.     //  fSecond
  267.     //      The optional first and second nodes. The fType field indicates
  268.     //      which of these are valid. The validaty constraints are:
  269.     //
  270.     //          Leaf = Neither valid
  271.     //          ZeroOrOne, ZeroOrMore = First
  272.     //          Choice, Sequence, All = First and Second
  273.     //          Any* = Neither valid
  274.     //
  275.     //  fType
  276.     //      The type of node. This controls how many of the child node fields
  277.     //      are used.
  278.     //
  279.     //  fAdoptFirst
  280.     //      Indicate if this ContentSpecNode adopts the fFirst, and is responsible
  281.     //      for deleting it.
  282.     //
  283.     //  fAdoptSecond
  284.     //      Indicate if this ContentSpecNode adopts the fSecond, and is responsible
  285.     //      for deleting it.
  286.     //
  287.     //  fMinOccurs
  288.     //      Indicate the minimum times that this node can occur
  289.     //
  290.     //  fMaxOccurs
  291.     //      Indicate the maximum times that this node can occur
  292.     //      -1 (Unbounded), default (1)
  293.     // -----------------------------------------------------------------------
  294.     MemoryManager*      fMemoryManager;
  295.     QName*              fElement;
  296.     ContentSpecNode*    fFirst;
  297.     ContentSpecNode*    fSecond;
  298.     NodeTypes           fType;
  299.     bool                fAdoptFirst;
  300.     bool                fAdoptSecond;
  301.     int                 fMinOccurs;
  302.     int                 fMaxOccurs;
  303. };
  304. // ---------------------------------------------------------------------------
  305. //  ContentSpecNode: Constructors and Destructor
  306. // ---------------------------------------------------------------------------
  307. inline ContentSpecNode::ContentSpecNode(MemoryManager* const manager) :
  308.     fMemoryManager(manager)
  309.     , fElement(0)
  310.     , fFirst(0)
  311.     , fSecond(0)
  312.     , fType(ContentSpecNode::Leaf)
  313.     , fAdoptFirst(true)
  314.     , fAdoptSecond(true)
  315.     , fMinOccurs(1)
  316.     , fMaxOccurs(1)
  317. {
  318. }
  319. inline
  320. ContentSpecNode::ContentSpecNode(QName* const element,
  321.                                  MemoryManager* const manager) :
  322.     fMemoryManager(manager)
  323.     , fElement(0)
  324.     , fFirst(0)
  325.     , fSecond(0)
  326.     , fType(ContentSpecNode::Leaf)
  327.     , fAdoptFirst(true)
  328.     , fAdoptSecond(true)
  329.     , fMinOccurs(1)
  330.     , fMaxOccurs(1)
  331. {
  332.     if (element)
  333.         fElement = new (fMemoryManager) QName(*element);
  334. }
  335. inline
  336. ContentSpecNode::ContentSpecNode( QName* const element
  337.                                 , const bool copyQName
  338.                                 , MemoryManager* const manager) :
  339.     fMemoryManager(manager)
  340.     , fElement(0)
  341.     , fFirst(0)
  342.     , fSecond(0)
  343.     , fType(ContentSpecNode::Leaf)
  344.     , fAdoptFirst(true)
  345.     , fAdoptSecond(true)
  346.     , fMinOccurs(1)
  347.     , fMaxOccurs(1)
  348. {
  349.     if (copyQName)
  350.     {
  351.         if (element)
  352.             fElement = new (fMemoryManager) QName(*element);
  353.     }
  354.     else
  355.     {
  356.         fElement = element;
  357.     }
  358. }
  359. inline
  360. ContentSpecNode::ContentSpecNode(const  NodeTypes              type
  361.                                 ,       ContentSpecNode* const firstAdopt
  362.                                 ,       ContentSpecNode* const secondAdopt
  363.                                 , const bool                   adoptFirst
  364.                                 , const bool                   adoptSecond
  365.                                 ,       MemoryManager* const   manager) :
  366.     fMemoryManager(manager)
  367.     , fElement(0)
  368.     , fFirst(firstAdopt)
  369.     , fSecond(secondAdopt)
  370.     , fType(type)
  371.     , fAdoptFirst(adoptFirst)
  372.     , fAdoptSecond(adoptSecond)
  373.     , fMinOccurs(1)
  374.     , fMaxOccurs(1)
  375. {
  376. }
  377. inline ContentSpecNode::~ContentSpecNode()
  378. {
  379.     // Delete our children, which cause recursive cleanup
  380.     if (fAdoptFirst) {
  381. delete fFirst;
  382.     }
  383.     if (fAdoptSecond) {
  384. delete fSecond;
  385.     }
  386.     delete fElement;
  387. }
  388. // ---------------------------------------------------------------------------
  389. //  ContentSpecNode: Getter methods
  390. // ---------------------------------------------------------------------------
  391. inline QName* ContentSpecNode::getElement()
  392. {
  393.     return fElement;
  394. }
  395. inline const QName* ContentSpecNode::getElement() const
  396. {
  397.     return fElement;
  398. }
  399. inline ContentSpecNode* ContentSpecNode::getFirst()
  400. {
  401.     return fFirst;
  402. }
  403. inline const ContentSpecNode* ContentSpecNode::getFirst() const
  404. {
  405.     return fFirst;
  406. }
  407. inline ContentSpecNode* ContentSpecNode::getSecond()
  408. {
  409.     return fSecond;
  410. }
  411. inline const ContentSpecNode* ContentSpecNode::getSecond() const
  412. {
  413.     return fSecond;
  414. }
  415. inline ContentSpecNode::NodeTypes ContentSpecNode::getType() const
  416. {
  417.     return fType;
  418. }
  419. inline ContentSpecNode* ContentSpecNode::orphanFirst()
  420. {
  421.     ContentSpecNode* retNode = fFirst;
  422.     fFirst = 0;
  423.     return retNode;
  424. }
  425. inline ContentSpecNode* ContentSpecNode::orphanSecond()
  426. {
  427.     ContentSpecNode* retNode = fSecond;
  428.     fSecond = 0;
  429.     return retNode;
  430. }
  431. inline int ContentSpecNode::getMinOccurs() const
  432. {
  433.     return fMinOccurs;
  434. }
  435. inline int ContentSpecNode::getMaxOccurs() const
  436. {
  437.     return fMaxOccurs;
  438. }
  439. inline bool ContentSpecNode::isFirstAdopted() const
  440. {
  441.     return fAdoptFirst;
  442. }
  443. inline bool ContentSpecNode::isSecondAdopted() const
  444. {
  445.     return fAdoptSecond;
  446. }
  447. // ---------------------------------------------------------------------------
  448. //  ContentSpecType: Setter methods
  449. // ---------------------------------------------------------------------------
  450. inline void ContentSpecNode::setElement(QName* const element)
  451. {
  452.     delete fElement;
  453.     fElement = 0;
  454.     if (element)
  455.         fElement = new (fMemoryManager) QName(*element);
  456. }
  457. inline void ContentSpecNode::setFirst(ContentSpecNode* const toAdopt)
  458. {
  459.     if (fAdoptFirst)
  460.         delete fFirst;
  461.     fFirst = toAdopt;
  462. }
  463. inline void ContentSpecNode::setSecond(ContentSpecNode* const toAdopt)
  464. {
  465.     if (fAdoptSecond)
  466.         delete fSecond;
  467.     fSecond = toAdopt;
  468. }
  469. inline void ContentSpecNode::setType(const NodeTypes type)
  470. {
  471.     fType = type;
  472. }
  473. inline void ContentSpecNode::setMinOccurs(int min)
  474. {
  475.     fMinOccurs = min;
  476. }
  477. inline void ContentSpecNode::setMaxOccurs(int max)
  478. {
  479.     fMaxOccurs = max;
  480. }
  481. inline void ContentSpecNode::setAdoptFirst(bool newState)
  482. {
  483.     fAdoptFirst = newState;
  484. }
  485. inline void ContentSpecNode::setAdoptSecond(bool newState)
  486. {
  487.     fAdoptSecond = newState;
  488. }
  489. // ---------------------------------------------------------------------------
  490. //  ContentSpecNode: Miscellaneous
  491. // ---------------------------------------------------------------------------
  492. inline bool ContentSpecNode::hasAllContent() {
  493.     if (fType == ContentSpecNode::ZeroOrOne) {
  494.         return (fFirst->getType() == ContentSpecNode::All);
  495.     }
  496.     return (fType == ContentSpecNode::All);
  497. }
  498. XERCES_CPP_NAMESPACE_END
  499. #endif