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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: enumstr.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:42:55  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.20
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: enumstr.cpp,v 1000.1 2004/06/01 19:42:55 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. #include <ncbi_pch.hpp>
  40. #include <serial/datatool/enumstr.hpp>
  41. #include <serial/datatool/classctx.hpp>
  42. #include <serial/datatool/srcutil.hpp>
  43. #include <serial/datatool/enumtype.hpp>
  44. #include <serial/datatool/code.hpp>
  45. #include <corelib/ncbiutil.hpp>
  46. BEGIN_NCBI_SCOPE
  47. CEnumTypeStrings::CEnumTypeStrings(const string& externalName,
  48.                                    const string& enumName,
  49.                                    const string& cType, bool isInteger,
  50.                                    const TValues& values,
  51.                                    const string& valuePrefix)
  52.     : m_ExternalName(externalName), m_EnumName(enumName),
  53.       m_CType(cType), m_IsInteger(isInteger),
  54.       m_Values(values), m_ValuesPrefix(valuePrefix)
  55. {
  56. }
  57. CTypeStrings::EKind CEnumTypeStrings::GetKind(void) const
  58. {
  59.     return eKindEnum;
  60. }
  61. const string& CEnumTypeStrings::GetEnumName(void) const
  62. {
  63.     return m_EnumName;
  64. }
  65. string CEnumTypeStrings::GetCType(const CNamespace& /*ns*/) const
  66. {
  67.     return m_CType;
  68. }
  69. string CEnumTypeStrings::GetPrefixedCType(const CNamespace& ns,
  70.                                           const string& methodPrefix) const
  71. {
  72.     string s;
  73.     if (!m_IsInteger) {
  74.         s += methodPrefix;
  75.     }
  76.     return  s + GetCType(ns);
  77. }
  78. string CEnumTypeStrings::GetRef(const CNamespace& /*ns*/) const
  79. {
  80.     return "ENUM, ("+m_CType+", "+m_EnumName+')';
  81. }
  82. string CEnumTypeStrings::GetInitializer(void) const
  83. {
  84.     return m_EnumName+"(0)";
  85. }
  86. void CEnumTypeStrings::GenerateTypeCode(CClassContext& ctx) const
  87. {
  88.     string methodPrefix = ctx.GetMethodPrefix();
  89.     bool inClass = !methodPrefix.empty();
  90.     {
  91.         // generated enum
  92.         CNcbiOstrstream hpp;
  93.         hpp <<
  94.             "enum "<<m_EnumName<<" {";
  95.         ITERATE ( TValues, i, m_Values ) {
  96.             if ( i != m_Values.begin() )
  97.                 hpp << ',';
  98.             string id = Identifier(i->GetName(), false);
  99.             hpp << "n"
  100.                 "    "<<m_ValuesPrefix<<id<<" = "<<i->GetValue();
  101.         }
  102.         hpp << "n"
  103.             "};n"
  104.             "n";
  105.         // prototype of GetTypeInfo_enum_* function
  106. #if 0
  107.         if ( inClass )
  108.             hpp << "DECLARE_INTERNAL_ENUM_INFO";
  109.         else
  110.             hpp << CClassCode::GetExportSpecifier() << " DECLARE_ENUM_INFO";
  111.         hpp << '('<<m_EnumName<<");nn";
  112. #else
  113.         hpp << "/// Access to " << m_EnumName
  114.             << "'s attributes (values, names) as defined in specn";
  115.         if ( inClass ) {
  116.             hpp << "static";
  117.         } else {
  118.             hpp << CClassCode::GetExportSpecifier();
  119.         }
  120.         hpp << " const NCBI_NS_NCBI::CEnumeratedTypeValues* ENUM_METHOD_NAME";
  121.         hpp << '('<<m_EnumName<<")(void);nn";
  122. #endif
  123.         ctx.AddHPPCode(hpp);
  124.     }
  125.     {
  126.         // definition of GetTypeInfo_enum_ function
  127.         CNcbiOstrstream cpp;
  128.         if ( methodPrefix.empty() ) {
  129.             cpp <<
  130.                 "BEGIN_NAMED_ENUM_INFO(""<<GetExternalName()<<'"';
  131.         }
  132.         else {
  133.             cpp <<
  134.                 "BEGIN_NAMED_ENUM_IN_INFO(""<<GetExternalName()<<"", "<<
  135.                 methodPrefix;
  136.         }
  137.         cpp <<", "<<m_EnumName<<", "<<(m_IsInteger?"true":"false")<<")n"
  138.             "{n";
  139.         if ( !GetModuleName().empty() ) {
  140.             cpp <<
  141.                 "    SET_ENUM_MODULE(""<<GetModuleName()<<"");n";
  142.         }
  143.         ITERATE ( TValues, i, m_Values ) {
  144.             string id = Identifier(i->GetName(), false);
  145.             cpp <<
  146.                 "    ADD_ENUM_VALUE(""<<i->GetName()<<"", "<<m_ValuesPrefix<<id<<");n";
  147.         }
  148.         cpp <<
  149.             "}n"
  150.             "END_ENUM_INFOn"
  151.             "n";
  152.         ctx.AddCPPCode(cpp);
  153.     }
  154. }
  155. CEnumRefTypeStrings::CEnumRefTypeStrings(const string& enumName,
  156.                                          const string& cType,
  157.                                          const CNamespace& ns,
  158.                                          const string& fileName)
  159.     : m_EnumName(enumName),
  160.       m_CType(cType), m_Namespace(ns),
  161.       m_FileName(fileName)
  162. {
  163. }
  164. CTypeStrings::EKind CEnumRefTypeStrings::GetKind(void) const
  165. {
  166.     return eKindEnum;
  167. }
  168. const CNamespace& CEnumRefTypeStrings::GetNamespace(void) const
  169. {
  170.     return m_Namespace;
  171. }
  172. const string& CEnumRefTypeStrings::GetEnumName(void) const
  173. {
  174.     return m_EnumName;
  175. }
  176. string CEnumRefTypeStrings::GetCType(const CNamespace& ns) const
  177. {
  178.     if ( !m_CType.empty() && m_CType != m_EnumName )
  179.         return m_CType;
  180.     return ns.GetNamespaceRef(m_Namespace)+m_EnumName;
  181. }
  182. string CEnumRefTypeStrings::GetPrefixedCType(const CNamespace& ns,
  183.                                              const string& /*methodPrefix*/) const
  184. {
  185.     return GetCType(ns);
  186. }
  187. string CEnumRefTypeStrings::GetRef(const CNamespace& ns) const
  188. {
  189.     string ref = "ENUM";
  190.     bool haveNamespace = !m_Namespace.IsEmpty() && m_Namespace != ns;
  191.     if ( haveNamespace )
  192.         ref += "_IN";
  193.     ref += ", (";
  194.     if ( m_CType.empty() )
  195.         ref += m_EnumName;
  196.     else
  197.         ref += m_CType;
  198.     if ( haveNamespace ) {
  199.         ref += ", ";
  200.         ref += m_Namespace.ToString();
  201.     }
  202.     return ref+", "+m_EnumName+')';
  203. }
  204. string CEnumRefTypeStrings::GetInitializer(void) const
  205. {
  206.     return GetCType(CNamespace::KEmptyNamespace) + "(0)";
  207. }
  208. void CEnumRefTypeStrings::GenerateTypeCode(CClassContext& ctx) const
  209. {
  210.     ctx.HPPIncludes().insert(m_FileName);
  211. }
  212. END_NCBI_SCOPE
  213. /*
  214. *
  215. * ---------------------------------------------------------------------------
  216. * $Log: enumstr.cpp,v $
  217. * Revision 1000.1  2004/06/01 19:42:55  gouriano
  218. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.20
  219. *
  220. * Revision 1.20  2004/05/24 15:10:33  gouriano
  221. * Expose method to access named integers (or enums) in generated classes
  222. *
  223. * Revision 1.19  2004/05/17 21:03:14  gorelenk
  224. * Added include of PCH ncbi_pch.hpp
  225. *
  226. * Revision 1.18  2003/04/29 18:31:09  gouriano
  227. * object data member initialization verification
  228. *
  229. * Revision 1.17  2003/04/10 18:13:29  ucko
  230. * Add export specifiers to (external) DECLARE_ENUM_INFO calls.
  231. * Move CVS log to end.
  232. *
  233. * Revision 1.16  2003/03/11 20:06:47  kuznets
  234. * iterate -> ITERATE
  235. *
  236. * Revision 1.15  2001/05/17 15:07:11  lavr
  237. * Typos corrected
  238. *
  239. * Revision 1.14  2000/11/29 17:42:44  vasilche
  240. * Added CComment class for storing/printing ASN.1/XML module comments.
  241. * Added srcutil.hpp file to reduce file dependency.
  242. *
  243. * Revision 1.13  2000/11/15 20:34:54  vasilche
  244. * Added user comments to ENUMERATED types.
  245. * Added storing of user comments to ASN.1 module definition.
  246. *
  247. * Revision 1.12  2000/11/07 17:26:25  vasilche
  248. * Added module names to CTypeInfo and CEnumeratedTypeValues
  249. * Added possibility to set include directory for whole module
  250. *
  251. * Revision 1.11  2000/08/25 15:59:21  vasilche
  252. * Renamed directory tool -> datatool.
  253. *
  254. * Revision 1.10  2000/07/11 20:36:29  vasilche
  255. * Removed unnecessary generation of namespace references for enum members.
  256. * Removed obsolete methods.
  257. *
  258. * Revision 1.9  2000/07/10 17:59:34  vasilche
  259. * Moved macros needed in headers to serialbase.hpp.
  260. * Use DECLARE_ENUM_INFO in generated code.
  261. *
  262. * Revision 1.8  2000/07/10 17:31:59  vasilche
  263. * Macro arguments made more clear.
  264. * All old ASN stuff moved to serialasn.hpp.
  265. * Changed prefix of enum info functions to GetTypeInfo_enum_.
  266. *
  267. * Revision 1.7  2000/06/16 16:31:38  vasilche
  268. * Changed implementation of choices and classes info to allow use of the same classes in generated and user written classes.
  269. *
  270. * Revision 1.6  2000/05/24 20:09:28  vasilche
  271. * Implemented DTD generation.
  272. *
  273. * Revision 1.5  2000/04/17 19:11:08  vasilche
  274. * Fixed failed assertion.
  275. * Removed redundant namespace specifications.
  276. *
  277. * Revision 1.4  2000/04/12 15:36:51  vasilche
  278. * Added -on <namespace> argument to datatool.
  279. * Removed unnecessary namespace specifications in generated files.
  280. *
  281. * Revision 1.3  2000/04/07 19:26:25  vasilche
  282. * Added namespace support to datatool.
  283. * By default with argument -oR datatool will generate objects in namespace
  284. * NCBI_NS_NCBI::objects (aka ncbi::objects).
  285. * Datatool's classes also moved to NCBI namespace.
  286. *
  287. * Revision 1.2  2000/02/17 20:05:07  vasilche
  288. * Inline methods now will be generated in *_Base.inl files.
  289. * Fixed processing of StringStore.
  290. * Renamed in choices: Selected() -> Which(), E_choice -> E_Choice.
  291. * Enumerated values now will preserve case as in ASN.1 definition.
  292. *
  293. * Revision 1.1  2000/02/01 21:47:57  vasilche
  294. * Added CGeneratedChoiceTypeInfo for generated choice classes.
  295. * Removed CMemberInfo subclasses.
  296. * Added support for DEFAULT/OPTIONAL members.
  297. * Changed class generation.
  298. * Moved datatool headers to include/internal/serial/tool.
  299. *
  300. * Revision 1.8  2000/01/10 19:46:47  vasilche
  301. * Fixed encoding/decoding of REAL type.
  302. * Fixed encoding/decoding of StringStore.
  303. * Fixed encoding/decoding of NULL type.
  304. * Fixed error reporting.
  305. * Reduced object map (only classes).
  306. *
  307. * Revision 1.7  1999/12/28 18:56:00  vasilche
  308. * Reduced size of compiled object files:
  309. * 1. avoid inline or implicit virtual methods (especially destructors).
  310. * 2. avoid std::string's methods usage in inline methods.
  311. * 3. avoid string literals ("xxx") in inline methods.
  312. *
  313. * Revision 1.6  1999/12/17 19:05:19  vasilche
  314. * Simplified generation of GetTypeInfo methods.
  315. *
  316. * Revision 1.5  1999/12/01 17:36:28  vasilche
  317. * Fixed CHOICE processing.
  318. *
  319. * Revision 1.4  1999/11/18 17:13:07  vasilche
  320. * Fixed generation of ENUMERATED CHOICE and VisibleString.
  321. * Added generation of initializers to zero for primitive types and pointers.
  322. *
  323. * Revision 1.3  1999/11/16 15:41:17  vasilche
  324. * Added plain pointer choice.
  325. * By default we use C pointer instead of auto_ptr.
  326. * Start adding initializers.
  327. *
  328. * Revision 1.2  1999/11/15 19:36:20  vasilche
  329. * Fixed warnings on GCC
  330. *
  331. * ===========================================================================
  332. */