⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aliasstr.cpp

📁 ncbi源码
💻 CPP
字号:
/* * =========================================================================== * PRODUCTION $Log: aliasstr.cpp,v $ * PRODUCTION Revision 1000.4  2004/06/01 19:42:14  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7 * PRODUCTION * =========================================================================== *//*  $Id: aliasstr.cpp,v 1000.4 2004/06/01 19:42:14 gouriano Exp $* ===========================================================================**                            PUBLIC DOMAIN NOTICE*               National Center for Biotechnology Information**  This software/database is a "United States Government Work" under the*  terms of the United States Copyright Act.  It was written as part of*  the author's official duties as a United States Government employee and*  thus cannot be copyrighted.  This software/database is freely available*  to the public for use. The National Library of Medicine and the U.S.*  Government have not placed any restriction on its use or reproduction.**  Although all reasonable efforts have been taken to ensure the accuracy*  and reliability of the software and data, the NLM and the U.S.*  Government do not and cannot warrant the performance or results that*  may be obtained by using this software or data. The NLM and the U.S.*  Government disclaim all warranties, express or implied, including*  warranties of performance, merchantability or fitness for any particular*  purpose.**  Please cite the author in any work or product based on this material.** ===========================================================================** Author: Aleksey Grichenko** File Description:*   Type info for aliased type generation: includes, used classes, C code etc.*/#include <ncbi_pch.hpp>#include <corelib/ncbiutil.hpp>#include <serial/datatool/exceptions.hpp>#include <serial/datatool/type.hpp>#include <serial/datatool/aliasstr.hpp>#include <serial/datatool/code.hpp>#include <serial/datatool/srcutil.hpp>#include <serial/datatool/classstr.hpp>#include <serial/serialdef.hpp>BEGIN_NCBI_SCOPECAliasTypeStrings::CAliasTypeStrings(const string& externalName,                                     const string& className,                                     CTypeStrings& ref_type)    : m_ExternalName(externalName),      m_ClassName(className),      m_RefType(&ref_type){}CAliasTypeStrings::~CAliasTypeStrings(void){}CAliasTypeStrings::EKind CAliasTypeStrings::GetKind(void) const{    return eKindOther;}string CAliasTypeStrings::GetClassName(void) const{    return m_ClassName;}string CAliasTypeStrings::GetExternalName(void) const{    return m_ExternalName;}string CAliasTypeStrings::GetCType(const CNamespace& /*ns*/) const{    return GetClassName();}string CAliasTypeStrings::GetPrefixedCType(const CNamespace& ns,                                           const string& /*methodPrefix*/) const{    return GetCType(ns);}bool CAliasTypeStrings::HaveSpecialRef(void) const{    return m_RefType->HaveSpecialRef();}string CAliasTypeStrings::GetRef(const CNamespace& ns) const{    return m_RefType->GetRef(ns);}bool CAliasTypeStrings::CanBeKey(void) const{    return m_RefType->CanBeKey();}bool CAliasTypeStrings::CanBeCopied(void) const{    return m_RefType->CanBeCopied();}string CAliasTypeStrings::NewInstance(const string& init) const{    return m_RefType->NewInstance(init);}string CAliasTypeStrings::GetInitializer(void) const{    return m_RefType->GetInitializer();}string CAliasTypeStrings::GetDestructionCode(const string& expr) const{    return m_RefType->GetDestructionCode(expr);}string CAliasTypeStrings::GetIsSetCode(const string& var) const{    return m_RefType->GetIsSetCode(var);}string CAliasTypeStrings::GetResetCode(const string& var) const{    return m_RefType->GetResetCode(var);}void CAliasTypeStrings::GenerateCode(CClassContext& ctx) const{    const CNamespace& ns = ctx.GetNamespace();    string ref_name = m_RefType->GetCType(ns);    string className = GetClassName() + "_Base";    CClassCode code(ctx, className);    string methodPrefix = code.GetMethodPrefix();    bool is_class = false;    switch ( m_RefType->GetKind() ) {    case eKindClass:    case eKindObject:        {            string name(ref_name);            const CClassRefTypeStrings* cls =                dynamic_cast<const CClassRefTypeStrings*>(m_RefType.get());            if (cls) {                name = cls->GetClassName();            }            code.SetParentClass(name, m_RefType->GetNamespace());        }        is_class = true;        break;    case eKindStd:    case eKindEnum:        code.SetParentClass("CStdAliasBase< " + ref_name + " >",            CNamespace::KNCBINamespace);        break;    case eKindString:        code.SetParentClass("CStringAliasBase< " + ref_name + " >",            CNamespace::KNCBINamespace);        break;    case eKindOther: // for vector< char >        code.SetParentClass("CStringAliasBase< " + ref_name + " >",            CNamespace::KNCBINamespace);        break;    case eKindPointer:    case eKindRef:    case eKindContainer:        NCBI_THROW(CDatatoolException, eNotImplemented,            "Invalid aliased type: " + ref_name);    }    string parentNamespaceRef =        code.GetNamespace().GetNamespaceRef(code.GetParentClassNamespace());    // generate type info    code.ClassPublic() <<        "    " << className << "(void);\n" <<        "\n";    code.MethodStart(true) <<        methodPrefix << className << "(void)\n" <<        "{\n" <<        "}\n" <<        "\n";    if ( is_class ) {        code.ClassPublic() <<            "    // type info\n"            "    DECLARE_INTERNAL_TYPE_INFO();\n"            "\n";        m_RefType->GenerateTypeCode(ctx);        code.ClassPublic() <<            "    // parent type getter/setter\n" <<            "    const " << ref_name << "& Get(void) const;\n" <<            "    " << ref_name << "& Set(void);\n";        code.MethodStart(true) <<            "const " << ref_name << "& " << methodPrefix << "Get(void) const\n" <<            "{\n" <<            "    return *this;\n" <<            "}\n\n";        code.MethodStart(true) <<            ref_name << "& " << methodPrefix << "Set(void)\n" <<            "{\n" <<            "    return *this;\n" <<            "}\n\n";    }    else {        code.ClassPublic() <<            "    // type info\n"            "    DECLARE_STD_ALIAS_TYPE_INFO();\n"            "\n";        string constr_decl = className + "(const " + ref_name + "& data)";        code.ClassPublic() <<            "    // explicit constructor from the primitive type\n" <<            "    explicit " << constr_decl << ";\n";        code.MethodStart(true) <<            methodPrefix << constr_decl << "\n" <<            "    : " << parentNamespaceRef << code.GetParentClassName() << "(data)\n" <<            "{\n" <<            "}\n" <<            "\n";    }    // define typeinfo method    {        code.CPPIncludes().insert("serial/aliasinfo");        CNcbiOstream& methods = code.Methods();        methods << "BEGIN_ALIAS_INFO(\""            << GetExternalName() << "\", "            << GetClassName() << ", "            << m_RefType->GetRef(ns) << ")\n"            "{\n";        if ( !GetModuleName().empty() ) {            methods <<                "    SET_ALIAS_MODULE(\"" << GetModuleName() << "\");\n";        }        methods << "    SET_";        if ( is_class ) {            methods << "CLASS";        }        else {            methods << "STD";        }        methods <<            "_ALIAS_DATA_PTR;\n"            "}\n"            "END_ALIAS_INFO\n"            "\n";    }}void CAliasTypeStrings::GenerateUserHPPCode(CNcbiOstream& out) const{    // m_RefType->GenerateUserHPPCode(out);    const CNamespace& ns = GetNamespace();    string ref_name = m_RefType->GetCType(ns);    string className = GetClassName();    if (CClassCode::GetDoxygenComments()) {        out            << "\n"            << "/** @addtogroup ";        if (!CClassCode::GetDoxygenGroup().empty()) {            out << CClassCode::GetDoxygenGroup();        } else {            out << "dataspec_" << GetModuleName();        }        out            << "\n *\n"            << " * @{\n"            << " */\n\n";    }    out <<        "/////////////////////////////////////////////////////////////////////////////\n";    if (CClassCode::GetDoxygenComments()) {        out <<            "///\n"            "/// " << className << " --\n"            "///\n\n";    }    out << "class ";    if ( !CClassCode::GetExportSpecifier().empty() )        out << CClassCode::GetExportSpecifier() << " ";    out << GetClassName()<<" : public "<<GetClassName()<<"_Base\n"        "{\n"        "    typedef "<<GetClassName()<<"_Base Tparent;\n"        "public:\n";    out <<        "    " << GetClassName() << "(void) {}\n"        "\n";    bool is_class = false;    switch ( m_RefType->GetKind() ) {    case eKindClass:    case eKindObject:        is_class = true;        break;    }    if ( !is_class ) {        // Generate type convertions        out <<            "    /// Explicit constructor from the primitive type.\n" <<            "    explicit " << className + "(const " + ref_name + "& data)" << "\n"            "        : Tparent(data) {}\n\n";    }    out << "};\n";    if (CClassCode::GetDoxygenComments()) {        out << "/* @} */\n";    }    out << "\n";}void CAliasTypeStrings::GenerateUserCPPCode(CNcbiOstream& out) const{    //m_RefType->GenerateUserCPPCode(out);}void CAliasTypeStrings::GenerateTypeCode(CClassContext& ctx) const{    m_RefType->GenerateTypeCode(ctx);}void CAliasTypeStrings::GeneratePointerTypeCode(CClassContext& ctx) const{    m_RefType->GeneratePointerTypeCode(ctx);}CAliasRefTypeStrings::CAliasRefTypeStrings(const string& className,                                           const CNamespace& ns,                                           const string& fileName,                                           CTypeStrings& ref_type)    : m_ClassName(className),      m_Namespace(ns),      m_FileName(fileName),      m_RefType(&ref_type),      m_IsObject(m_RefType->GetKind() == eKindObject){}CTypeStrings::EKind CAliasRefTypeStrings::GetKind(void) const{    return m_IsObject ? eKindObject : eKindClass;}const CNamespace& CAliasRefTypeStrings::GetNamespace(void) const{    return m_Namespace;}void CAliasRefTypeStrings::GenerateTypeCode(CClassContext& ctx) const{    ctx.HPPIncludes().insert(m_FileName);}void CAliasRefTypeStrings::GeneratePointerTypeCode(CClassContext& ctx) const{    ctx.AddForwardDeclaration(m_ClassName, m_Namespace);    ctx.CPPIncludes().insert(m_FileName);}string CAliasRefTypeStrings::GetCType(const CNamespace& ns) const{    return ns.GetNamespaceRef(m_Namespace) + m_ClassName;}string CAliasRefTypeStrings::GetPrefixedCType(const CNamespace& ns,                                              const string& /*methodPrefix*/) const{    return GetCType(ns);}bool CAliasRefTypeStrings::HaveSpecialRef(void) const{    return m_RefType->HaveSpecialRef();}string CAliasRefTypeStrings::GetRef(const CNamespace& ns) const{    return "CLASS, ("+GetCType(ns)+')';}bool CAliasRefTypeStrings::CanBeKey(void) const{    return m_RefType->CanBeKey();}bool CAliasRefTypeStrings::CanBeCopied(void) const{    return m_RefType->CanBeCopied();}string CAliasRefTypeStrings::NewInstance(const string& init) const{    return "new "+GetCType(CNamespace::KEmptyNamespace)+"("+init+')';}string CAliasRefTypeStrings::GetInitializer(void) const{    return m_IsObject ?        NcbiEmptyString :        GetCType(GetNamespace()) + "(" + m_RefType->GetInitializer() + ")";}string CAliasRefTypeStrings::GetDestructionCode(const string& expr) const{    return m_IsObject ?        NcbiEmptyString :        m_RefType->GetDestructionCode(expr);}string CAliasRefTypeStrings::GetIsSetCode(const string& var) const{    return m_RefType->GetIsSetCode(var);}string CAliasRefTypeStrings::GetResetCode(const string& var) const{    return m_IsObject ?        var + ".Reset();\n" :        m_RefType->GetResetCode(var + ".Set()");}void CAliasRefTypeStrings::GenerateCode(CClassContext& ctx) const{    m_RefType->GenerateCode(ctx);}void CAliasRefTypeStrings::GenerateUserHPPCode(CNcbiOstream& out) const{    m_RefType->GenerateUserHPPCode(out);}void CAliasRefTypeStrings::GenerateUserCPPCode(CNcbiOstream& out) const{    m_RefType->GenerateUserCPPCode(out);}END_NCBI_SCOPE/** ===========================================================================** $Log: aliasstr.cpp,v $* Revision 1000.4  2004/06/01 19:42:14  gouriano* PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7** Revision 1.7  2004/05/17 21:03:13  gorelenk* Added include of PCH ncbi_pch.hpp** Revision 1.6  2004/05/03 19:31:03  gouriano* Made generation of DOXYGEN-style comments optional** Revision 1.5  2004/04/29 20:11:40  gouriano* Generate DOXYGEN-style comments in C++ headers** Revision 1.4  2004/03/08 20:08:53  gouriano* Correct namespaces of generated classes** Revision 1.3  2003/11/13 20:52:04  grichenk* Fixed namespaces in generated files.** Revision 1.2  2003/10/31 21:33:05  ucko* GetResetCode: tweak generated code so that it doesn't simply end up* resetting a temporary copy of the data.* Change log moved to end per current practice.** Revision 1.1  2003/10/21 13:45:23  grichenk* Initial revision** ===========================================================================*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -