00001 #ifndef MODULESOPTIONS__HH_
00002 #define MODULESOPTIONS__HH_
00003 #include <map>
00004 #include <vector>
00005 #include <string>
00006 #include <utility>
00007 #include <stdexcept>
00008
00009 namespace modules{
00010 class options;
00011 class missing_option;
00012 class bad_value;
00013 }
00014
00015 struct modules::missing_option:public std::runtime_error{
00016 missing_option(const std::string& name, const std::string& opt):
00017 std::runtime_error(("Missing option for '"+name+"': '"+opt+"'" ).c_str()){};
00018 };
00019
00020
00021 struct modules::bad_value:public std::out_of_range{
00022 bad_value(const char* module, const char* name, const char* range, double val);
00023 };
00024
00026 class modules::options{
00027 public:
00029 typedef std::map<std::string,std::string> OptionsList_t;
00031 typedef std::vector<OptionsList_t::iterator> OptionsOrder_t;
00032
00033 public:
00035
00036 options(const std::string& name):fModuleName(name){
00037 fIdNumber=MakeIdNumber();
00038 };
00039 virtual ~options(){};
00040
00044 std::string StringDescription()const;
00045
00046
00047
00052 void SetOption(const std::string& key, const std::string& value);
00053
00059 bool AppendToOption(const std::string& key, const std::string& value);
00060
00067 void AddArgument(const int& number, const std::string& value);
00068
00069
00070
00084 int GetInt(const std::string& name,int defVal, const std::string& range="")const;
00085
00097 double GetDouble(const std::string& name,double defVal, const std::string& range="")const;
00098
00105 std::string GetString(const std::string& name,const std::string& defVal)const;
00106
00110 bool GetBool(const std::string& name, bool defVal)const;
00111
00123 int GetInt(const std::string& name, const std::string& range="")const;
00124
00136 double GetDouble(const std::string& name, const std::string& range="")const;
00137
00141 std::string GetString(const std::string& name)const;
00142
00145 bool GetBool(const std::string& name)const;
00146
00152 int GetVectorStringsByWhiteSpace(const std::string& name, std::vector<std::string>& vect)const;
00153
00162 int GetVectorStringsByDelimiter(const std::string& name, std::vector<std::string>& vect,const char* delim=":")const;
00163
00167 bool HasOption(const std::string& name)const;
00168
00174 bool GetFlag(const std::string& name)const;
00175
00177 bool GetNumOptions()const{return fOptions.size();};
00178
00181 std::string GetOption(const std::string& name, bool complain=false)const;
00182
00184 OptionsList_t::const_iterator begin()const{return fOptions.begin();};
00186 OptionsList_t::const_iterator end()const{return fOptions.end();};
00187
00188
00189
00190
00193 void DumpOptions(const std::string& prefix=" ")const;
00194
00196 void SetAlias(const std::string& alias){SetOption("alias",alias);};
00198 std::string GetAlias(const std::string& defVal="")const{return GetString("alias",defVal);};
00199
00201
00202 private:
00210 template <typename T>
00211 T GetOption(const std::string& name,const T& defVal, bool complain,const std::string& range="")const;
00212
00214 static int MakeIdNumber();
00215
00220 void CheckValid(const std::string& name, const char* expression, double value)const;
00221
00222 private:
00223 OptionsList_t fOptions;
00224 OptionsOrder_t fOrder;
00225 int fIdNumber;
00226
00227 protected:
00228 std::string fModuleName;
00229
00230 };
00231
00232 inline void modules::options::SetOption(const std::string& name, const std::string& option){
00233
00234 OptionsList_t::iterator it = fOptions.find(name);
00235 fOptions[name]=option;
00236 if(it==fOptions.end()) fOrder.push_back(fOptions.find(name));
00237 }
00238
00239 inline bool modules::options::HasOption(const std::string& name)const{
00240 return fOptions.find(name)!=fOptions.end();
00241 }
00242
00243 inline bool modules::options::GetFlag(const std::string& name)const{
00244 return (HasOption(name) && (GetOption(name).empty() || GetBool(name)));
00245 }
00246
00247 #endif //MODULESOPTIONS__HH_