📄 ncbiargs.cpp
字号:
{ 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 + -