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

📄 ncbiargs.cpp

📁 ncbi源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
{    return;}CArgDesc_KeyOpt::~CArgDesc_KeyOpt(void){    return;}string CArgDesc_KeyOpt::GetUsageSynopsis(bool name_only) const{    return s_KeyUsageSynopsis(GetName(), GetSynopsis(), name_only);}/////////////////////////////////////////////////////////  CArgDesc_KeyDef::CArgDesc_KeyDef::CArgDesc_KeyDef(const string&            name,                                 const string&            comment,                                 CArgDescriptions::EType  type,                                 CArgDescriptions::TFlags flags,                                 const string&            synopsis,                                 const string&            default_value)    : CArgDescMandatory(name, comment, type, flags),      CArgDescOptional (name, comment, type, flags),      CArgDesc_PosDef  (name, comment, type, flags, default_value),      CArgDescSynopsis(synopsis){    return;}CArgDesc_KeyDef::~CArgDesc_KeyDef(void){    return;}string CArgDesc_KeyDef::GetUsageSynopsis(bool name_only) const{    return s_KeyUsageSynopsis(GetName(), GetSynopsis(), name_only);}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  Aux.functions to figure out various arg. features////    s_IsPositional(arg)//    s_IsOptional(arg)//    s_IsFlag(arg)//inline bool s_IsKey(const CArgDesc& arg){    return (dynamic_cast<const CArgDescSynopsis*> (&arg) != 0);}inline bool s_IsPositional(const CArgDesc& arg){    return dynamic_cast<const CArgDesc_Pos*> (&arg) &&  !s_IsKey(arg);}inline bool s_IsOptional(const CArgDesc& arg){    return (dynamic_cast<const CArgDescOptional*> (&arg) != 0);}inline bool s_IsFlag(const CArgDesc& arg){    return (dynamic_cast<const CArgDesc_Flag*> (&arg) != 0);}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  CArgs:://CArgs::CArgs(void){    m_nExtra = 0;}CArgs::~CArgs(void){    return;}static string s_ComposeNameExtra(size_t idx){    return '#' + NStr::UIntToString(idx);}CArgs::TArgsCI CArgs::x_Find(const string& name) const{    return m_Args.find(CRef<CArgValue> (new CArg_NoValue(name)));}bool CArgs::Exist(const string& name) const{    return (x_Find(name) != m_Args.end());}const CArgValue& CArgs::operator[] (const string& name) const{    TArgsCI arg = x_Find(name);    if (arg == m_Args.end()) {        // Special diagnostics for "extra" args        if (!name.empty()  &&  name[0] == '#') {            size_t idx;            try {                idx = NStr::StringToUInt(name.c_str() + 1);            } catch (...) {                idx = kMax_UInt;            }            if (idx == kMax_UInt) {                NCBI_THROW(CArgException,eInvalidArg,                    "Argument of invalid name requested: "+ name);            }            if (m_nExtra == 0) {                NCBI_THROW(CArgException,eInvalidArg,                    "No \"extra\" (unnamed positional) arguments "                    "provided, cannot Get: "+ s_ComposeNameExtra(idx));            }            if (idx == 0  ||  idx >= m_nExtra) {                NCBI_THROW(CArgException,eInvalidArg,                    "\"Extra\" (unnamed positional) arg is "                    "out-of-range (#1..#" + NStr::UIntToString(m_nExtra)                    + "): "+ s_ComposeNameExtra(idx));            }        }        // Diagnostics for all other argument classes        NCBI_THROW(CArgException,eInvalidArg,            "Undescribed argument requested: "+ name);    }    // Found arg with name "name"    return **arg;}const CArgValue& CArgs::operator[] (size_t idx) const{    return (*this)[s_ComposeNameExtra(idx)];}string& CArgs::Print(string& str) const{    for (TArgsCI arg = m_Args.begin();  arg != m_Args.end();  ++arg) {        // Arg. name        const string& arg_name = (*arg)->GetName();        str += arg_name;        // Arg. value, if any        const CArgValue& arg_value = (*this)[arg_name];        if ( arg_value ) {            str += " = `";            str += arg_value.AsString();            str += "'\n";        } else {            str += ":  <not assigned>\n";        }    }    return str;}void CArgs::Add(CArgValue* arg){    // special case:  add an "extra" arg (generate virtual name for it)    bool is_extra = false;    if ( arg->GetName().empty() ) {        arg->m_Name = s_ComposeNameExtra(m_nExtra + 1);        is_extra = true;    }    // check-up    _ASSERT(CArgDescriptions::VerifyName(arg->GetName(), true));    if ( Exist(arg->GetName()) ) {        NCBI_THROW(CArgException,eSynopsis,            "Argument with this name is defined already: " + arg->GetName());    }    // add    m_Args.insert(CRef<CArgValue>(arg));    if ( is_extra ) {        m_nExtra++;    }}bool CArgs::IsEmpty(void) const{    return m_Args.empty();}////////////////////////////////////////////////////////////////////////////////////////////////////////////////  CArgDescriptions:://CArgDescriptions::CArgDescriptions(bool auto_help)    : m_nExtra(0),      m_nExtraOpt(0),      m_AutoHelp(auto_help),      m_UsageIfNoArgs(false){    SetUsageContext("NCBI_PROGRAM", kEmptyStr);    if ( m_AutoHelp ) {        AddFlag(s_AutoHelp,                "Print this USAGE message;  ignore other arguments");    }}CArgDescriptions::~CArgDescriptions(void){    return;}const string& CArgDescriptions::GetTypeName(EType type){    static const string s_TypeName[k_EType_Size] = {        "String",        "Boolean",        "Integer",        "Real",        "File_In",        "File_Out"    };    if (type == k_EType_Size) {        _TROUBLE;        NCBI_THROW(CArgException, eArgType,            "Invalid argument type: k_EType_Size");    }    return s_TypeName[(int) type];}void CArgDescriptions::AddKey(const string& name, const string& synopsis, const string& comment, EType         type, TFlags        flags){    auto_ptr<CArgDesc_Key> arg        (new CArgDesc_Key(name, comment, type, flags, synopsis));    x_AddDesc(*arg);    arg.release();}void CArgDescriptions::AddOptionalKey(const string& name, const string& synopsis, const string& comment, EType         type, TFlags        flags){    auto_ptr<CArgDesc_KeyOpt> arg        (new CArgDesc_KeyOpt(name, comment, type, flags, synopsis));    x_AddDesc(*arg);    arg.release();}void CArgDescriptions::AddDefaultKey(const string& name, const string& synopsis, const string& comment, EType         type, const string& default_value, TFlags        flags){    auto_ptr<CArgDesc_KeyDef> arg        (new CArgDesc_KeyDef(name, comment, type, flags, synopsis,                             default_value));    x_AddDesc(*arg);    arg.release();}void CArgDescriptions::AddFlag(const string& name, const string& comment, bool          set_value){    auto_ptr<CArgDesc_Flag> arg        (new CArgDesc_Flag(name, comment, set_value));    x_AddDesc(*arg);    arg.release();}void CArgDescriptions::AddPositional(const string& name, const string& comment, EType         type, TFlags        flags){    auto_ptr<CArgDesc_Pos> arg        (new CArgDesc_Pos(name, comment, type, flags));    x_AddDesc(*arg);    arg.release();}void CArgDescriptions::AddOptionalPositional(const string& name, const string& comment, EType         type, TFlags        flags){    auto_ptr<CArgDesc_PosOpt> arg        (new CArgDesc_PosOpt(name, comment, type, flags));    x_AddDesc(*arg);    arg.release();}void CArgDescriptions::AddDefaultPositional(const string& name, const string& comment, EType         type, const string& default_value, TFlags        flags){    auto_ptr<CArgDesc_PosDef> arg        (new CArgDesc_PosDef(name, comment, type, flags, default_value));    x_AddDesc(*arg);    arg.release();}void CArgDescriptions::AddExtra(unsigned      n_mandatory, unsigned      n_optional, const string& comment, EType         type, TFlags        flags){    if (!n_mandatory  &&  !n_optional) {        NCBI_THROW(CArgException,eSynopsis,            "Number of extra arguments cannot be zero");    }    if (n_mandatory > 4096) {        NCBI_THROW(CArgException,eSynopsis,            "Number of mandatory extra arguments is too big");    }    m_nExtra    = n_mandatory;    m_nExtraOpt = n_optional;    auto_ptr<CArgDesc_Pos> arg        (m_nExtra ?         new CArgDesc_Pos   (kEmptyStr, comment, type, flags) :         new CArgDesc_PosOpt(kEmptyStr, comment, type, flags));    x_AddDesc(*arg);    arg.release();}void CArgDescriptions::SetConstraint(const string& name, CArgAllow* constraint){    CRef<CArgAllow> safe_delete(constraint);    TArgsI it = x_Find(name);    if (it == m_Args.end()) {        NCBI_THROW(CArgException, eConstraint,             "Attempt to set constraint for undescribed argument: "+ name);    }    (*it)->SetConstraint(constraint);}bool CArgDescriptions::Exist(const string& name) const{    return (x_Find(name) != m_Args.end());}void CArgDescriptions::Delete(const string& name){    {{ // ...from the list of all args        TArgsI it = x_Find(name);        if (it == m_Args.end()) {            NCBI_THROW(CArgException,eSynopsis,                "Argument description is not found");        }        m_Args.erase(it);        // take special care of the extra args        if ( name.empty() ) {            m_nExtra = 0;            m_nExtraOpt = 0;            return;        }    }}    {{ // ...from the list of key/flag args        TKeyFlagArgs::iterator it =            find(m_KeyFlagArgs.begin(), m_KeyFlagArgs.end(), name);        if (it != m_KeyFlagArgs.end()) {            m_KeyFlagArgs.erase(it);            _ASSERT(find(m_KeyFlagArgs.begin(), m_KeyFlagArgs.end(), name) ==                         m_KeyFlagArgs.end());            _ASSERT(find(m_PosArgs.begin(), m_PosArgs.end(), name) ==                         m_PosArgs.end());            return;        }    }}    {{ // ...from the list of positional args' positions        TPosArgs::iterator it =            find(m_PosArgs.begin(), m_PosArgs.end(), name);        _ASSERT (it != m_PosArgs.end());        m_PosArgs.erase(it);        _ASSERT(find(m_PosArgs.begin(), m_PosArgs.end(), name) ==                     m_PosArgs.end());    }}}// Fake class to hold only a name -- to find in "m_Args"class CArgDesc_NameOnly : public CArgDesc{public:    CArgDesc_NameOnly(const string& name) :        CArgDesc(name, kEmptyStr) {}private:    virtual string GetUsageSynopsis(bool/*name_only*/) const{return kEmptyStr;}

⌨️ 快捷键说明

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