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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: stlstr.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:43:51  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.16
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: stlstr.cpp,v 1000.1 2004/06/01 19:43:51 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 info for class generation: includes, used classes, C code etc.
  38. *
  39. * ---------------------------------------------------------------------------
  40. * $Log: stlstr.cpp,v $
  41. * Revision 1000.1  2004/06/01 19:43:51  gouriano
  42. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.16
  43. *
  44. * Revision 1.16  2004/05/17 21:03:14  gorelenk
  45. * Added include of PCH ncbi_pch.hpp
  46. *
  47. * Revision 1.15  2003/04/29 18:31:09  gouriano
  48. * object data member initialization verification
  49. *
  50. * Revision 1.14  2003/03/10 18:55:19  gouriano
  51. * use new structured exceptions (based on CException)
  52. *
  53. * Revision 1.13  2001/05/17 15:07:12  lavr
  54. * Typos corrected
  55. *
  56. * Revision 1.12  2000/11/29 17:42:45  vasilche
  57. * Added CComment class for storing/printing ASN.1/XML module comments.
  58. * Added srcutil.hpp file to reduce file dependency.
  59. *
  60. * Revision 1.11  2000/08/25 15:59:24  vasilche
  61. * Renamed directory tool -> datatool.
  62. *
  63. * Revision 1.10  2000/07/11 20:36:29  vasilche
  64. * Removed unnecessary generation of namespace references for enum members.
  65. * Removed obsolete methods.
  66. *
  67. * Revision 1.9  2000/06/16 16:31:41  vasilche
  68. * Changed implementation of choices and classes info to allow use of the same classes in generated and user written classes.
  69. *
  70. * Revision 1.8  2000/04/17 19:11:09  vasilche
  71. * Fixed failed assertion.
  72. * Removed redundant namespace specifications.
  73. *
  74. * Revision 1.7  2000/04/12 15:36:52  vasilche
  75. * Added -on <namespace> argument to datatool.
  76. * Removed unnecessary namespace specifications in generated files.
  77. *
  78. * Revision 1.6  2000/04/07 19:26:34  vasilche
  79. * Added namespace support to datatool.
  80. * By default with argument -oR datatool will generate objects in namespace
  81. * NCBI_NS_NCBI::objects (aka ncbi::objects).
  82. * Datatool's classes also moved to NCBI namespace.
  83. *
  84. * Revision 1.5  2000/03/07 14:06:33  vasilche
  85. * Added generation of reference counted objects.
  86. *
  87. * Revision 1.4  2000/02/03 20:16:15  vasilche
  88. * Fixed bug in type info generation for templates.
  89. *
  90. * Revision 1.3  2000/02/02 19:08:20  vasilche
  91. * Fixed variable conflict in generated files on MSVC.
  92. *
  93. * Revision 1.2  2000/02/02 14:57:06  vasilche
  94. * Added missing NCBI_NS_NSBI and NSBI_NS_STD macros to generated code.
  95. *
  96. * Revision 1.1  2000/02/01 21:48:07  vasilche
  97. * Added CGeneratedChoiceTypeInfo for generated choice classes.
  98. * Removed CMemberInfo subclasses.
  99. * Added support for DEFAULT/OPTIONAL members.
  100. * Changed class generation.
  101. * Moved datatool headers to include/internal/serial/tool.
  102. *
  103. * Revision 1.8  2000/01/10 19:46:47  vasilche
  104. * Fixed encoding/decoding of REAL type.
  105. * Fixed encoding/decoding of StringStore.
  106. * Fixed encoding/decoding of NULL type.
  107. * Fixed error reporting.
  108. * Reduced object map (only classes).
  109. *
  110. * Revision 1.7  1999/12/28 18:56:00  vasilche
  111. * Reduced size of compiled object files:
  112. * 1. avoid inline or implicit virtual methods (especially destructors).
  113. * 2. avoid std::string's methods usage in inline methods.
  114. * 3. avoid string literals ("xxx") in inline methods.
  115. *
  116. * Revision 1.6  1999/12/17 19:05:19  vasilche
  117. * Simplified generation of GetTypeInfo methods.
  118. *
  119. * Revision 1.5  1999/12/01 17:36:28  vasilche
  120. * Fixed CHOICE processing.
  121. *
  122. * Revision 1.4  1999/11/18 17:13:07  vasilche
  123. * Fixed generation of ENUMERATED CHOICE and VisibleString.
  124. * Added generation of initializers to zero for primitive types and pointers.
  125. *
  126. * Revision 1.3  1999/11/16 15:41:17  vasilche
  127. * Added plain pointer choice.
  128. * By default we use C pointer instead of auto_ptr.
  129. * Start adding initializers.
  130. *
  131. * Revision 1.2  1999/11/15 19:36:20  vasilche
  132. * Fixed warnings on GCC
  133. *
  134. * ===========================================================================
  135. */
  136. #include <ncbi_pch.hpp>
  137. #include <serial/datatool/exceptions.hpp>
  138. #include <serial/datatool/stlstr.hpp>
  139. #include <serial/datatool/classctx.hpp>
  140. #include <serial/datatool/namespace.hpp>
  141. #include <serial/datatool/srcutil.hpp>
  142. BEGIN_NCBI_SCOPE
  143. CTemplate1TypeStrings::CTemplate1TypeStrings(const string& templateName,
  144.                                              CTypeStrings* arg1Type)
  145.     : m_TemplateName(templateName), m_Arg1Type(arg1Type)
  146. {
  147. }
  148. CTemplate1TypeStrings::CTemplate1TypeStrings(const string& templateName,
  149.                                              AutoPtr<CTypeStrings> arg1Type)
  150.     : m_TemplateName(templateName), m_Arg1Type(arg1Type)
  151. {
  152. }
  153. CTemplate1TypeStrings::~CTemplate1TypeStrings(void)
  154. {
  155. }
  156. CTypeStrings::EKind CTemplate1TypeStrings::GetKind(void) const
  157. {
  158.     return eKindContainer;
  159. }
  160. string CTemplate1TypeStrings::GetCType(const CNamespace& ns) const
  161. {
  162.     return ns.GetNamespaceRef(GetTemplateNamespace())+GetTemplateName()+"< "+GetArg1Type()->GetCType(ns)+" >";
  163. }
  164. string CTemplate1TypeStrings::GetPrefixedCType(const CNamespace& ns,
  165.                                                const string& methodPrefix) const
  166. {
  167.     return ns.GetNamespaceRef(GetTemplateNamespace())+GetTemplateName()+"< "
  168.         + GetArg1Type()->GetPrefixedCType(ns,methodPrefix)+" >";
  169. }
  170. string CTemplate1TypeStrings::GetRef(const CNamespace& ns) const
  171. {
  172.     return "STL_"+GetRefTemplate()+", ("+GetArg1Type()->GetRef(ns)+')';
  173. }
  174. string CTemplate1TypeStrings::GetRefTemplate(void) const
  175. {
  176.     return GetTemplateName();
  177. }
  178. string CTemplate1TypeStrings::GetIsSetCode(const string& var) const
  179. {
  180.     return "!("+var+").empty()";
  181. }
  182. void CTemplate1TypeStrings::AddTemplateInclude(CClassContext::TIncludes& hpp) const
  183. {
  184.     string header = GetTemplateName();
  185.     if ( header == "multiset" )
  186.         header = "<set>";
  187.     else if ( header == "multimap" )
  188.         header = "<map>";
  189.     else if ( header == "AutoPtr" )
  190.         header = "<corelib/ncbiutil.hpp>";
  191.     else
  192.         header = '<'+header+'>';
  193.     hpp.insert(header);
  194. }
  195. const CNamespace& CTemplate1TypeStrings::GetTemplateNamespace(void) const
  196. {
  197.     if ( GetTemplateName() == "AutoPtr" )
  198.         return CNamespace::KNCBINamespace;
  199.     return CNamespace::KSTDNamespace;
  200. }
  201. void CTemplate1TypeStrings::GenerateTypeCode(CClassContext& ctx) const
  202. {
  203.     AddTemplateInclude(ctx.HPPIncludes());
  204.     GetArg1Type()->GenerateTypeCode(ctx);
  205. }
  206. CTemplate2TypeStrings::CTemplate2TypeStrings(const string& templateName,
  207.                                              AutoPtr<CTypeStrings> arg1Type,
  208.                                              AutoPtr<CTypeStrings> arg2Type)
  209.     : CParent(templateName, arg1Type), m_Arg2Type(arg2Type)
  210. {
  211. }
  212. CTemplate2TypeStrings::~CTemplate2TypeStrings(void)
  213. {
  214. }
  215. string CTemplate2TypeStrings::GetCType(const CNamespace& ns) const
  216. {
  217.     return ns.GetNamespaceRef(GetTemplateNamespace())+GetTemplateName()+"< "+GetArg1Type()->GetCType(ns)+", "+GetArg2Type()->GetCType(ns)+" >";
  218. }
  219. string CTemplate2TypeStrings::GetPrefixedCType(const CNamespace& ns,
  220.                                                const string& methodPrefix) const
  221. {
  222.     return ns.GetNamespaceRef(GetTemplateNamespace())+GetTemplateName()+"< "
  223.         + GetArg1Type()->GetPrefixedCType(ns,methodPrefix)+", "
  224.         + GetArg2Type()->GetPrefixedCType(ns,methodPrefix)+" >";
  225. }
  226. string CTemplate2TypeStrings::GetRef(const CNamespace& ns) const
  227. {
  228.     return "STL_"+GetRefTemplate()+", ("+GetArg1Type()->GetRef(ns)+", "+GetArg2Type()->GetRef(ns)+')';
  229. }
  230. void CTemplate2TypeStrings::GenerateTypeCode(CClassContext& ctx) const
  231. {
  232.     CParent::GenerateTypeCode(ctx);
  233.     GetArg2Type()->GenerateTypeCode(ctx);
  234. }
  235. CSetTypeStrings::CSetTypeStrings(const string& templateName,
  236.                                  AutoPtr<CTypeStrings> type)
  237.     : CParent(templateName, type)
  238. {
  239. }
  240. CSetTypeStrings::~CSetTypeStrings(void)
  241. {
  242. }
  243. string CSetTypeStrings::GetDestructionCode(const string& expr) const
  244. {
  245.     string code;
  246.     string iter;
  247.     static int level = 0;
  248.     try {
  249.         level++;
  250.         iter = "setIter"+NStr::IntToString(level);
  251.         code = Tabbed(GetArg1Type()->GetDestructionCode('*'+iter), "        ");
  252.     }
  253.     catch (CDatatoolException& exp) {
  254.         level--;
  255.         NCBI_RETHROW_SAME(exp,"CSetTypeStrings::GetDestructionCode: failed");
  256.     }
  257.     catch (...) {
  258.         level--;
  259.         throw;
  260.     }
  261.     level--;
  262.     if ( code.empty() )
  263.         return string();
  264.     return
  265.         "{n"
  266.         "    for ( "+GetCType(CNamespace::KEmptyNamespace)+"::iterator "+iter+" = ("+expr+").begin(); "+iter+" != ("+expr+").end(); ++"+iter+" ) {n"
  267.         +code+
  268.         "    }n"
  269.         "}n";
  270. }
  271. string CSetTypeStrings::GetResetCode(const string& var) const
  272. {
  273.     return var+".clear();n";
  274. }
  275. CListTypeStrings::CListTypeStrings(const string& templateName,
  276.                                    AutoPtr<CTypeStrings> type,
  277.                                    bool externalSet)
  278.     : CParent(templateName, type), m_ExternalSet(externalSet)
  279. {
  280. }
  281. CListTypeStrings::~CListTypeStrings(void)
  282. {
  283. }
  284. string CListTypeStrings::GetRefTemplate(void) const
  285. {
  286.     string templ = GetTemplateName();
  287.     if ( m_ExternalSet )
  288.         templ += "_set";
  289.     return templ;
  290. }
  291. string CListTypeStrings::GetDestructionCode(const string& expr) const
  292. {
  293.     string code;
  294.     string iter;
  295.     static int level = 0;
  296.     try {
  297.         level++;
  298.         iter = "listIter"+NStr::IntToString(level);
  299.         code = Tabbed(GetArg1Type()->GetDestructionCode('*'+iter), "        ");
  300.     }
  301.     catch (CDatatoolException& exp) {
  302.         level--;
  303.         NCBI_RETHROW_SAME(exp,"CListTypeStrings::GetDestructionCode: failed");
  304.     }
  305.     catch (...) {
  306.         level--;
  307.         throw;
  308.     }
  309.     level--;
  310.     if ( code.empty() )
  311.         return string();
  312.     return
  313.         "{n"
  314.         "    for ( "+GetCType(CNamespace::KEmptyNamespace)+"::iterator "+iter+" = ("+expr+").begin(); "+iter+" != ("+expr+").end(); ++"+iter+" ) {n"
  315.         +code+
  316.         "    }n"
  317.         "}n";
  318. }
  319. string CListTypeStrings::GetResetCode(const string& var) const
  320. {
  321.     return var+".clear();n";
  322. }
  323. CMapTypeStrings::CMapTypeStrings(const string& templateName,
  324.                                  AutoPtr<CTypeStrings> keyType,
  325.                                  AutoPtr<CTypeStrings> valueType)
  326.     : CParent(templateName, keyType, valueType)
  327. {
  328. }
  329. CMapTypeStrings::~CMapTypeStrings(void)
  330. {
  331. }
  332. string CMapTypeStrings::GetDestructionCode(const string& expr) const
  333. {
  334.     string code;
  335.     string iter;
  336.     static int level = 0;
  337.     try {
  338.         level++;
  339.         iter = "mapIter"+NStr::IntToString(level);
  340.         code = Tabbed(GetArg1Type()->GetDestructionCode(iter+"->first")+
  341.                       GetArg2Type()->GetDestructionCode(iter+"->second"),
  342.                       "        ");
  343.     }
  344.     catch (CDatatoolException& exp) {
  345.         level--;
  346.         NCBI_RETHROW_SAME(exp,"CMapTypeStrings::GetDestructionCode: failed");
  347.     }
  348.     catch (...) {
  349.         level--;
  350.         throw;
  351.     }
  352.     level--;
  353.     if ( code.empty() )
  354.         return string();
  355.     return
  356.         "{n"
  357.         "    for ( "+GetCType(CNamespace::KEmptyNamespace)+"::iterator "+iter+" = ("+expr+").begin(); "+iter+" != ("+expr+").end(); ++"+iter+" ) {n"
  358.         +code+
  359.         "    }n"
  360.         "}n";
  361. }
  362. string CMapTypeStrings::GetResetCode(const string& var) const
  363. {
  364.     return var+".clear();n";
  365. }
  366. CVectorTypeStrings::CVectorTypeStrings(const string& charType)
  367.     : m_CharType(charType)
  368. {
  369. }
  370. CVectorTypeStrings::~CVectorTypeStrings(void)
  371. {
  372. }
  373. CTypeStrings::EKind CVectorTypeStrings::GetKind(void) const
  374. {
  375.     return eKindOther;
  376. }
  377. void CVectorTypeStrings::GenerateTypeCode(CClassContext& ctx) const
  378. {
  379.     ctx.HPPIncludes().insert("<vector>");
  380. }
  381. string CVectorTypeStrings::GetCType(const CNamespace& ns) const
  382. {
  383.     return ns.GetNamespaceRef(CNamespace::KSTDNamespace)+"vector< " + m_CharType + " >";
  384. }
  385. string CVectorTypeStrings::GetPrefixedCType(const CNamespace& ns,
  386.                                             const string& /*methodPrefix*/) const
  387. {
  388.     return GetCType(ns);
  389. }
  390. string CVectorTypeStrings::GetRef(const CNamespace& /*ns*/) const
  391. {
  392.     return "STL_CHAR_vector, ("+m_CharType+')';
  393. }
  394. string CVectorTypeStrings::GetResetCode(const string& var) const
  395. {
  396.     return var+".clear();n";
  397. }
  398. END_NCBI_SCOPE