// The code is copyrighted 2008 by Carsten Frigaard. // All rights placed in public domain under GNU licence V2, 2008 // // © 2008 Carsten Frigaard. Permission to use, copy, modify, and distribute this software // and its documentation for any purpose and without fee is hereby granted, provided that // the above copyright notice appear in all copies and that both that copyright notice // and this permission notice appear in supporting documentation. #ifndef __ARGS_H__ #define __ARGS_H__ class args{ private: typedef vector t_args; t_args m_args; void Remove(t_args::iterator itt1,int n) { t_args args2; for(t_args::iterator itt2=m_args.begin();itt2!=m_args.end();++itt2) { if(itt2!=itt1) args2.push_back(*itt2); else {if (--n>0) ++itt1;} } m_args=args2; } t_args::iterator Find(const string& v) { for(t_args::iterator itt=m_args.begin();itt!=m_args.end();++itt) { if (v==*itt) return itt; } return m_args.end(); } t_args::const_iterator Find(const string& v) const { for(t_args::const_iterator itt=m_args.begin();itt!=m_args.end();++itt) { if (v==*itt) return itt; } return m_args.end(); } public: args(const int argc,char **argv,const bool printargs=false) { for(int i=0;i=size()) throw_("argument[] out of range"); return m_args[i]; } size_t size() const {return m_args.size();} bool hasopt(const string& tag) const {return Find(tag)!=m_args.end();} template T Totype(const size_t i) const {return totype((*this)[i]);} template T Tounit(const size_t i) const { const string& s=(*this)[i+1]; #ifndef USE_UNITS // fake test of units, primitive test, must be one-of: kpc, per_kpc and msun1E10 if (s!="kpc/h" && s!="h/kpc" && s!="msun1E10/h") throw_("bad unit=<" + s + ">, can only handle units of type: kpc/h, h/kpc, and msun1E10/h"); #endif return totype((*this)[i] + " " + s); } template T parseval(const string& tag,const T& defaultval) { t_args::iterator itt=Find(tag); if (itt==m_args.end() || itt+1==m_args.end()) return defaultval; const T v=totype(*(++itt)); Remove(--itt,2); return v; } template pair parseval(const string& tag,const T& defaultval1,const R& defaultval2) { t_args::iterator itt=Find(tag); if (itt==m_args.end() || itt+1==m_args.end() || itt+2==m_args.end()) return make_pair(defaultval1,defaultval2); const T v1=totype(*(++itt)); const R v2=totype(*(++itt)); Remove(----itt,3); return make_pair(v1,v2); } template T parseunit(const string& tag,const T& defaultval) { t_args::iterator itt=Find(tag); if (itt==m_args.end() || itt+2==m_args.end()) return defaultval; const string s1=*(++itt); const string s2=*(++itt); const T v=totype(s1 + " " + s2); Remove(----itt,3); return v; } bool parseopt(const string& tag) { t_args::iterator itt=Find(tag); if (itt==m_args.end()) return false; Remove(itt,1); return true; } int getoptindex(const string& tag) const { int n=0; for(t_args::const_iterator itt=m_args.begin();itt!=m_args.end();++itt,++n) { if (tag==*itt) { assert( n>=0 && size_t(n)m_args.size() || i+n>m_args.size()) throw_("out of range"); m_args.erase(m_args.begin()+i,m_args.begin()+i+n); } friend ostream& operator<<(ostream& s,const args& v) { for(t_args::const_iterator itt=v.m_args.begin();itt!=v.m_args.end();++itt){ s << *itt << " "; } return s; } }; #endif // __ARGS_H__