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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: unitype.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:44:00  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.31
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: unitype.cpp,v 1000.2 2004/06/01 19:44:00 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 description of 'SET OF' and 'SEQUENCE OF'
  38. *
  39. * ---------------------------------------------------------------------------
  40. * $Log: unitype.cpp,v $
  41. * Revision 1000.2  2004/06/01 19:44:00  gouriano
  42. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.31
  43. *
  44. * Revision 1.31  2004/05/19 17:24:18  gouriano
  45. * Corrected generation of C++ code by DTD for containers
  46. *
  47. * Revision 1.30  2004/05/17 21:03:14  gorelenk
  48. * Added include of PCH ncbi_pch.hpp
  49. *
  50. * Revision 1.29  2004/05/12 18:33:01  gouriano
  51. * Added type conversion check (when using _type DEF file directive)
  52. *
  53. * Revision 1.28  2004/04/02 16:56:33  gouriano
  54. * made it possible to create named CTypeInfo for containers
  55. *
  56. * Revision 1.27  2003/06/24 20:55:42  gouriano
  57. * corrected code generation and serialization of non-empty unnamed containers (XML)
  58. *
  59. * Revision 1.26  2003/06/16 14:41:05  gouriano
  60. * added possibility to convert DTD to XML schema
  61. *
  62. * Revision 1.25  2003/05/14 14:42:22  gouriano
  63. * added generation of XML schema
  64. *
  65. * Revision 1.24  2003/03/11 20:06:47  kuznets
  66. * iterate -> ITERATE
  67. *
  68. * Revision 1.23  2003/03/10 18:55:19  gouriano
  69. * use new structured exceptions (based on CException)
  70. *
  71. * Revision 1.22  2003/02/10 17:56:14  gouriano
  72. * 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.
  73. *
  74. * Revision 1.21  2002/01/22 22:01:15  grichenk
  75. * Fixed generation of list<> from "SET OF"
  76. *
  77. * Revision 1.20  2002/01/16 21:30:18  grichenk
  78. * ANS.1 SET OF is implemented as list<> by default
  79. *
  80. * Revision 1.19  2000/11/15 20:34:56  vasilche
  81. * Added user comments to ENUMERATED types.
  82. * Added storing of user comments to ASN.1 module definition.
  83. *
  84. * Revision 1.18  2000/11/14 21:41:27  vasilche
  85. * Added preserving of ASN.1 definition comments.
  86. *
  87. * Revision 1.17  2000/11/08 17:02:53  vasilche
  88. * Added generation of modular DTD files.
  89. *
  90. * Revision 1.16  2000/11/07 17:26:26  vasilche
  91. * Added module names to CTypeInfo and CEnumeratedTypeValues
  92. * Added possibility to set include directory for whole module
  93. *
  94. * Revision 1.15  2000/11/01 20:38:59  vasilche
  95. * OPTIONAL and DEFAULT are not permitted in CHOICE.
  96. * Fixed code generation for DEFAULT.
  97. *
  98. * Revision 1.14  2000/10/13 16:28:45  vasilche
  99. * Reduced header dependency.
  100. * Avoid use of templates with virtual methods.
  101. * Reduced amount of different maps used.
  102. * All this lead to smaller compiled code size (libraries and programs).
  103. *
  104. * Revision 1.13  2000/08/25 15:59:25  vasilche
  105. * Renamed directory tool -> datatool.
  106. *
  107. * Revision 1.12  2000/06/16 16:31:41  vasilche
  108. * Changed implementation of choices and classes info to allow use of the same classes in generated and user written classes.
  109. *
  110. * Revision 1.11  2000/05/24 20:09:30  vasilche
  111. * Implemented DTD generation.
  112. *
  113. * Revision 1.10  2000/04/10 18:39:00  vasilche
  114. * Fixed generation of map<> from SEQUENCE/SET OF SEQUENCE.
  115. *
  116. * Revision 1.9  2000/04/07 19:26:37  vasilche
  117. * Added namespace support to datatool.
  118. * By default with argument -oR datatool will generate objects in namespace
  119. * NCBI_NS_NCBI::objects (aka ncbi::objects).
  120. * Datatool's classes also moved to NCBI namespace.
  121. *
  122. * Revision 1.8  2000/02/01 21:48:09  vasilche
  123. * Added CGeneratedChoiceTypeInfo for generated choice classes.
  124. * Removed CMemberInfo subclasses.
  125. * Added support for DEFAULT/OPTIONAL members.
  126. * Changed class generation.
  127. * Moved datatool headers to include/internal/serial/tool.
  128. *
  129. * Revision 1.7  2000/01/10 19:46:47  vasilche
  130. * Fixed encoding/decoding of REAL type.
  131. * Fixed encoding/decoding of StringStore.
  132. * Fixed encoding/decoding of NULL type.
  133. * Fixed error reporting.
  134. * Reduced object map (only classes).
  135. *
  136. * Revision 1.6  1999/12/17 19:05:19  vasilche
  137. * Simplified generation of GetTypeInfo methods.
  138. *
  139. * Revision 1.5  1999/12/03 21:42:14  vasilche
  140. * Fixed conflict of enums in choices.
  141. *
  142. * Revision 1.4  1999/12/01 17:36:29  vasilche
  143. * Fixed CHOICE processing.
  144. *
  145. * Revision 1.3  1999/11/16 15:41:18  vasilche
  146. * Added plain pointer choice.
  147. * By default we use C pointer instead of auto_ptr.
  148. * Start adding initializers.
  149. *
  150. * Revision 1.2  1999/11/15 19:36:21  vasilche
  151. * Fixed warnings on GCC
  152. *
  153. * ===========================================================================
  154. */
  155. #include <ncbi_pch.hpp>
  156. #include <serial/stltypes.hpp>
  157. #include <serial/autoptrinfo.hpp>
  158. #include <serial/datatool/exceptions.hpp>
  159. #include <serial/datatool/unitype.hpp>
  160. #include <serial/datatool/blocktype.hpp>
  161. #include <serial/datatool/statictype.hpp>
  162. #include <serial/datatool/stlstr.hpp>
  163. #include <serial/datatool/value.hpp>
  164. #include <serial/datatool/reftype.hpp>
  165. BEGIN_NCBI_SCOPE
  166. CUniSequenceDataType::CUniSequenceDataType(const AutoPtr<CDataType>& element)
  167. {
  168.     SetElementType(element);
  169.     m_NonEmpty = false;
  170.     m_NoPrefix = false;
  171.     ForbidVar("_type", "short");
  172.     ForbidVar("_type", "int");
  173.     ForbidVar("_type", "long");
  174.     ForbidVar("_type", "unsigned");
  175.     ForbidVar("_type", "unsigned short");
  176.     ForbidVar("_type", "unsigned int");
  177.     ForbidVar("_type", "unsigned long");
  178.     ForbidVar("_type", "string");
  179. }
  180. const char* CUniSequenceDataType::GetASNKeyword(void) const
  181. {
  182.     return "SEQUENCE";
  183. }
  184. void CUniSequenceDataType::SetElementType(const AutoPtr<CDataType>& type)
  185. {
  186.     if ( GetElementType() )
  187.         NCBI_THROW(CDatatoolException,eInvalidData,
  188.             "double element type " + LocationString());
  189.     m_ElementType = type;
  190. }
  191. void CUniSequenceDataType::PrintASN(CNcbiOstream& out, int indent) const
  192. {
  193.     out << GetASNKeyword() << " OF ";
  194.     GetElementType()->PrintASNTypeComments(out, indent + 1);
  195.     GetElementType()->PrintASN(out, indent);
  196. }
  197. void CUniSequenceDataType::PrintDTDElement(CNcbiOstream& out) const
  198. {
  199.     const CDataType* data = GetElementType();
  200.     const CStaticDataType* elemType = 0;
  201.     if (GetEnforcedStdXml()) {
  202.         elemType = dynamic_cast<const CStaticDataType*>(data);
  203.     }
  204.     const CReferenceDataType* ref =
  205.         dynamic_cast<const CReferenceDataType*>(data);
  206.     out <<
  207.         "<!ELEMENT "<< XmlTagName() << ' ';
  208.     if ( ref ) {
  209.         out <<"( " << ref->UserTypeXmlTagName() << "* )";
  210.     } else {
  211.         if (elemType) {
  212.             out << elemType->GetXMLContents();
  213.         } else {
  214.             out <<"( " << data->XmlTagName() << "* )";
  215.         }
  216.     }
  217.     out << '>';
  218. }
  219. void CUniSequenceDataType::PrintDTDExtra(CNcbiOstream& out) const
  220. {
  221.     const CDataType* data = GetElementType();
  222.     const CStaticDataType* elemType = 0;
  223.     if (GetEnforcedStdXml()) {
  224.         elemType = dynamic_cast<const CStaticDataType*>(data);
  225.         if (elemType) {
  226.             return;
  227.         }
  228.     }
  229.     const CReferenceDataType* ref =
  230.         dynamic_cast<const CReferenceDataType*>(data);
  231.     if ( !ref ) {
  232.         // array of internal type, we should generate tag for element type
  233.         if ( GetParentType() == 0 )
  234.             out << 'n';
  235.         data->PrintDTD(out);
  236.     }
  237. }
  238. // XML schema generator submitted by
  239. // Marc Dumontier, Blueprint initiative, dumontier@mshri.on.ca
  240. // modified by Andrei Gourianov, gouriano@ncbi
  241. void CUniSequenceDataType::PrintXMLSchemaElement(CNcbiOstream& out) const
  242. {
  243.     const CDataType* typeElem = GetElementType();
  244.     const CReferenceDataType* typeRef =
  245.         dynamic_cast<const CReferenceDataType*>(typeElem);
  246.     string tag(XmlTagName());
  247.     string userType =
  248.         typeRef ? typeRef->UserTypeXmlTagName() : typeElem->XmlTagName();
  249.     if (tag == userType || (GetEnforcedStdXml() && !typeRef)) {
  250.         const CStaticDataType* typeStatic =
  251.             dynamic_cast<const CStaticDataType*>(typeElem);
  252.         if (typeStatic) {
  253.             typeStatic->PrintXMLSchemaElementWithTag( out, tag);
  254.         } else {
  255.             typeElem->PrintXMLSchemaElement(out);
  256.         }
  257.         return;
  258.     }
  259.     out << "<xs:element name="" << tag << "">n"
  260.         << "  <xs:complexType>n"
  261.         << "    <xs:sequence>n"
  262.         << "      <xs:element ref="" << userType
  263.         << "" minOccurs="0" maxOccurs="unbounded"/>n"
  264.         << "    </xs:sequence>n"
  265.         << "  </xs:complexType>n"
  266.         << "</xs:element>n";
  267. }
  268. void CUniSequenceDataType::PrintXMLSchemaExtra(CNcbiOstream& out) const
  269. {
  270.     const CDataType* typeElem = GetElementType();
  271.     const CReferenceDataType* typeRef =
  272.         dynamic_cast<const CReferenceDataType*>(typeElem);
  273.     string tag(XmlTagName());
  274.     string userType =
  275.         typeRef ? typeRef->UserTypeXmlTagName() : typeElem->XmlTagName();
  276.     if (tag == userType || (GetEnforcedStdXml() && !typeRef)) {
  277.         const CStaticDataType* typeStatic =
  278.             dynamic_cast<const CStaticDataType*>(typeElem);
  279.         if (!typeStatic) {
  280.             typeElem->PrintXMLSchemaExtra(out);
  281.         }
  282.         return;
  283.     }
  284.     if ( !typeRef ) {
  285.         if ( GetParentType() == 0 )
  286.             out << 'n';
  287.         typeElem->PrintXMLSchema(out);
  288.     }
  289. }
  290. void CUniSequenceDataType::FixTypeTree(void) const
  291. {
  292.     CParent::FixTypeTree();
  293.     m_ElementType->SetParent(this, "E");
  294.     m_ElementType->SetInSet(this);
  295. }
  296. bool CUniSequenceDataType::CheckType(void) const
  297. {
  298.     return m_ElementType->Check();
  299. }
  300. bool CUniSequenceDataType::CheckValue(const CDataValue& value) const
  301. {
  302.     const CBlockDataValue* block =
  303.         dynamic_cast<const CBlockDataValue*>(&value);
  304.     if ( !block ) {
  305.         value.Warning("block of values expected");
  306.         return false;
  307.     }
  308.     bool ok = true;
  309.     ITERATE ( CBlockDataValue::TValues, i, block->GetValues() ) {
  310.         if ( !m_ElementType->CheckValue(**i) )
  311.             ok = false;
  312.     }
  313.     return ok;
  314. }
  315. TObjectPtr CUniSequenceDataType::CreateDefault(const CDataValue& ) const
  316. {
  317.     NCBI_THROW(CDatatoolException,eNotImplemented,
  318.         "SET/SEQUENCE OF default not implemented");
  319. }
  320. CTypeInfo* CUniSequenceDataType::CreateTypeInfo(void)
  321. {
  322.     return UpdateModuleName(CStlClassInfo_list<AnyType>::CreateTypeInfo(
  323.         m_ElementType->GetTypeInfo().Get(), GlobalName()));
  324. }
  325. bool CUniSequenceDataType::NeedAutoPointer(TTypeInfo /*typeInfo*/) const
  326. {
  327.     return true;
  328. }
  329. AutoPtr<CTypeStrings> CUniSequenceDataType::GetFullCType(void) const
  330. {
  331.     AutoPtr<CTypeStrings> tData = GetElementType()->GetFullCType();
  332.     CTypeStrings::AdaptForSTL(tData);
  333.     string templ = GetAndVerifyVar("_type");
  334.     if ( templ.empty() )
  335.         templ = "list";
  336.     return AutoPtr<CTypeStrings>(new CListTypeStrings(templ, tData));
  337. }
  338. CUniSetDataType::CUniSetDataType(const AutoPtr<CDataType>& elementType)
  339.     : CParent(elementType)
  340. {
  341. }
  342. const char* CUniSetDataType::GetASNKeyword(void) const
  343. {
  344.     return "SET";
  345. }
  346. CTypeInfo* CUniSetDataType::CreateTypeInfo(void)
  347. {
  348.     return UpdateModuleName(CStlClassInfo_list<AnyType>::CreateSetTypeInfo(GetElementType()->GetTypeInfo().Get()));
  349. }
  350. AutoPtr<CTypeStrings> CUniSetDataType::GetFullCType(void) const
  351. {
  352.     string templ = GetAndVerifyVar("_type");
  353.     const CDataSequenceType* seq =
  354.         dynamic_cast<const CDataSequenceType*>(GetElementType());
  355.     if ( seq && seq->GetMembers().size() == 2 ) {
  356.         const CDataMember& keyMember = *seq->GetMembers().front();
  357.         const CDataMember& valueMember = *seq->GetMembers().back();
  358.         if ( !keyMember.Optional() && !valueMember.Optional() ) {
  359.             AutoPtr<CTypeStrings> tKey = keyMember.GetType()->GetFullCType();
  360.             if ( tKey->CanBeKey() ) {
  361.                 AutoPtr<CTypeStrings> tValue = valueMember.GetType()->GetFullCType();
  362.                 CTypeStrings::AdaptForSTL(tValue);
  363.                 if ( templ.empty() )
  364.                     templ = "multimap";
  365.                 return AutoPtr<CTypeStrings>(new CMapTypeStrings(templ,
  366.                                                                  tKey,
  367.                                                                  tValue));
  368.             }
  369.         }
  370.     }
  371.     AutoPtr<CTypeStrings> tData = GetElementType()->GetFullCType();
  372.     CTypeStrings::AdaptForSTL(tData);
  373.     if ( templ.empty() ) {
  374.         if ( tData->CanBeKey() ) {
  375.             templ = "list";
  376.         }
  377.         else {
  378.             return AutoPtr<CTypeStrings>(new CListTypeStrings("list", tData, true));
  379.         }
  380.     }
  381.     return AutoPtr<CTypeStrings>(new CListTypeStrings(templ, tData, true));
  382. }
  383. END_NCBI_SCOPE