type.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:13k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: type.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:39:35  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.23
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef TYPE_HPP
  10. #define TYPE_HPP
  11. /*  $Id: type.hpp,v 1000.1 2004/06/01 19:39:35 gouriano Exp $
  12. * ===========================================================================
  13. *
  14. *                            PUBLIC DOMAIN NOTICE
  15. *               National Center for Biotechnology Information
  16. *
  17. *  This software/database is a "United States Government Work" under the
  18. *  terms of the United States Copyright Act.  It was written as part of
  19. *  the author's official duties as a United States Government employee and
  20. *  thus cannot be copyrighted.  This software/database is freely available
  21. *  to the public for use. The National Library of Medicine and the U.S.
  22. *  Government have not placed any restriction on its use or reproduction.
  23. *
  24. *  Although all reasonable efforts have been taken to ensure the accuracy
  25. *  and reliability of the software and data, the NLM and the U.S.
  26. *  Government do not and cannot warrant the performance or results that
  27. *  may be obtained by using this software or data. The NLM and the U.S.
  28. *  Government disclaim all warranties, express or implied, including
  29. *  warranties of performance, merchantability or fitness for any particular
  30. *  purpose.
  31. *
  32. *  Please cite the author in any work or product based on this material.
  33. *
  34. * ===========================================================================
  35. *
  36. * Author: Eugene Vasilchenko
  37. *
  38. * File Description:
  39. *   Type definition
  40. *
  41. * ---------------------------------------------------------------------------
  42. * $Log: type.hpp,v $
  43. * Revision 1000.1  2004/06/01 19:39:35  gouriano
  44. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.23
  45. *
  46. * Revision 1.23  2004/05/12 18:33:23  gouriano
  47. * Added type conversion check (when using _type DEF file directive)
  48. *
  49. * Revision 1.22  2003/10/21 13:48:48  grichenk
  50. * Redesigned type aliases in serialization library.
  51. * Fixed the code (removed CRef-s, added explicit
  52. * initializers etc.)
  53. *
  54. * Revision 1.21  2003/06/16 14:40:15  gouriano
  55. * added possibility to convert DTD to XML schema
  56. *
  57. * Revision 1.20  2003/05/14 14:42:55  gouriano
  58. * added generation of XML schema
  59. *
  60. * Revision 1.19  2003/04/29 18:29:34  gouriano
  61. * object data member initialization verification
  62. *
  63. * Revision 1.18  2003/02/12 21:41:26  gouriano
  64. * added check for "primitive" data type (int, bool, etc)
  65. *
  66. * Revision 1.17  2003/02/10 17:56:40  gouriano
  67. * make it possible to disable scope prefixes when reading and writing objects generated from ASN specification in XML format, or when converting an ASN spec into DTD.
  68. *
  69. * Revision 1.16  2002/12/12 21:03:25  gouriano
  70. * changed code generation so XML attribute list became random access class
  71. *
  72. * Revision 1.15  2002/11/14 21:07:10  gouriano
  73. * added support of XML attribute lists
  74. *
  75. * Revision 1.14  2001/06/11 14:34:58  grichenk
  76. * Added support for numeric tags in ASN.1 specifications and data streams.
  77. *
  78. * Revision 1.13  2001/05/17 15:00:42  lavr
  79. * Typos corrected
  80. *
  81. * Revision 1.12  2001/02/15 21:39:28  kholodov
  82. * Modified: pointer to parent CDataMember added to CDataType class.
  83. * Modified: default value for BOOLEAN type in DTD is copied from ASN.1 spec.
  84. *
  85. * Revision 1.11  2000/12/15 15:38:35  vasilche
  86. * Added support of Int8 and long double.
  87. * Added support of BigInt ASN.1 extension - mapped to Int8.
  88. * Enum values now have type Int4 instead of long.
  89. *
  90. * Revision 1.10  2000/11/29 17:42:31  vasilche
  91. * Added CComment class for storing/printing ASN.1/XML module comments.
  92. * Added srcutil.hpp file to reduce file dependency.
  93. *
  94. * Revision 1.9  2000/11/15 20:34:44  vasilche
  95. * Added user comments to ENUMERATED types.
  96. * Added storing of user comments to ASN.1 module definition.
  97. *
  98. * Revision 1.8  2000/11/14 21:41:15  vasilche
  99. * Added preserving of ASN.1 definition comments.
  100. *
  101. * Revision 1.7  2000/11/07 17:25:30  vasilche
  102. * Added module names to CTypeInfo and CEnumeratedTypeValues
  103. *
  104. * Revision 1.6  2000/09/26 17:38:17  vasilche
  105. * Fixed incomplete choiceptr implementation.
  106. * Removed temporary comments.
  107. *
  108. * Revision 1.5  2000/05/24 20:08:32  vasilche
  109. * Implemented DTD generation.
  110. *
  111. * Revision 1.4  2000/04/07 19:26:14  vasilche
  112. * Added namespace support to datatool.
  113. * By default with argument -oR datatool will generate objects in namespace
  114. * NCBI_NS_NCBI::objects (aka ncbi::objects).
  115. * Datatool's classes also moved to NCBI namespace.
  116. *
  117. * Revision 1.3  2000/03/29 15:51:42  vasilche
  118. * Generated files names limited to 31 symbols due to limitations of Mac.
  119. *
  120. * Revision 1.2  2000/03/10 15:01:45  vasilche
  121. * Fixed OPTIONAL members reading.
  122. *
  123. * Revision 1.1  2000/02/01 21:46:24  vasilche
  124. * Added CGeneratedChoiceTypeInfo for generated choice classes.
  125. * Removed CMemberInfo subclasses.
  126. * Added support for DEFAULT/OPTIONAL members.
  127. * Changed class generation.
  128. * Moved datatool headers to include/internal/serial/tool.
  129. *
  130. * Revision 1.25  1999/12/29 16:01:53  vasilche
  131. * Added explicit virtual destructors.
  132. * Resolved overloading of InternalResolve.
  133. *
  134. * Revision 1.24  1999/12/21 17:18:38  vasilche
  135. * Added CDelayedFostream class which rewrites file only if contents is changed.
  136. *
  137. * Revision 1.23  1999/12/03 21:42:13  vasilche
  138. * Fixed conflict of enums in choices.
  139. *
  140. * Revision 1.22  1999/12/01 17:36:27  vasilche
  141. * Fixed CHOICE processing.
  142. *
  143. * Revision 1.21  1999/11/19 15:48:11  vasilche
  144. * Modified AutoPtr template to allow its use in STL containers (map, vector etc.)
  145. *
  146. * Revision 1.20  1999/11/16 15:41:17  vasilche
  147. * Added plain pointer choice.
  148. * By default we use C pointer instead of auto_ptr.
  149. * Start adding initializers.
  150. *
  151. * Revision 1.19  1999/11/15 19:36:20  vasilche
  152. * Fixed warnings on GCC
  153. *
  154. * ===========================================================================
  155. */
  156. #include <corelib/ncbistd.hpp>
  157. #include <corelib/ncbistre.hpp>
  158. #include <corelib/ncbiutil.hpp>
  159. #include <serial/typeref.hpp>
  160. #include <serial/datatool/comments.hpp>
  161. #include <list>
  162. #include <set>
  163. BEGIN_NCBI_SCOPE
  164. class CTypeInfo;
  165. class CDataType;
  166. class CDataTypeModule;
  167. class CDataValue;
  168. class CChoiceDataType;
  169. class CUniSequenceDataType;
  170. class CReferenceDataType;
  171. class CTypeStrings;
  172. class CFileCode;
  173. class CClassTypeStrings;
  174. class CNamespace;
  175. class CDataMember;
  176. struct AnyType {
  177.     union {
  178.         bool booleanValue;
  179.         Int4 integerValue;
  180.         void* pointerValue;
  181.     };
  182.     AnyType(void)
  183.         {
  184.             pointerValue = 0;
  185.         }
  186. };
  187. class CDataType {
  188. public:
  189.     typedef void* TObjectPtr;
  190.     typedef list<const CReferenceDataType*> TReferences;
  191.     CDataType(void);
  192.     virtual ~CDataType(void);
  193.     const CDataType* GetParentType(void) const
  194.         {
  195.             return m_ParentType;
  196.         }
  197.     const CDataTypeModule* GetModule(void) const
  198.         {
  199.             _ASSERT(m_Module != 0);
  200.             return m_Module;
  201.         }
  202.     bool HaveModuleName(void) const
  203.         {
  204.             return m_ParentType == 0;
  205.         }
  206.     const string& GetSourceFileName(void) const;
  207.     int GetSourceLine(void) const
  208.         {
  209.             return m_SourceLine;
  210.         }
  211.     void SetSourceLine(int line);
  212.     string LocationString(void) const;
  213.     string GetKeyPrefix(void) const;
  214.     string IdName(void) const;
  215.     string XmlTagName(void) const;
  216.     const string& GlobalName(void) const; // name of type or empty
  217.     bool Skipped(void) const;
  218.     string ClassName(void) const;
  219.     string FileName(void) const;
  220.     const CNamespace& Namespace(void) const;
  221.     string InheritFromClass(void) const;
  222.     const CDataType* InheritFromType(void) const;
  223.     const string GetVar(const string& value) const;
  224.     void  ForbidVar(const string& var, const string& value);
  225.     void  AllowVar(const string& var, const string& value);
  226.     const string GetAndVerifyVar(const string& value) const;
  227.     bool InChoice(void) const;
  228.     void PrintASNTypeComments(CNcbiOstream& out, int indent) const;
  229.     virtual void PrintASN(CNcbiOstream& out, int indent) const = 0;
  230.     void PrintDTD(CNcbiOstream& out) const;
  231.     void PrintDTD(CNcbiOstream& out, const CComments& extra) const;
  232.     virtual void PrintDTDElement(CNcbiOstream& out) const = 0;
  233.     virtual void PrintDTDExtra(CNcbiOstream& out) const;
  234.     void PrintXMLSchema(CNcbiOstream& out) const;
  235.     virtual void PrintXMLSchemaElement(CNcbiOstream& out) const = 0;
  236.     void PrintXMLSchema(CNcbiOstream& out, const CComments& extra) const;
  237.     virtual void PrintXMLSchemaExtra(CNcbiOstream& out) const;
  238.     virtual CTypeRef GetTypeInfo(void);
  239.     virtual const CTypeInfo* GetAnyTypeInfo(void);
  240.     virtual bool NeedAutoPointer(const CTypeInfo* typeInfo) const;
  241.     virtual const CTypeInfo* GetRealTypeInfo(void);
  242.     virtual CTypeInfo* CreateTypeInfo(void);
  243.     CTypeInfo* UpdateModuleName(CTypeInfo* typeInfo) const;
  244.     static CNcbiOstream& NewLine(CNcbiOstream& out, int indent);
  245.     void Warning(const string& mess) const;
  246.     virtual AutoPtr<CTypeStrings> GenerateCode(void) const;
  247.     void SetParentClassTo(CClassTypeStrings& code) const;
  248.     virtual AutoPtr<CTypeStrings> GetRefCType(void) const;
  249.     virtual AutoPtr<CTypeStrings> GetFullCType(void) const;
  250.     virtual string GetDefaultString(const CDataValue& value) const;
  251.     virtual const CDataType* Resolve(void) const;
  252.     virtual CDataType* Resolve(void);
  253.     // resolve type from global level
  254.     CDataType* ResolveGlobal(const string& name) const;
  255.     // resolve type from local level
  256.     CDataType* ResolveLocal(const string& name) const;
  257.     bool IsInSet(void) const
  258.         {
  259.             return m_Set != 0;
  260.         }
  261.     const CUniSequenceDataType* GetInSet(void) const
  262.         {
  263.             return m_Set;
  264.         }
  265.     void SetInSet(const CUniSequenceDataType* sequence);
  266.     bool IsInChoice(void) const
  267.         {
  268.             return m_Choice != 0;
  269.         }
  270.     const CChoiceDataType* GetInChoice(void) const
  271.         {
  272.             return m_Choice;
  273.         }
  274.     void SetInChoice(const CChoiceDataType* choice);
  275.     bool IsReferenced(void) const
  276.         {
  277.             return m_References;
  278.         }
  279.     void AddReference(const CReferenceDataType* reference);
  280.     const TReferences& GetReferences(void) const
  281.         {
  282.             return *m_References;
  283.         }
  284. /*
  285.     static string GetTemplateHeader(const string& tmpl);
  286.     static bool IsSimplePointerTemplate(const string& tmpl);
  287.     static string GetTemplateNamespace(const string& tmpl);
  288.     static string GetTemplateMacro(const string& tmpl);
  289. */
  290.     void SetParent(const CDataType* parent, const string& memberName);
  291.     void SetParent(const CDataTypeModule* module, const string& typeName);
  292.     virtual void FixTypeTree(void) const;
  293.     bool Check(void);
  294.     virtual bool CheckType(void) const;
  295.     virtual bool CheckValue(const CDataValue& value) const = 0;
  296.     virtual TObjectPtr CreateDefault(const CDataValue& value) const = 0;
  297.     
  298.     CComments& Comments(void)
  299.         {
  300.             return m_Comments;
  301.         }
  302.     void SetDataMember(CDataMember* dm) {
  303.         m_DataMember = dm;
  304.     }
  305.     const CDataMember* GetDataMember(void) const {
  306.         return m_DataMember;
  307.     }
  308.     enum {
  309.         eNoExplicitTag = -1
  310.     };
  311.     void SetTag(int tag) {
  312.         m_Tag = tag;
  313.     }
  314.     int GetTag(void) const {
  315.         return m_Tag;
  316.     }
  317.     bool HasTag(void) const {
  318.         return m_Tag != eNoExplicitTag;
  319.     }
  320.     void SetTypeStr(CClassTypeStrings* TypeStr) const {
  321.         m_TypeStr = TypeStr;
  322.     }
  323.     CClassTypeStrings* GetTypeStr(void) const {
  324.         return m_TypeStr;
  325.     }
  326.     bool IsPrimitive(void) const;
  327.     bool IsStdType(void) const;
  328.     bool IsReference(void) const;
  329.     void SetIsAlias(bool value) {
  330.         m_IsAlias = value;
  331.     }
  332.     bool IsAlias(void) const {
  333.         return m_IsAlias;
  334.     }
  335.     static void SetEnforcedStdXml(bool set = true) {
  336.         sm_EnforcedStdXml = set;
  337.     }
  338.     static bool GetEnforcedStdXml(void) {
  339.         return sm_EnforcedStdXml;
  340.     }
  341. protected:
  342.     static bool x_IsSavedName(const string& name);
  343.     static void x_AddSavedName(const string& name);
  344. private:
  345.     const CDataType* m_ParentType;       // parent type
  346.     const CDataTypeModule* m_Module;
  347.     string m_MemberName;
  348.     int m_SourceLine;
  349.     CComments m_Comments;
  350.     CDataMember* m_DataMember;
  351.     mutable CClassTypeStrings* m_TypeStr;
  352.     // tree info
  353.     const CUniSequenceDataType* m_Set;
  354.     const CChoiceDataType* m_Choice;
  355.     AutoPtr<TReferences> m_References;
  356.     bool m_Checked;
  357.     CTypeRef m_TypeRef;
  358.     AutoPtr<CTypeInfo> m_AnyTypeInfo;
  359.     AutoPtr<CTypeInfo> m_RealTypeInfo;
  360.     mutable string m_CachedFileName;
  361.     mutable auto_ptr<CNamespace> m_CachedNamespace;
  362.     int m_Tag;
  363.     bool m_IsAlias;
  364.     multimap<string,string> m_ForbidVar;
  365.     CDataType(const CDataType&);
  366.     CDataType& operator=(const CDataType&);
  367.     static bool sm_EnforcedStdXml;
  368.     static set<string> sm_SavedNames;
  369. };
  370. #define CheckValueType(value, type, name) do{ 
  371. if ( dynamic_cast<const type*>(&(value)) == 0 ) { 
  372.     (value).Warning(name " value expected"); return false; 
  373. } } while(0)
  374. END_NCBI_SCOPE
  375. #endif