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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: reftype.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:43:36  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.30
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: reftype.cpp,v 1000.1 2004/06/01 19:43:36 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE
  13. *               National Center for Biotechnology Information
  14. *
  15. *  This software/database is a "United States Government Work" under the
  16. *  terms of the United States Copyright Act.  It was written as part of
  17. *  the author's official duties as a United States Government employee and
  18. *  thus cannot be copyrighted.  This software/database is freely available
  19. *  to the public for use. The National Library of Medicine and the U.S.
  20. *  Government have not placed any restriction on its use or reproduction.
  21. *
  22. *  Although all reasonable efforts have been taken to ensure the accuracy
  23. *  and reliability of the software and data, the NLM and the U.S.
  24. *  Government do not and cannot warrant the performance or results that
  25. *  may be obtained by using this software or data. The NLM and the U.S.
  26. *  Government disclaim all warranties, express or implied, including
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.
  29. *
  30. *  Please cite the author in any work or product based on this material.
  31. *
  32. * ===========================================================================
  33. *
  34. * Author: Eugene Vasilchenko
  35. *
  36. * File Description:
  37. *   Type reference definition
  38. *
  39. * ---------------------------------------------------------------------------
  40. * $Log: reftype.cpp,v $
  41. * Revision 1000.1  2004/06/01 19:43:36  gouriano
  42. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.30
  43. *
  44. * Revision 1.30  2004/05/19 17:25:42  gouriano
  45. * Corrected reading of containers when the code was generated by DTD
  46. *
  47. * Revision 1.29  2004/05/17 21:03:14  gorelenk
  48. * Added include of PCH ncbi_pch.hpp
  49. *
  50. * Revision 1.28  2003/06/16 14:41:05  gouriano
  51. * added possibility to convert DTD to XML schema
  52. *
  53. * Revision 1.27  2003/05/14 14:42:22  gouriano
  54. * added generation of XML schema
  55. *
  56. * Revision 1.26  2003/03/10 18:55:18  gouriano
  57. * use new structured exceptions (based on CException)
  58. *
  59. * Revision 1.25  2001/12/03 14:49:04  juran
  60. * Eliminate warning.
  61. *
  62. * Revision 1.24  2001/05/17 15:07:12  lavr
  63. * Typos corrected
  64. *
  65. * Revision 1.23  2000/11/20 17:26:33  vasilche
  66. * Fixed warnings on 64 bit platforms.
  67. * Updated names of config variables.
  68. *
  69. * Revision 1.22  2000/11/15 20:34:55  vasilche
  70. * Added user comments to ENUMERATED types.
  71. * Added storing of user comments to ASN.1 module definition.
  72. *
  73. * Revision 1.21  2000/11/14 21:41:26  vasilche
  74. * Added preserving of ASN.1 definition comments.
  75. *
  76. * Revision 1.20  2000/11/08 17:02:52  vasilche
  77. * Added generation of modular DTD files.
  78. *
  79. * Revision 1.19  2000/11/07 17:26:26  vasilche
  80. * Added module names to CTypeInfo and CEnumeratedTypeValues
  81. * Added possibility to set include directory for whole module
  82. *
  83. * Revision 1.18  2000/11/01 20:38:59  vasilche
  84. * OPTIONAL and DEFAULT are not permitted in CHOICE.
  85. * Fixed code generation for DEFAULT.
  86. *
  87. * Revision 1.17  2000/09/26 17:38:27  vasilche
  88. * Fixed incomplete choiceptr implementation.
  89. * Removed temporary comments.
  90. *
  91. * Revision 1.16  2000/09/18 20:00:29  vasilche
  92. * Separated CVariantInfo and CMemberInfo.
  93. * Implemented copy hooks.
  94. * All hooks now are stored in CTypeInfo/CMemberInfo/CVariantInfo.
  95. * Most type specific functions now are implemented via function pointers instead of virtual functions.
  96. *
  97. * Revision 1.15  2000/08/25 15:59:24  vasilche
  98. * Renamed directory tool -> datatool.
  99. *
  100. * Revision 1.14  2000/07/11 20:36:29  vasilche
  101. * Removed unnecessary generation of namespace references for enum members.
  102. * Removed obsolete methods.
  103. *
  104. * Revision 1.13  2000/07/10 17:32:00  vasilche
  105. * Macro arguments made more clear.
  106. * All old ASN stuff moved to serialasn.hpp.
  107. * Changed prefix of enum info functions to GetTypeInfo_enum_.
  108. *
  109. * Revision 1.12  2000/06/16 16:31:40  vasilche
  110. * Changed implementation of choices and classes info to allow use of the same classes in generated and user written classes.
  111. *
  112. * Revision 1.11  2000/05/24 20:09:29  vasilche
  113. * Implemented DTD generation.
  114. *
  115. * Revision 1.10  2000/04/07 19:26:33  vasilche
  116. * Added namespace support to datatool.
  117. * By default with argument -oR datatool will generate objects in namespace
  118. * NCBI_NS_NCBI::objects (aka ncbi::objects).
  119. * Datatool's classes also moved to NCBI namespace.
  120. *
  121. * Revision 1.9  2000/03/15 21:24:12  vasilche
  122. * Error diagnostic about ambiguous types made more clear.
  123. *
  124. * Revision 1.8  2000/02/01 21:48:05  vasilche
  125. * Added CGeneratedChoiceTypeInfo for generated choice classes.
  126. * Removed CMemberInfo subclasses.
  127. * Added support for DEFAULT/OPTIONAL members.
  128. * Changed class generation.
  129. * Moved datatool headers to include/internal/serial/tool.
  130. *
  131. * Revision 1.7  1999/12/29 16:01:51  vasilche
  132. * Added explicit virtual destructors.
  133. * Resolved overloading of InternalResolve.
  134. *
  135. * Revision 1.6  1999/12/03 21:42:12  vasilche
  136. * Fixed conflict of enums in choices.
  137. *
  138. * Revision 1.5  1999/12/01 17:36:26  vasilche
  139. * Fixed CHOICE processing.
  140. *
  141. * Revision 1.4  1999/11/16 15:41:16  vasilche
  142. * Added plain pointer choice.
  143. * By default we use C pointer instead of auto_ptr.
  144. * Start adding initializers.
  145. *
  146. * Revision 1.3  1999/11/15 19:36:18  vasilche
  147. * Fixed warnings on GCC
  148. *
  149. * ===========================================================================
  150. */
  151. #include <ncbi_pch.hpp>
  152. #include <serial/datatool/reftype.hpp>
  153. #include <serial/datatool/unitype.hpp>
  154. #include <serial/datatool/statictype.hpp>
  155. #include <serial/datatool/typestr.hpp>
  156. #include <serial/datatool/value.hpp>
  157. #include <serial/datatool/module.hpp>
  158. #include <serial/datatool/exceptions.hpp>
  159. #include <serial/datatool/blocktype.hpp>
  160. #include <serial/datatool/enumtype.hpp>
  161. #include <serial/classinfo.hpp>
  162. #include <serial/serialimpl.hpp>
  163. BEGIN_NCBI_SCOPE
  164. CReferenceDataType::CReferenceDataType(const string& n)
  165.     : m_UserTypeName(n)
  166. {
  167. }
  168. void CReferenceDataType::PrintASN(CNcbiOstream& out, int /*indent*/) const
  169. {
  170.     out << m_UserTypeName;
  171. }
  172. void CReferenceDataType::PrintDTDElement(CNcbiOstream& out) const
  173. {
  174.     out <<
  175.         "<!ELEMENT "<<XmlTagName()<<" ( "<<UserTypeXmlTagName()<<" )>";
  176. }
  177. // XML schema generator submitted by
  178. // Marc Dumontier, Blueprint initiative, dumontier@mshri.on.ca
  179. // modified by Andrei Gourianov, gouriano@ncbi
  180. void CReferenceDataType::PrintXMLSchemaElement(CNcbiOstream& out) const
  181. {
  182.     string tag(XmlTagName());
  183.     string userType(UserTypeXmlTagName());
  184.     const CUniSequenceDataType* uniType = 
  185.         dynamic_cast<const CUniSequenceDataType*>(GetParentType());
  186.     if (tag == userType || (GetEnforcedStdXml() && uniType)) {
  187.         const CDataType* realType = Resolve();
  188.         realType->PrintXMLSchemaElement(out);
  189.         return;
  190.     }
  191.     out << "<xs:element name="" << tag << "">n"
  192.         << "  <xs:complexType>n";
  193.     out << "    <xs:sequence>n"
  194.         << "      <xs:element ref="" << userType << ""/>n"
  195.         << "    </xs:sequence>n";
  196.     out << "  </xs:complexType>n"
  197.         << "</xs:element>n";
  198. }
  199. void CReferenceDataType::PrintXMLSchemaExtra(CNcbiOstream& out) const
  200. {
  201.     string tag(XmlTagName());
  202.     string userType(UserTypeXmlTagName());
  203.     const CUniSequenceDataType* uniType = 
  204.         dynamic_cast<const CUniSequenceDataType*>(GetParentType());
  205.     if (tag == userType || (GetEnforcedStdXml() && uniType)) {
  206.         Resolve()->PrintXMLSchemaExtra(out);
  207.     }
  208. }
  209. void CReferenceDataType::FixTypeTree(void) const
  210. {
  211.     CParent::FixTypeTree();
  212.     CDataType* resolved = ResolveOrNull();
  213.     if ( resolved )
  214.         resolved->AddReference(this);
  215. }
  216. bool CReferenceDataType::CheckType(void) const
  217. {
  218.     try {
  219.         ResolveLocal(m_UserTypeName);
  220.         return true;
  221.     }
  222.     catch ( CNotFoundException& exc) {
  223.         Warning("Unresolved type: " + m_UserTypeName + ": " + exc.what());
  224.     }
  225.     return false;
  226. }
  227. bool CReferenceDataType::CheckValue(const CDataValue& value) const
  228. {
  229.     CDataType* resolved = ResolveOrNull();
  230.     if ( !resolved )
  231.         return false;
  232.     return resolved->CheckValue(value);
  233. }
  234. TTypeInfo CReferenceDataType::GetRealTypeInfo(void)
  235. {
  236.     CDataType* dataType = ResolveOrThrow();
  237.     if ( dynamic_cast<CDataMemberContainerType*>(dataType) ||
  238.          dynamic_cast<CEnumDataType*>(dataType) )
  239.         return dataType->GetRealTypeInfo();
  240.     return CParent::GetRealTypeInfo();
  241. }
  242. CTypeInfo* CReferenceDataType::CreateTypeInfo(void)
  243. {
  244.     CClassTypeInfo* info = CClassInfoHelper<AnyType>::CreateClassInfo(m_UserTypeName.c_str());
  245.     info->SetImplicit();
  246.     CMemberInfo* mem = info->AddMember("", 0, ResolveOrThrow()->GetTypeInfo());
  247.     if (GetDataMember()->NoPrefix()) {
  248.         mem->SetNoPrefix();
  249.     }
  250.     if ( GetParentType() == 0 ) {
  251.         // global
  252.         info->SetModuleName(GetModule()->GetName());
  253.     }
  254.     return info;
  255. }
  256. TObjectPtr CReferenceDataType::CreateDefault(const CDataValue& value) const
  257. {
  258.     return ResolveOrThrow()->CreateDefault(value);
  259. }
  260. string CReferenceDataType::GetDefaultString(const CDataValue& value) const
  261. {
  262.     return ResolveOrThrow()->GetDefaultString(value);
  263. }
  264. AutoPtr<CTypeStrings> CReferenceDataType::GenerateCode(void) const
  265. {
  266.     return CParent::GenerateCode();
  267. }
  268. AutoPtr<CTypeStrings> CReferenceDataType::GetFullCType(void) const
  269. {
  270.     const CDataType* resolved = ResolveOrThrow();
  271.     if ( resolved->Skipped() )
  272.         return resolved->GetFullCType();
  273.     else
  274.         return resolved->GetRefCType();
  275. }
  276. CDataType* CReferenceDataType::ResolveOrNull(void) const
  277. {
  278.     try {
  279.         return ResolveLocal(m_UserTypeName);
  280.     }
  281.     catch ( CNotFoundException& /* ignored */) {
  282.     }
  283.     return 0;
  284. }
  285. CDataType* CReferenceDataType::ResolveOrThrow(void) const
  286. {
  287.     try {
  288.         return ResolveLocal(m_UserTypeName);
  289.     }
  290.     catch ( CNotFoundException& exc) {
  291.         NCBI_RETHROW_SAME(exc, LocationString());
  292.     }
  293.     // ASSERT("Not reached" == 0);
  294.     return static_cast<CDataType*>(NULL);  // Happy compiler fix
  295. }
  296. CDataType* CReferenceDataType::Resolve(void)
  297. {
  298.     CDataType* resolved = ResolveOrNull();
  299.     if ( !resolved )
  300.         return this;
  301.     return resolved;
  302. }
  303. const CDataType* CReferenceDataType::Resolve(void) const
  304. {
  305.     CDataType* resolved = ResolveOrNull();
  306.     if ( !resolved )
  307.         return this;
  308.     return resolved;
  309. }
  310. END_NCBI_SCOPE