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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: aliasstr.cpp,v $
  4.  * PRODUCTION Revision 1000.4  2004/06/01 19:42:14  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: aliasstr.cpp,v 1000.4 2004/06/01 19:42:14 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: Aleksey Grichenko
  35. *
  36. * File Description:
  37. *   Type info for aliased type generation: includes, used classes, C code etc.
  38. */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbiutil.hpp>
  41. #include <serial/datatool/exceptions.hpp>
  42. #include <serial/datatool/type.hpp>
  43. #include <serial/datatool/aliasstr.hpp>
  44. #include <serial/datatool/code.hpp>
  45. #include <serial/datatool/srcutil.hpp>
  46. #include <serial/datatool/classstr.hpp>
  47. #include <serial/serialdef.hpp>
  48. BEGIN_NCBI_SCOPE
  49. CAliasTypeStrings::CAliasTypeStrings(const string& externalName,
  50.                                      const string& className,
  51.                                      CTypeStrings& ref_type)
  52.     : m_ExternalName(externalName),
  53.       m_ClassName(className),
  54.       m_RefType(&ref_type)
  55. {
  56. }
  57. CAliasTypeStrings::~CAliasTypeStrings(void)
  58. {
  59. }
  60. CAliasTypeStrings::EKind CAliasTypeStrings::GetKind(void) const
  61. {
  62.     return eKindOther;
  63. }
  64. string CAliasTypeStrings::GetClassName(void) const
  65. {
  66.     return m_ClassName;
  67. }
  68. string CAliasTypeStrings::GetExternalName(void) const
  69. {
  70.     return m_ExternalName;
  71. }
  72. string CAliasTypeStrings::GetCType(const CNamespace& /*ns*/) const
  73. {
  74.     return GetClassName();
  75. }
  76. string CAliasTypeStrings::GetPrefixedCType(const CNamespace& ns,
  77.                                            const string& /*methodPrefix*/) const
  78. {
  79.     return GetCType(ns);
  80. }
  81. bool CAliasTypeStrings::HaveSpecialRef(void) const
  82. {
  83.     return m_RefType->HaveSpecialRef();
  84. }
  85. string CAliasTypeStrings::GetRef(const CNamespace& ns) const
  86. {
  87.     return m_RefType->GetRef(ns);
  88. }
  89. bool CAliasTypeStrings::CanBeKey(void) const
  90. {
  91.     return m_RefType->CanBeKey();
  92. }
  93. bool CAliasTypeStrings::CanBeCopied(void) const
  94. {
  95.     return m_RefType->CanBeCopied();
  96. }
  97. string CAliasTypeStrings::NewInstance(const string& init) const
  98. {
  99.     return m_RefType->NewInstance(init);
  100. }
  101. string CAliasTypeStrings::GetInitializer(void) const
  102. {
  103.     return m_RefType->GetInitializer();
  104. }
  105. string CAliasTypeStrings::GetDestructionCode(const string& expr) const
  106. {
  107.     return m_RefType->GetDestructionCode(expr);
  108. }
  109. string CAliasTypeStrings::GetIsSetCode(const string& var) const
  110. {
  111.     return m_RefType->GetIsSetCode(var);
  112. }
  113. string CAliasTypeStrings::GetResetCode(const string& var) const
  114. {
  115.     return m_RefType->GetResetCode(var);
  116. }
  117. void CAliasTypeStrings::GenerateCode(CClassContext& ctx) const
  118. {
  119.     const CNamespace& ns = ctx.GetNamespace();
  120.     string ref_name = m_RefType->GetCType(ns);
  121.     string className = GetClassName() + "_Base";
  122.     CClassCode code(ctx, className);
  123.     string methodPrefix = code.GetMethodPrefix();
  124.     bool is_class = false;
  125.     switch ( m_RefType->GetKind() ) {
  126.     case eKindClass:
  127.     case eKindObject:
  128.         {
  129.             string name(ref_name);
  130.             const CClassRefTypeStrings* cls =
  131.                 dynamic_cast<const CClassRefTypeStrings*>(m_RefType.get());
  132.             if (cls) {
  133.                 name = cls->GetClassName();
  134.             }
  135.             code.SetParentClass(name, m_RefType->GetNamespace());
  136.         }
  137.         is_class = true;
  138.         break;
  139.     case eKindStd:
  140.     case eKindEnum:
  141.         code.SetParentClass("CStdAliasBase< " + ref_name + " >",
  142.             CNamespace::KNCBINamespace);
  143.         break;
  144.     case eKindString:
  145.         code.SetParentClass("CStringAliasBase< " + ref_name + " >",
  146.             CNamespace::KNCBINamespace);
  147.         break;
  148.     case eKindOther: // for vector< char >
  149.         code.SetParentClass("CStringAliasBase< " + ref_name + " >",
  150.             CNamespace::KNCBINamespace);
  151.         break;
  152.     case eKindPointer:
  153.     case eKindRef:
  154.     case eKindContainer:
  155.         NCBI_THROW(CDatatoolException, eNotImplemented,
  156.             "Invalid aliased type: " + ref_name);
  157.     }
  158.     string parentNamespaceRef =
  159.         code.GetNamespace().GetNamespaceRef(code.GetParentClassNamespace());
  160.     // generate type info
  161.     code.ClassPublic() <<
  162.         "    " << className << "(void);n" <<
  163.         "n";
  164.     code.MethodStart(true) <<
  165.         methodPrefix << className << "(void)n" <<
  166.         "{n" <<
  167.         "}n" <<
  168.         "n";
  169.     if ( is_class ) {
  170.         code.ClassPublic() <<
  171.             "    // type infon"
  172.             "    DECLARE_INTERNAL_TYPE_INFO();n"
  173.             "n";
  174.         m_RefType->GenerateTypeCode(ctx);
  175.         code.ClassPublic() <<
  176.             "    // parent type getter/settern" <<
  177.             "    const " << ref_name << "& Get(void) const;n" <<
  178.             "    " << ref_name << "& Set(void);n";
  179.         code.MethodStart(true) <<
  180.             "const " << ref_name << "& " << methodPrefix << "Get(void) constn" <<
  181.             "{n" <<
  182.             "    return *this;n" <<
  183.             "}nn";
  184.         code.MethodStart(true) <<
  185.             ref_name << "& " << methodPrefix << "Set(void)n" <<
  186.             "{n" <<
  187.             "    return *this;n" <<
  188.             "}nn";
  189.     }
  190.     else {
  191.         code.ClassPublic() <<
  192.             "    // type infon"
  193.             "    DECLARE_STD_ALIAS_TYPE_INFO();n"
  194.             "n";
  195.         string constr_decl = className + "(const " + ref_name + "& data)";
  196.         code.ClassPublic() <<
  197.             "    // explicit constructor from the primitive typen" <<
  198.             "    explicit " << constr_decl << ";n";
  199.         code.MethodStart(true) <<
  200.             methodPrefix << constr_decl << "n" <<
  201.             "    : " << parentNamespaceRef << code.GetParentClassName() << "(data)n" <<
  202.             "{n" <<
  203.             "}n" <<
  204.             "n";
  205.     }
  206.     // define typeinfo method
  207.     {
  208.         code.CPPIncludes().insert("serial/aliasinfo");
  209.         CNcbiOstream& methods = code.Methods();
  210.         methods << "BEGIN_ALIAS_INFO(""
  211.             << GetExternalName() << "", "
  212.             << GetClassName() << ", "
  213.             << m_RefType->GetRef(ns) << ")n"
  214.             "{n";
  215.         if ( !GetModuleName().empty() ) {
  216.             methods <<
  217.                 "    SET_ALIAS_MODULE("" << GetModuleName() << "");n";
  218.         }
  219.         methods << "    SET_";
  220.         if ( is_class ) {
  221.             methods << "CLASS";
  222.         }
  223.         else {
  224.             methods << "STD";
  225.         }
  226.         methods <<
  227.             "_ALIAS_DATA_PTR;n"
  228.             "}n"
  229.             "END_ALIAS_INFOn"
  230.             "n";
  231.     }
  232. }
  233. void CAliasTypeStrings::GenerateUserHPPCode(CNcbiOstream& out) const
  234. {
  235.     // m_RefType->GenerateUserHPPCode(out);
  236.     const CNamespace& ns = GetNamespace();
  237.     string ref_name = m_RefType->GetCType(ns);
  238.     string className = GetClassName();
  239.     if (CClassCode::GetDoxygenComments()) {
  240.         out
  241.             << "n"
  242.             << "/** @addtogroup ";
  243.         if (!CClassCode::GetDoxygenGroup().empty()) {
  244.             out << CClassCode::GetDoxygenGroup();
  245.         } else {
  246.             out << "dataspec_" << GetModuleName();
  247.         }
  248.         out
  249.             << "n *n"
  250.             << " * @{n"
  251.             << " */nn";
  252.     }
  253.     out <<
  254.         "/////////////////////////////////////////////////////////////////////////////n";
  255.     if (CClassCode::GetDoxygenComments()) {
  256.         out <<
  257.             "///n"
  258.             "/// " << className << " --n"
  259.             "///nn";
  260.     }
  261.     out << "class ";
  262.     if ( !CClassCode::GetExportSpecifier().empty() )
  263.         out << CClassCode::GetExportSpecifier() << " ";
  264.     out << GetClassName()<<" : public "<<GetClassName()<<"_Basen"
  265.         "{n"
  266.         "    typedef "<<GetClassName()<<"_Base Tparent;n"
  267.         "public:n";
  268.     out <<
  269.         "    " << GetClassName() << "(void) {}n"
  270.         "n";
  271.     bool is_class = false;
  272.     switch ( m_RefType->GetKind() ) {
  273.     case eKindClass:
  274.     case eKindObject:
  275.         is_class = true;
  276.         break;
  277.     }
  278.     if ( !is_class ) {
  279.         // Generate type convertions
  280.         out <<
  281.             "    /// Explicit constructor from the primitive type.n" <<
  282.             "    explicit " << className + "(const " + ref_name + "& data)" << "n"
  283.             "        : Tparent(data) {}nn";
  284.     }
  285.     out << "};n";
  286.     if (CClassCode::GetDoxygenComments()) {
  287.         out << "/* @} */n";
  288.     }
  289.     out << "n";
  290. }
  291. void CAliasTypeStrings::GenerateUserCPPCode(CNcbiOstream& out) const
  292. {
  293.     //m_RefType->GenerateUserCPPCode(out);
  294. }
  295. void CAliasTypeStrings::GenerateTypeCode(CClassContext& ctx) const
  296. {
  297.     m_RefType->GenerateTypeCode(ctx);
  298. }
  299. void CAliasTypeStrings::GeneratePointerTypeCode(CClassContext& ctx) const
  300. {
  301.     m_RefType->GeneratePointerTypeCode(ctx);
  302. }
  303. CAliasRefTypeStrings::CAliasRefTypeStrings(const string& className,
  304.                                            const CNamespace& ns,
  305.                                            const string& fileName,
  306.                                            CTypeStrings& ref_type)
  307.     : m_ClassName(className),
  308.       m_Namespace(ns),
  309.       m_FileName(fileName),
  310.       m_RefType(&ref_type),
  311.       m_IsObject(m_RefType->GetKind() == eKindObject)
  312. {
  313. }
  314. CTypeStrings::EKind CAliasRefTypeStrings::GetKind(void) const
  315. {
  316.     return m_IsObject ? eKindObject : eKindClass;
  317. }
  318. const CNamespace& CAliasRefTypeStrings::GetNamespace(void) const
  319. {
  320.     return m_Namespace;
  321. }
  322. void CAliasRefTypeStrings::GenerateTypeCode(CClassContext& ctx) const
  323. {
  324.     ctx.HPPIncludes().insert(m_FileName);
  325. }
  326. void CAliasRefTypeStrings::GeneratePointerTypeCode(CClassContext& ctx) const
  327. {
  328.     ctx.AddForwardDeclaration(m_ClassName, m_Namespace);
  329.     ctx.CPPIncludes().insert(m_FileName);
  330. }
  331. string CAliasRefTypeStrings::GetCType(const CNamespace& ns) const
  332. {
  333.     return ns.GetNamespaceRef(m_Namespace) + m_ClassName;
  334. }
  335. string CAliasRefTypeStrings::GetPrefixedCType(const CNamespace& ns,
  336.                                               const string& /*methodPrefix*/) const
  337. {
  338.     return GetCType(ns);
  339. }
  340. bool CAliasRefTypeStrings::HaveSpecialRef(void) const
  341. {
  342.     return m_RefType->HaveSpecialRef();
  343. }
  344. string CAliasRefTypeStrings::GetRef(const CNamespace& ns) const
  345. {
  346.     return "CLASS, ("+GetCType(ns)+')';
  347. }
  348. bool CAliasRefTypeStrings::CanBeKey(void) const
  349. {
  350.     return m_RefType->CanBeKey();
  351. }
  352. bool CAliasRefTypeStrings::CanBeCopied(void) const
  353. {
  354.     return m_RefType->CanBeCopied();
  355. }
  356. string CAliasRefTypeStrings::NewInstance(const string& init) const
  357. {
  358.     return "new "+GetCType(CNamespace::KEmptyNamespace)+"("+init+')';
  359. }
  360. string CAliasRefTypeStrings::GetInitializer(void) const
  361. {
  362.     return m_IsObject ?
  363.         NcbiEmptyString :
  364.         GetCType(GetNamespace()) + "(" + m_RefType->GetInitializer() + ")";
  365. }
  366. string CAliasRefTypeStrings::GetDestructionCode(const string& expr) const
  367. {
  368.     return m_IsObject ?
  369.         NcbiEmptyString :
  370.         m_RefType->GetDestructionCode(expr);
  371. }
  372. string CAliasRefTypeStrings::GetIsSetCode(const string& var) const
  373. {
  374.     return m_RefType->GetIsSetCode(var);
  375. }
  376. string CAliasRefTypeStrings::GetResetCode(const string& var) const
  377. {
  378.     return m_IsObject ?
  379.         var + ".Reset();n" :
  380.         m_RefType->GetResetCode(var + ".Set()");
  381. }
  382. void CAliasRefTypeStrings::GenerateCode(CClassContext& ctx) const
  383. {
  384.     m_RefType->GenerateCode(ctx);
  385. }
  386. void CAliasRefTypeStrings::GenerateUserHPPCode(CNcbiOstream& out) const
  387. {
  388.     m_RefType->GenerateUserHPPCode(out);
  389. }
  390. void CAliasRefTypeStrings::GenerateUserCPPCode(CNcbiOstream& out) const
  391. {
  392.     m_RefType->GenerateUserCPPCode(out);
  393. }
  394. END_NCBI_SCOPE
  395. /*
  396. * ===========================================================================
  397. *
  398. * $Log: aliasstr.cpp,v $
  399. * Revision 1000.4  2004/06/01 19:42:14  gouriano
  400. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  401. *
  402. * Revision 1.7  2004/05/17 21:03:13  gorelenk
  403. * Added include of PCH ncbi_pch.hpp
  404. *
  405. * Revision 1.6  2004/05/03 19:31:03  gouriano
  406. * Made generation of DOXYGEN-style comments optional
  407. *
  408. * Revision 1.5  2004/04/29 20:11:40  gouriano
  409. * Generate DOXYGEN-style comments in C++ headers
  410. *
  411. * Revision 1.4  2004/03/08 20:08:53  gouriano
  412. * Correct namespaces of generated classes
  413. *
  414. * Revision 1.3  2003/11/13 20:52:04  grichenk
  415. * Fixed namespaces in generated files.
  416. *
  417. * Revision 1.2  2003/10/31 21:33:05  ucko
  418. * GetResetCode: tweak generated code so that it doesn't simply end up
  419. * resetting a temporary copy of the data.
  420. * Change log moved to end per current practice.
  421. *
  422. * Revision 1.1  2003/10/21 13:45:23  grichenk
  423. * Initial revision
  424. *
  425. * ===========================================================================
  426. */