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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: choiceptrstr.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:42:24  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: choiceptrstr.cpp,v 1000.1 2004/06/01 19:42:24 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. *   !!! PUT YOUR DESCRIPTION HERE !!!
  38. *
  39. * ---------------------------------------------------------------------------
  40. * $Log: choiceptrstr.cpp,v $
  41. * Revision 1000.1  2004/06/01 19:42:24  gouriano
  42. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  43. *
  44. * Revision 1.7  2004/05/17 21:03:13  gorelenk
  45. * Added include of PCH ncbi_pch.hpp
  46. *
  47. * Revision 1.6  2003/03/11 20:06:47  kuznets
  48. * iterate -> ITERATE
  49. *
  50. * Revision 1.5  2002/08/14 17:14:25  grichenk
  51. * Fixed function name conflict on Win32: renamed
  52. * GetClassName() -> GetClassNameDT()
  53. *
  54. * Revision 1.4  2002/07/01 15:42:08  grichenk
  55. * Fixed 'unused variable' warnings, removed commented code.
  56. *
  57. * Revision 1.3  2001/05/17 15:07:11  lavr
  58. * Typos corrected
  59. *
  60. * Revision 1.2  2000/11/29 17:42:42  vasilche
  61. * Added CComment class for storing/printing ASN.1/XML module comments.
  62. * Added srcutil.hpp file to reduce file dependency.
  63. *
  64. * Revision 1.1  2000/09/26 17:38:25  vasilche
  65. * Fixed incomplete choiceptr implementation.
  66. * Removed temporary comments.
  67. *
  68. * ===========================================================================
  69. */
  70. #include <ncbi_pch.hpp>
  71. #include <corelib/ncbistd.hpp>
  72. #include <serial/serialdef.hpp>
  73. #include <serial/datatool/choiceptrstr.hpp>
  74. #include <serial/datatool/code.hpp>
  75. #include <serial/datatool/namespace.hpp>
  76. #include <serial/datatool/srcutil.hpp>
  77. BEGIN_NCBI_SCOPE
  78. #define STATE_ENUM "E_Choice"
  79. #define STATE_PREFIX "e_"
  80. #define STATE_NOT_SET "e_not_set"
  81. #define REFCHOICE_TYPE_METHOD "GetRefChoiceTypeInfo"
  82. CChoicePtrTypeStrings::CChoicePtrTypeStrings(const string& externalName,
  83.                                              const string& className)
  84.     : CParent(externalName, className)
  85. {
  86. }
  87. void CChoicePtrTypeStrings::AddVariant(const string& name,
  88.                                        AutoPtr<CTypeStrings> type)
  89. {
  90.     m_Variants.push_back(SVariantInfo(name, type));
  91. }
  92. CChoicePtrTypeStrings::SVariantInfo::SVariantInfo(const string& n,
  93.                                                   AutoPtr<CTypeStrings> t)
  94.     : externalName(n), cName(Identifier(n)), type(t)
  95. {
  96. }
  97. void CChoicePtrTypeStrings::GenerateClassCode(CClassCode& code,
  98.                                               CNcbiOstream& /*setters*/,
  99.                                               const string& methodPrefix,
  100.                                               bool haveUserClass,
  101.                                               const string& classPrefix) const
  102. {
  103.     string codeClassName = GetClassNameDT();
  104.     if ( haveUserClass )
  105.         codeClassName += "_Base";
  106.     // generate variants code
  107.     {
  108.         ITERATE ( TVariants, i, m_Variants ) {
  109.             i->type->GeneratePointerTypeCode(code);
  110.         }
  111.     }
  112.     string stdNamespace = 
  113.         code.GetNamespace().GetNamespaceRef(CNamespace::KSTDNamespace);
  114.     string ncbiNamespace =
  115.         code.GetNamespace().GetNamespaceRef(CNamespace::KNCBINamespace);
  116.     code.ClassPublic() <<
  117.         "    static const "<<ncbiNamespace<<"CTypeInfo* "REFCHOICE_TYPE_METHOD"(void);n"
  118.         "n";
  119.     // generated choice enum
  120.     {
  121.         code.ClassPublic() <<
  122.             "    // choice state enumn"
  123.             "    enum "STATE_ENUM" {n"
  124.             "        "STATE_NOT_SET" = "<<kEmptyChoice;
  125.         ITERATE ( TVariants, i, m_Variants ) {
  126.             code.ClassPublic() << ",n"
  127.                 "        "STATE_PREFIX<<i->cName;
  128.         }
  129.         code.ClassPublic() << "n"
  130.             "    };n"
  131.             "n";
  132.     }
  133.     // generate choice methods
  134.     code.ClassPublic() <<
  135.         "    // return selection name (for diagnostic purposes)n"
  136.         "    static "<<stdNamespace<<"string SelectionName("STATE_ENUM" index);n"
  137.         "n";
  138.     // generate choice variants names
  139.     code.ClassPrivate() <<
  140.         "    static const char* const sm_SelectionNames[];n";
  141.     {
  142.         code.Methods() <<
  143.             "const char* const "<<methodPrefix<<"sm_SelectionNames[] = {n"
  144.             "    "not set"";
  145.         ITERATE ( TVariants, i, m_Variants ) {
  146.             code.Methods() << ",n"
  147.                 "    ""<<i->externalName<<""";
  148.         }
  149.         code.Methods() << "n"
  150.             "};n"
  151.             "n"
  152.             "NCBI_NS_STD::string "<<methodPrefix<<"SelectionName("STATE_ENUM" index)n"
  153.             "{n"
  154.             "    return NCBI_NS_NCBI::CInvalidChoiceSelection::GetName(index, sm_SelectionNames, sizeof(sm_SelectionNames)/sizeof(sm_SelectionNames[0]));n"
  155.             "}n"
  156.             "n";
  157.     }
  158.     // generate variant types
  159.     {
  160.         code.ClassPublic() <<
  161.             "    // variants' typesn";
  162.         ITERATE ( TVariants, i, m_Variants ) {
  163.             code.ClassPublic() <<
  164.                 "    typedef "<<i->type->GetCType(code.GetNamespace())<<" T"<<i->cName<<";n";
  165.         }
  166.         code.ClassPublic() << 
  167.             "n";
  168.     }
  169.     // generate type info
  170.     code.Methods() <<
  171.         "// type infon";
  172.     if ( haveUserClass )
  173.         code.Methods() << "BEGIN_NAMED_ABSTRACT_BASE_CLASS_INFO";
  174.     else
  175.         code.Methods() << "BEGIN_NAMED_ABSTRACT_CLASS_INFO";
  176.     code.Methods() <<
  177.         "(""<<GetExternalName()<<"", "<<classPrefix<<GetClassNameDT()<<")n"
  178.         "{n";
  179.     {
  180.         ITERATE ( TVariants, i, m_Variants ) {
  181.             code.Methods() <<
  182.                 "    ADD_NAMED_SUB_CLASS(""<<i->externalName<<"", "<<i->type->GetCType(code.GetNamespace())<<");n";
  183.         }
  184.     }
  185.     code.Methods() <<
  186.         "}n"
  187.         "END_CLASS_INFOn"
  188.         "n";
  189.     // generate ref type info
  190.     code.Methods() <<
  191.         "const NCBI_NS_NCBI::CTypeInfo* "<<methodPrefix<<REFCHOICE_TYPE_METHOD"(void)n"
  192.         "{n"
  193.         "    return NCBI_NS_NCBI::CChoicePointerTypeInfo::GetTypeInfo(NCBI_NS_NCBI::CRefTypeInfo<"<<
  194.         classPrefix<<GetClassNameDT()<<">::GetTypeInfo("<<classPrefix<<GetClassNameDT()<<
  195.         "::GetTypeInfo()));n"
  196.         "}n"
  197.         "n";
  198. }
  199. CChoicePtrRefTypeStrings::CChoicePtrRefTypeStrings(CTypeStrings* type)
  200.     : CParent(type)
  201. {
  202. }
  203. CChoicePtrRefTypeStrings::CChoicePtrRefTypeStrings(AutoPtr<CTypeStrings> type)
  204.     : CParent(type)
  205. {
  206. }
  207. string CChoicePtrRefTypeStrings::GetRef(const CNamespace& ns) const
  208. {
  209.     return "CHOICE, ("+CParent::GetRef(ns)+')';
  210. }
  211. END_NCBI_SCOPE