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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: type.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:43:54  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.80
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: type.cpp,v 1000.2 2004/06/01 19:43:54 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. *   Base class for type description
  38. */
  39. #include <ncbi_pch.hpp>
  40. #include <serial/datatool/type.hpp>
  41. #include <serial/autoptrinfo.hpp>
  42. #include <serial/datatool/value.hpp>
  43. #include <serial/datatool/blocktype.hpp>
  44. #include <serial/datatool/module.hpp>
  45. #include <serial/datatool/classstr.hpp>
  46. #include <serial/datatool/aliasstr.hpp>
  47. #include <serial/datatool/exceptions.hpp>
  48. #include <serial/datatool/reftype.hpp>
  49. #include <serial/datatool/unitype.hpp>
  50. #include <serial/datatool/choicetype.hpp>
  51. #include <serial/datatool/statictype.hpp>
  52. #include <serial/datatool/enumtype.hpp>
  53. #include <serial/datatool/fileutil.hpp>
  54. #include <serial/datatool/srcutil.hpp>
  55. #include <algorithm>
  56. BEGIN_NCBI_SCOPE
  57. bool CDataType::sm_EnforcedStdXml = false;
  58. set<string> CDataType::sm_SavedNames;
  59. class CAnyTypeSource : public CTypeInfoSource
  60. {
  61. public:
  62.     CAnyTypeSource(CDataType* type)
  63.         : m_Type(type)
  64.         {
  65.         }
  66.     TTypeInfo GetTypeInfo(void);
  67. private:
  68.     CDataType* m_Type;
  69. };
  70. TTypeInfo CAnyTypeSource::GetTypeInfo(void)
  71. {
  72.     return m_Type->GetAnyTypeInfo();
  73. }
  74. CDataType::CDataType(void)
  75.     : m_ParentType(0), m_Module(0), m_SourceLine(0),
  76.       m_DataMember(0), m_TypeStr(0), m_Set(0), m_Choice(0), m_Checked(false),
  77.       m_Tag(eNoExplicitTag), m_IsAlias(false)
  78. {
  79. }
  80. CDataType::~CDataType()
  81. {
  82. // NOTE:  This compiler bug was fixed by Jan 24 2002, test passed with:
  83. //           CC: Sun WorkShop 6 update 2 C++ 5.3 Patch 111685-03 2001/10/19
  84. //        We leave the workaround here for maybe half a year (for other guys).
  85. #if defined(NCBI_COMPILER_WORKSHOP)
  86. // We have to use two #if's here because KAI C++ cannot handle #if foo == bar
  87. #  if (NCBI_COMPILER_VERSION == 530)
  88.     // BW_010::  to workaround (already reported to SUN, CASE ID 62563729)
  89.     //           internal bug of the SUN Forte 6 Update 1 and Update 2 compiler
  90.     (void) atoi("5");
  91. #  endif
  92. #endif
  93. }
  94. void CDataType::SetSourceLine(int line)
  95. {
  96.     m_SourceLine = line;
  97. }
  98. void CDataType::Warning(const string& mess) const
  99. {
  100.     CNcbiDiag() << LocationString() << ": " << mess;
  101. }
  102. void CDataType::PrintASNTypeComments(CNcbiOstream& out, int indent) const
  103. {
  104.     m_Comments.PrintASN(out, indent);
  105. }
  106. void CDataType::PrintDTD(CNcbiOstream& out) const
  107. {
  108.     if (x_IsSavedName(XmlTagName())) {
  109.         return;
  110.     }
  111.     m_Comments.PrintDTD(out);
  112.     PrintDTDElement(out);
  113.     out << 'n';
  114.     x_AddSavedName(XmlTagName());
  115.     PrintDTDExtra(out);
  116. }
  117. void CDataType::PrintDTD(CNcbiOstream& out,
  118.                          const CComments& extra) const
  119. {
  120.     if (x_IsSavedName(XmlTagName())) {
  121.         return;
  122.     }
  123.     m_Comments.PrintDTD(out);
  124.     bool oneLineComment = extra.OneLine();
  125.     if ( !oneLineComment )
  126.         extra.PrintDTD(out);
  127.     PrintDTDElement(out);
  128.     if ( oneLineComment ) {
  129.         out << ' ';
  130.         extra.PrintDTD(out, CComments::eOneLine);
  131.     }
  132.     out << 'n';
  133.     x_AddSavedName(XmlTagName());
  134.     PrintDTDExtra(out);
  135. }
  136. void CDataType::PrintDTDExtra(CNcbiOstream& /*out*/) const
  137. {
  138. }
  139. // XML schema generator submitted by
  140. // Marc Dumontier, Blueprint initiative, dumontier@mshri.on.ca
  141. void CDataType::PrintXMLSchema(CNcbiOstream& out) const
  142. {
  143.     if (m_DataMember && (m_DataMember->Attlist() || m_DataMember->Notag())) {
  144.         return;
  145.     }
  146.     if (x_IsSavedName(XmlTagName())) {
  147.         return;
  148.     }
  149. //    out <<
  150. //        "<!-- Definition of "<< XmlTagName() <<" -->n"
  151. //        "n";
  152.     m_Comments.PrintDTD(out);
  153.     PrintXMLSchemaElement(out);
  154.     out << 'n';
  155.     x_AddSavedName(XmlTagName());
  156.     PrintXMLSchemaExtra(out);
  157.     out << 'n';
  158. }
  159.                                                                                                                                                       
  160. void CDataType::PrintXMLSchema(CNcbiOstream& out,
  161.                          const CComments& extra) const
  162. {
  163.     if (m_DataMember && (m_DataMember->Attlist() || m_DataMember->Notag())) {
  164.         return;
  165.     }
  166.     if (x_IsSavedName(XmlTagName())) {
  167.         return;
  168.     }
  169. //    out <<
  170. //        "<!-- Definition of "<< XmlTagName() <<" -->n"
  171. //        "n";
  172.     m_Comments.PrintDTD(out);
  173.     bool oneLineComment = extra.OneLine();
  174.     if ( oneLineComment ) {
  175.         out << ' ';
  176.         extra.PrintDTD(out, CComments::eOneLine);
  177.         out << 'n';
  178.     } else {
  179.         extra.PrintDTD(out);
  180.     }
  181.     PrintXMLSchemaElement(out);
  182.     out << 'n';
  183.     x_AddSavedName(XmlTagName());
  184.     PrintXMLSchemaExtra(out);
  185.     out << 'n';
  186. }
  187. void CDataType::PrintXMLSchemaExtra(CNcbiOstream& /*out*/) const
  188. {
  189. }
  190. void CDataType::SetInSet(const CUniSequenceDataType* sequence)
  191. {
  192.     _ASSERT(GetParentType() == sequence);
  193.     m_Set = sequence;
  194. }
  195. void CDataType::SetInChoice(const CChoiceDataType* choice)
  196. {
  197.     _ASSERT(GetParentType() == choice);
  198.     m_Choice = choice;
  199. }
  200. void CDataType::AddReference(const CReferenceDataType* reference)
  201. {
  202.     _ASSERT(GetParentType() == 0);
  203.     if ( !m_References )
  204.         m_References = new TReferences;
  205.     m_References->push_back(reference);
  206. }
  207. void CDataType::SetParent(const CDataType* parent, const string& memberName)
  208. {
  209.     _ASSERT(parent != 0);
  210.     _ASSERT(m_ParentType == 0 && m_Module == 0 && m_MemberName.empty());
  211.     m_ParentType = parent;
  212.     m_Module = parent->GetModule();
  213.     m_MemberName = memberName;
  214.     _ASSERT(m_Module != 0);
  215.     if (m_DataMember && m_DataMember->GetDefault()) {
  216.         m_DataMember->GetDefault()->SetModule(m_Module);
  217.     }
  218.     FixTypeTree();
  219. }
  220. void CDataType::SetParent(const CDataTypeModule* module,
  221.                           const string& typeName)
  222. {
  223.     _ASSERT(module != 0);
  224.     _ASSERT(m_ParentType == 0 && m_Module == 0 && m_MemberName.empty());
  225.     m_Module = module;
  226.     m_MemberName = typeName;
  227.     FixTypeTree();
  228. }
  229. void CDataType::FixTypeTree(void) const
  230. {
  231. }
  232. bool CDataType::Check(void)
  233. {
  234.     if ( m_Checked )
  235.         return true;
  236.     m_Checked = true;
  237.     _ASSERT(m_Module != 0);
  238.     return CheckType();
  239. }
  240. bool CDataType::CheckType(void) const
  241. {
  242.     return true;
  243. }
  244. const string CDataType::GetVar(const string& varName) const
  245. {
  246.     const CDataType* parent = GetParentType();
  247.     if ( !parent ) {
  248.         return GetModule()->GetVar(m_MemberName, varName);
  249.     }
  250.     else {
  251.         return parent->GetVar(m_MemberName + '.' + varName);
  252.     }
  253. }
  254. void  CDataType::ForbidVar(const string& var, const string& value)
  255. {
  256.     typedef multimap<string, string> TMultimap;
  257.     if (!var.empty() && !value.empty()) {
  258.         TMultimap::const_iterator it = m_ForbidVar.find(var);
  259.         for ( ; it != m_ForbidVar.end() && it->first == var; ++it) {
  260.             if (it->second == value) {
  261.                 return;
  262.             }
  263.         }
  264.         m_ForbidVar.insert(TMultimap::value_type(var, value));
  265.     }
  266. }
  267. void  CDataType::AllowVar(const string& var, const string& value)
  268. {
  269.     if (!var.empty() && !value.empty()) {
  270.         multimap<string,string>::iterator it = m_ForbidVar.find(var);
  271.         for ( ; it != m_ForbidVar.end() && it->first == var; ++it) {
  272.             if (it->second == value) {
  273.                 m_ForbidVar.erase(it);
  274.                 return;
  275.             }
  276.         }
  277.     }
  278. }
  279. const string CDataType::GetAndVerifyVar(const string& var) const
  280. {
  281.     const string tmp = GetVar(var);
  282.     if (!tmp.empty()) {
  283.         multimap<string,string>::const_iterator it = m_ForbidVar.find(var);
  284.         for ( ; it != m_ForbidVar.end() && it->first == var; ++it) {
  285.             if (it->second == tmp) {
  286.                 NCBI_THROW(CDatatoolException,eForbidden,
  287.                     IdName()+": forbidden "+var+"="+tmp);
  288.             }
  289.         }
  290.     }
  291.     return tmp;
  292. }
  293. const string& CDataType::GetSourceFileName(void) const
  294. {
  295.     return GetModule()->GetSourceFileName();
  296. }
  297. string CDataType::LocationString(void) const
  298. {
  299.     return GetSourceFileName() + ':' + NStr::IntToString(GetSourceLine()) +
  300.         ": " + IdName(); 
  301. }
  302. string CDataType::IdName(void) const
  303. {
  304.     const CDataType* parent = GetParentType();
  305.     if ( !parent ) {
  306.         // root type
  307.         return m_MemberName;
  308.     }
  309.     else {
  310.         // member
  311.         return parent->IdName() + '.' + m_MemberName;
  312.     }
  313. }
  314. string CDataType::XmlTagName(void) const
  315. {
  316.     if (GetEnforcedStdXml()) {
  317.         return m_MemberName;
  318.     }
  319.     const CDataType* parent = GetParentType();
  320.     if ( !parent ) {
  321.         // root type
  322.         return m_MemberName;
  323.     }
  324.     else {
  325.         // member
  326.         return parent->XmlTagName() + '_' + m_MemberName;
  327.     }
  328. }
  329. const string& CDataType::GlobalName(void) const
  330. {
  331.     if ( !GetParentType() )
  332.         return m_MemberName;
  333.     else
  334.         return NcbiEmptyString;
  335. }
  336. string CDataType::GetKeyPrefix(void) const
  337. {
  338.     const CDataType* parent = GetParentType();
  339.     if ( !parent ) {
  340.         // root type
  341.         return NcbiEmptyString;
  342.     }
  343.     else {
  344.         // member
  345.         string parentPrefix = parent->GetKeyPrefix();
  346.         if ( parentPrefix.empty() )
  347.             return m_MemberName;
  348.         else
  349.             return parentPrefix + '.' + m_MemberName;
  350.     }
  351. }
  352. bool CDataType::Skipped(void) const
  353. {
  354.     return GetVar("_class") == "-";
  355. }
  356. string CDataType::ClassName(void) const
  357. {
  358.     const string& cls = GetVar("_class");
  359.     if ( !cls.empty() )
  360.         return cls;
  361.     if ( GetParentType() ) {
  362.         // local type
  363.         return "C_"+Identifier(m_MemberName);
  364.     }
  365.     else {
  366.         // global type
  367.         return 'C'+Identifier(m_MemberName);
  368.     }
  369. }
  370. string CDataType::FileName(void) const
  371. {
  372.     if ( GetParentType() ) {
  373.         return GetParentType()->FileName();
  374.     }
  375.     if ( m_CachedFileName.empty() ) {
  376.         const string& file = GetVar("_file");
  377.         if ( !file.empty() ) {
  378.             m_CachedFileName = file;
  379.         }
  380.         else {
  381.             string dir = GetVar("_dir");
  382.             if ( dir.empty() ) {
  383.                 _ASSERT(!GetParentType()); // for non internal classes
  384.                 dir = GetModule()->GetFileNamePrefix();
  385.             }
  386.             m_CachedFileName =
  387.                 Path(dir,
  388.                      MakeFileName(m_MemberName, 5 /* strlen("_.cpp") */ ));
  389.         }
  390.     }
  391.     return m_CachedFileName;
  392. }
  393. const CNamespace& CDataType::Namespace(void) const
  394. {
  395.     if ( !m_CachedNamespace.get() ) {
  396.         const string& ns = GetVar("_namespace");
  397.         if ( !ns.empty() ) {
  398.             m_CachedNamespace.reset(new CNamespace(ns));
  399.         }
  400.         else {
  401.             if ( GetParentType() ) {
  402.                 return GetParentType()->Namespace();
  403.             }
  404.             else {
  405.                 return GetModule()->GetNamespace();
  406.             }
  407.         }
  408.     }
  409.     return *m_CachedNamespace;
  410. }
  411. string CDataType::InheritFromClass(void) const
  412. {
  413.     return GetVar("_parent_class");
  414. }
  415. const CDataType* CDataType::InheritFromType(void) const
  416. {
  417.     const string& parentName = GetVar("_parent_type");
  418.     if ( !parentName.empty() )
  419.         return ResolveGlobal(parentName);
  420.     return 0;
  421. }
  422. CDataType* CDataType::Resolve(void)
  423. {
  424.     return this;
  425. }
  426. const CDataType* CDataType::Resolve(void) const
  427. {
  428.     return this;
  429. }
  430. CDataType* CDataType::ResolveLocal(const string& name) const
  431. {
  432.     return GetModule()->Resolve(name);
  433. }
  434. CDataType* CDataType::ResolveGlobal(const string& name) const
  435. {
  436.     SIZE_TYPE dot = name.find('.');
  437.     if ( dot == NPOS ) {
  438.         // no module specified
  439.         return GetModule()->Resolve(name);
  440.     }
  441.     else {
  442.         // resolve by module
  443.         string moduleName = name.substr(0, dot);
  444.         string typeName = name.substr(dot + 1);
  445.         return GetModule()->GetModuleContainer().InternalResolve(moduleName,
  446.                                                                  typeName);
  447.     }
  448. }
  449. CTypeRef CDataType::GetTypeInfo(void)
  450. {
  451.     if ( !m_TypeRef )
  452.         m_TypeRef = CTypeRef(new CAnyTypeSource(this));
  453.     return m_TypeRef;
  454. }
  455. TTypeInfo CDataType::GetAnyTypeInfo(void)
  456. {
  457.     TTypeInfo typeInfo = m_AnyTypeInfo.get();
  458.     if ( !typeInfo ) {
  459.         typeInfo = GetRealTypeInfo();
  460.         if ( NeedAutoPointer(typeInfo) ) {
  461.             m_AnyTypeInfo.reset(new CAutoPointerTypeInfo(typeInfo));
  462.             typeInfo = m_AnyTypeInfo.get();
  463.         }
  464.     }
  465.     return typeInfo;
  466. }
  467. bool CDataType::NeedAutoPointer(TTypeInfo typeInfo) const
  468. {
  469.     return typeInfo->GetSize() > sizeof(AnyType);
  470. }
  471. TTypeInfo CDataType::GetRealTypeInfo(void)
  472. {
  473.     TTypeInfo typeInfo = m_RealTypeInfo.get();
  474.     if ( !typeInfo ) {
  475.         m_RealTypeInfo.reset(CreateTypeInfo());
  476.         typeInfo = m_RealTypeInfo.get();
  477.     }
  478.     return typeInfo;
  479. }
  480. CTypeInfo* CDataType::CreateTypeInfo(void)
  481. {
  482.     NCBI_THROW(CDatatoolException,eIllegalCall,
  483.         "cannot create type info of "+IdName());
  484. }
  485. CTypeInfo* CDataType::UpdateModuleName(CTypeInfo* typeInfo) const
  486. {
  487.     if ( HaveModuleName() )
  488.         typeInfo->SetModuleName(GetModule()->GetName());
  489.     return typeInfo;
  490. }
  491. AutoPtr<CTypeStrings> CDataType::GenerateCode(void) const
  492. {
  493.     if ( !IsAlias() ) {
  494.         AutoPtr<CClassTypeStrings> code(new CClassTypeStrings(GlobalName(),
  495.                                                               ClassName()));
  496.         AutoPtr<CTypeStrings> dType = GetFullCType();
  497.         bool nonempty = false, noprefix = false;
  498.         const CUniSequenceDataType* uniseq =
  499.             dynamic_cast<const CUniSequenceDataType*>(this);
  500.         if (uniseq) {
  501.             nonempty = uniseq->IsNonEmpty();
  502.             noprefix = uniseq->IsNoPrefix();
  503.         }
  504.         code->AddMember(dType, GetTag(), nonempty, noprefix);
  505.         SetParentClassTo(*code);
  506.         return AutoPtr<CTypeStrings>(code.release());
  507.     }
  508.     else {
  509.         AutoPtr<CTypeStrings> dType = GetFullCType();
  510.         AutoPtr<CAliasTypeStrings> code(new CAliasTypeStrings(GlobalName(),
  511.                                                               ClassName(),
  512.                                                               *dType.release()));
  513.         return AutoPtr<CTypeStrings>(code.release());
  514.     }
  515. }
  516. void CDataType::SetParentClassTo(CClassTypeStrings& code) const
  517. {
  518.     const CDataType* parent = InheritFromType();
  519.     if ( parent ) {
  520.         code.SetParentClass(parent->ClassName(),
  521.                             parent->Namespace(),
  522.                             parent->FileName());
  523.     }
  524.     else {
  525.         string parentClassName = InheritFromClass();
  526.         if ( !parentClassName.empty() ) {
  527.             SIZE_TYPE pos = parentClassName.rfind("::");
  528.             if ( pos != NPOS ) {
  529.                 code.SetParentClass(parentClassName.substr(pos + 2),
  530.                                     CNamespace(parentClassName.substr(0, pos)),
  531.                                     NcbiEmptyString);
  532.             }
  533.             else {
  534.                 code.SetParentClass(parentClassName,
  535.                                     CNamespace::KEmptyNamespace,
  536.                                     NcbiEmptyString);
  537.             }
  538.         }
  539.     }
  540. }
  541. AutoPtr<CTypeStrings> CDataType::GetRefCType(void) const
  542. {
  543.     if ( !IsAlias() ) {
  544.         return AutoPtr<CTypeStrings>(new CClassRefTypeStrings(ClassName(),
  545.                                                               Namespace(),
  546.                                                               FileName()));
  547.     }
  548.     else {
  549.         AutoPtr<CTypeStrings> dType = GetFullCType();
  550.         AutoPtr<CAliasRefTypeStrings> code(new CAliasRefTypeStrings(ClassName(),
  551.                                                                     Namespace(),
  552.                                                                     FileName(),
  553.                                                                     *dType.release()));
  554.         return AutoPtr<CTypeStrings>(code.release());
  555.     }
  556. }
  557. AutoPtr<CTypeStrings> CDataType::GetFullCType(void) const
  558. {
  559.     NCBI_THROW(CDatatoolException,eInvalidData,
  560.         LocationString() + ": C++ type undefined");
  561. }
  562. string CDataType::GetDefaultString(const CDataValue& ) const
  563. {
  564.     Warning("Default is not supported by this type");
  565.     return "...";
  566. }
  567. bool CDataType::IsPrimitive(void) const
  568. {
  569.     const CStaticDataType* st = dynamic_cast<const CStaticDataType*>(this);
  570.     if (st) {
  571.         const CBoolDataType* b = dynamic_cast<const CBoolDataType*>(this);
  572.         if (b) {
  573.             return true;
  574.         }
  575.         const CIntDataType* i = dynamic_cast<const CIntDataType*>(this);
  576.         if (i) {
  577.             return true;
  578.         }
  579.         const CRealDataType* r = dynamic_cast<const CRealDataType*>(this);
  580.         if (r) {
  581.             return true;
  582.         }
  583.     }
  584.     const CEnumDataType* e = dynamic_cast<const CEnumDataType*>(this);
  585.     if (e) {
  586.         return true;
  587.     }
  588.     return false;
  589. }
  590. bool CDataType::IsStdType(void) const
  591. {
  592.     // Primitive (except enums) or string
  593.     const CStaticDataType* st = dynamic_cast<const CStaticDataType*>(this);
  594.     if (st) {
  595.         const CBoolDataType* b = dynamic_cast<const CBoolDataType*>(this);
  596.         if (b) {
  597.             return true;
  598.         }
  599.         const CIntDataType* i = dynamic_cast<const CIntDataType*>(this);
  600.         if (i) {
  601.             return true;
  602.         }
  603.         const CRealDataType* r = dynamic_cast<const CRealDataType*>(this);
  604.         if (r) {
  605.             return true;
  606.         }
  607.         const COctetStringDataType* o =
  608.             dynamic_cast<const COctetStringDataType*>(this);
  609.         if (o) {
  610.             return true;
  611.         }
  612.         const CStringDataType* s = dynamic_cast<const CStringDataType*>(this);
  613.         if (s) {
  614.             return true;
  615.         }
  616.     }
  617.     return false;
  618. }
  619. bool CDataType::IsReference(void) const
  620. {
  621.     return dynamic_cast<const CReferenceDataType*>(this) != 0;
  622. }
  623. bool CDataType::x_IsSavedName(const string& name)
  624. {
  625.     return sm_EnforcedStdXml &&
  626.         sm_SavedNames.find(name) != sm_SavedNames.end();
  627. }
  628. void CDataType::x_AddSavedName(const string& name)
  629. {
  630.     if (sm_EnforcedStdXml) {
  631.         sm_SavedNames.insert(name);
  632.     }
  633. }
  634. END_NCBI_SCOPE
  635. /*
  636. * ===========================================================================
  637. *
  638. * $Log: type.cpp,v $
  639. * Revision 1000.2  2004/06/01 19:43:54  gouriano
  640. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.80
  641. *
  642. * Revision 1.80  2004/05/19 17:24:18  gouriano
  643. * Corrected generation of C++ code by DTD for containers
  644. *
  645. * Revision 1.79  2004/05/17 21:03:14  gorelenk
  646. * Added include of PCH ncbi_pch.hpp
  647. *
  648. * Revision 1.78  2004/05/12 21:02:49  ucko
  649. * ForbidVar: Make sure to use exactly the right type of pair, since
  650. * WorkShop won't interconvert.
  651. *
  652. * Revision 1.77  2004/05/12 18:33:01  gouriano
  653. * Added type conversion check (when using _type DEF file directive)
  654. *
  655. * Revision 1.76  2004/03/25 21:55:41  ucko
  656. * CDataType::FileName: if we have a parent, (recursively) defer to it,
  657. * since internal classes don't have their own files.
  658. * Move CVS log to end at long last.
  659. *
  660. * Revision 1.75  2003/10/21 13:48:51  grichenk
  661. * Redesigned type aliases in serialization library.
  662. * Fixed the code (removed CRef-s, added explicit
  663. * initializers etc.)
  664. *
  665. * Revision 1.74  2003/10/02 19:40:14  gouriano
  666. * properly handle invalid enumeration values in ASN spec
  667. *
  668. * Revision 1.73  2003/06/24 20:55:42  gouriano
  669. * corrected code generation and serialization of non-empty unnamed containers (XML)
  670. *
  671. * Revision 1.72  2003/06/16 14:41:05  gouriano
  672. * added possibility to convert DTD to XML schema
  673. *
  674. * Revision 1.71  2003/05/14 14:42:22  gouriano
  675. * added generation of XML schema
  676. *
  677. * Revision 1.70  2003/04/29 18:31:09  gouriano
  678. * object data member initialization verification
  679. *
  680. * Revision 1.69  2003/03/10 18:55:19  gouriano
  681. * use new structured exceptions (based on CException)
  682. *
  683. * Revision 1.68  2003/02/12 21:39:51  gouriano
  684. * corrected code generator so primitive data types (bool,int,etc)
  685. * are returned by value, not by reference
  686. *
  687. * Revision 1.67  2003/02/10 17:56:14  gouriano
  688. * 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.
  689. *
  690. * Revision 1.66  2002/11/19 19:48:29  gouriano
  691. * added support of XML attributes of choice variants
  692. *
  693. * Revision 1.65  2002/11/14 21:04:02  gouriano
  694. * added support of XML attribute lists
  695. *
  696. * Revision 1.64  2002/01/24 23:30:16  vakatov
  697. * Note for ourselves that the bug workaround "BW_010" is not needed
  698. * anymore, and we should get rid of it in about half a year
  699. *
  700. * Revision 1.63  2001/10/15 19:48:27  vakatov
  701. * Use two #if's instead of "#if ... && ..." as KAI cannot handle #if x == y
  702. *
  703. * Revision 1.62  2001/09/04 17:04:03  vakatov
  704. * Extended workaround for the SUN Forte 6 Update 1 compiler internal bug
  705. * to all higher versions of the compiler, as Update 2 also has this the
  706. * same bug!
  707. *
  708. * Revision 1.61  2001/08/20 20:23:20  vakatov
  709. * Workaround for the SUN Forte 6 Update 1 compiler internal bug.
  710. *
  711. * Revision 1.60  2001/06/11 14:35:02  grichenk
  712. * Added support for numeric tags in ASN.1 specifications and data streams.
  713. *
  714. * Revision 1.59  2001/05/17 15:07:12  lavr
  715. * Typos corrected
  716. *
  717. * Revision 1.58  2001/02/15 21:39:14  kholodov
  718. * Modified: pointer to parent CDataMember added to CDataType class.
  719. * Modified: default value for BOOLEAN type in DTD is copied from ASN.1 spec.
  720. *
  721. * Revision 1.57  2000/11/29 17:42:45  vasilche
  722. * Added CComment class for storing/printing ASN.1/XML module comments.
  723. * Added srcutil.hpp file to reduce file dependency.
  724. *
  725. * Revision 1.56  2000/11/20 17:26:33  vasilche
  726. * Fixed warnings on 64 bit platforms.
  727. * Updated names of config variables.
  728. *
  729. * Revision 1.55  2000/11/15 20:34:56  vasilche
  730. * Added user comments to ENUMERATED types.
  731. * Added storing of user comments to ASN.1 module definition.
  732. *
  733. * Revision 1.54  2000/11/14 21:41:26  vasilche
  734. * Added preserving of ASN.1 definition comments.
  735. *
  736. * Revision 1.53  2000/11/07 17:26:26  vasilche
  737. * Added module names to CTypeInfo and CEnumeratedTypeValues
  738. * Added possibility to set include directory for whole module
  739. *
  740. * Revision 1.52  2000/09/26 17:38:27  vasilche
  741. * Fixed incomplete choiceptr implementation.
  742. * Removed temporary comments.
  743. *
  744. * Revision 1.51  2000/08/25 15:59:24  vasilche
  745. * Renamed directory tool -> datatool.
  746. *
  747. * Revision 1.50  2000/07/03 20:47:28  vasilche
  748. * Removed unused variables/functions.
  749. *
  750. * Revision 1.49  2000/06/27 16:34:47  vasilche
  751. * Fixed generated comments.
  752. * Fixed class names conflict. Now internal classes' names begin with "C_".
  753. *
  754. * Revision 1.48  2000/05/24 20:09:30  vasilche
  755. * Implemented DTD generation.
  756. *
  757. * Revision 1.47  2000/05/03 14:38:18  vasilche
  758. * SERIAL: added support for delayed reading to generated classes.
  759. * DATATOOL: added code generation for delayed reading.
  760. *
  761. * Revision 1.46  2000/04/17 19:11:09  vasilche
  762. * Fixed failed assertion.
  763. * Removed redundant namespace specifications.
  764. *
  765. * Revision 1.45  2000/04/12 15:36:52  vasilche
  766. * Added -on <namespace> argument to datatool.
  767. * Removed unnecessary namespace specifications in generated files.
  768. *
  769. * Revision 1.44  2000/04/07 19:26:35  vasilche
  770. * Added namespace support to datatool.
  771. * By default with argument -oR datatool will generate objects in namespace
  772. * NCBI_NS_NCBI::objects (aka ncbi::objects).
  773. * Datatool's classes also moved to NCBI namespace.
  774. *
  775. * Revision 1.43  2000/03/29 15:52:27  vasilche
  776. * Generated files names limited to 31 symbols due to limitations of Mac.
  777. * Removed unions with only one member.
  778. *
  779. * Revision 1.42  2000/03/07 14:06:33  vasilche
  780. * Added generation of reference counted objects.
  781. *
  782. * Revision 1.41  2000/02/17 20:05:07  vasilche
  783. * Inline methods now will be generated in *_Base.inl files.
  784. * Fixed processing of StringStore.
  785. * Renamed in choices: Selected() -> Which(), E_choice -> E_Choice.
  786. * Enumerated values now will preserve case as in ASN.1 definition.
  787. *
  788. * Revision 1.40  2000/02/01 21:48:07  vasilche
  789. * Added CGeneratedChoiceTypeInfo for generated choice classes.
  790. * Removed CMemberInfo subclasses.
  791. * Added support for DEFAULT/OPTIONAL members.
  792. * Changed class generation.
  793. * Moved datatool headers to include/internal/serial/tool.
  794. *
  795. * Revision 1.39  2000/01/10 19:46:46  vasilche
  796. * Fixed encoding/decoding of REAL type.
  797. * Fixed encoding/decoding of StringStore.
  798. * Fixed encoding/decoding of NULL type.
  799. * Fixed error reporting.
  800. * Reduced object map (only classes).
  801. *
  802. * Revision 1.38  1999/12/29 16:01:51  vasilche
  803. * Added explicit virtual destructors.
  804. * Resolved overloading of InternalResolve.
  805. *
  806. * Revision 1.37  1999/12/28 18:56:00  vasilche
  807. * Reduced size of compiled object files:
  808. * 1. avoid inline or implicit virtual methods (especially destructors).
  809. * 2. avoid std::string's methods usage in inline methods.
  810. * 3. avoid string literals ("xxx") in inline methods.
  811. *
  812. * Revision 1.36  1999/12/21 17:18:37  vasilche
  813. * Added CDelayedFostream class which rewrites file only if contents is changed.
  814. *
  815. * Revision 1.35  1999/12/20 21:00:19  vasilche
  816. * Added generation of sources in different directories.
  817. *
  818. * Revision 1.34  1999/12/08 19:06:24  vasilche
  819. * Fixed uninitialized variable.
  820. *
  821. * Revision 1.33  1999/12/03 21:42:13  vasilche
  822. * Fixed conflict of enums in choices.
  823. *
  824. * Revision 1.32  1999/12/01 17:36:27  vasilche
  825. * Fixed CHOICE processing.
  826. *
  827. * Revision 1.31  1999/11/16 15:41:17  vasilche
  828. * Added plain pointer choice.
  829. * By default we use C pointer instead of auto_ptr.
  830. * Start adding initializers.
  831. *
  832. * Revision 1.30  1999/11/15 19:36:19  vasilche
  833. * Fixed warnings on GCC
  834. *
  835. * ===========================================================================
  836. */