00001 #include "ModulesOptions.h"
00002 #include "ModulesParser.h"
00003 #include "ModulesFactory.h"
00004 #include <sstream>
00005 #include <iostream>
00006 #include <string.h>
00007 #include <TFormula.h>
00008 #include "debug_tools.h"
00009
00010 modules::bad_value::bad_value(const char* module, const char* name, const char* range, double val):
00011 std::out_of_range(Form("For '%s', option '%s' has value %f,"
00012 " which fails '%s'", module,name,val,range)){
00013 }
00014
00015 std::string modules::options::GetOption(const std::string& key, bool complain)const{
00016 OptionsList_t::const_iterator it = fOptions.find(key);
00017 if(it==fOptions.end()){
00018 if(complain){
00019 throw missing_option(fModuleName,key);
00020 }
00021 return "";
00022 }
00023 return it->second;
00024 }
00025
00026 template <typename T>
00027 T modules::options::GetOption(const std::string& key,const T& defVal,bool complain, const std::string& range)const{
00028 std::stringstream ss(GetOption(key,complain));
00029 T val=defVal;
00030 ss>>val;
00031 if(!range.empty()) CheckValid(key,range.c_str(),val);
00032 return val;
00033 }
00034
00035 void modules::options::CheckValid(const std::string& name,
00036 const char* expression, double value)const{
00037 std::string expr(expression);
00038 modules::parser::ReplaceWords(expr,name,"x");
00039 TFormula formula((name+"_validity").c_str(), expr.c_str());
00040 formula.Compile();
00041 double eval=formula.Eval(value);
00042 if(eval!=1){
00043 throw bad_value(fModuleName.c_str(),name.c_str(),expression,value);
00044 }
00045 }
00046
00047 int modules::options::GetInt(const std::string& name, const std::string& range)const{
00048 return GetOption<int>(name,0,true,range);
00049 }
00050 int modules::options::GetInt(const std::string& name, int defVal, const std::string& range)const{
00051 return GetOption<int>(name,defVal,false,range);
00052 }
00053
00054 double modules::options::GetDouble(const std::string& name, const std::string& range)const{
00055 return GetOption<double>(name,0,true,range);
00056 }
00057 double modules::options::GetDouble(const std::string& name, double defVal, const std::string& range)const{
00058 return GetOption<double>(name,defVal,false,range);
00059 }
00060
00061 std::string modules::options::GetString(const std::string& name)const{
00062 std::string ret_val=GetOption(name,true);
00063 modules::parser::TrimWhiteSpaceBeforeAfter(ret_val);
00064 return ret_val;
00065 }
00066
00067 std::string modules::options::GetString(const std::string& name,const std::string& defVal)const{
00068 std::string ret_val=GetOption(name,false);
00069 modules::parser::TrimWhiteSpaceBeforeAfter(ret_val);
00070 if(ret_val=="") ret_val=defVal;
00071 return ret_val;
00072 }
00073
00074 bool modules::options::GetBool(const std::string& name)const{
00075 return modules::parser::IsTrue(GetString(name));
00076 }
00077
00078 bool modules::options::GetBool(const std::string& name,bool defVal)const{
00079 return modules::parser::IsTrue(GetString(name,Form("%d",defVal)));
00080 }
00081
00082 int modules::options::GetVectorStringsByWhiteSpace(const std::string& name, std::vector<std::string>& vect)const{
00083 std::stringstream ss(GetOption(name));
00084 std::string val;
00085 int num_tokens=0;
00086 for(;ss>>val; num_tokens++) {
00087 vect.push_back(val);
00088 }
00089 return num_tokens;
00090 }
00091
00092 int modules::options::GetVectorStringsByDelimiter(const std::string& name, std::vector<std::string>& vect, const char* delim)const{
00093 char line[2048];
00094 strcpy(line,GetOption(name).c_str());
00095 char* word = strtok(line,delim);
00096 int num_tokens=0;
00097 for(;word != NULL; num_tokens++) {
00098
00099 vect.push_back(word);
00100 word = strtok(NULL,delim);
00101 }
00102 return num_tokens;
00103 }
00104
00105 void modules::options::DumpOptions(const std::string& prefix)const{
00106
00107 OptionsOrder_t::const_iterator it;
00108 for(it=fOrder.begin();it!=fOrder.end();it++){
00109 std::cout<<prefix<<(*it)->first;
00110 if((*it)->second!=""){
00111 std::cout<<" = "<<(*it)->second;
00112 }
00113 std::cout<<std::endl;
00114 }
00115 }
00116
00117 void modules::options::AddArgument(const int& number, const std::string& option){
00118
00119 std::string name = modules::factory::Instance()->GetArgumentName(fModuleName,number);
00120
00121 modules::options::SetOption(name,option);
00122 }
00123
00124 bool modules::options::AppendToOption(const std::string& name, const std::string& option){
00125
00126 OptionsList_t::iterator it= fOptions.find(name);
00127
00128
00129 if(it==fOptions.end()) return false;
00130
00131
00132 it->second+=" : "+option;
00133 return true;
00134 }
00135
00136 int modules::options::MakeIdNumber(){
00137 static int count=0;
00138 return count++;
00139 }
00140
00141 std::string modules::options::StringDescription()const{
00142 const char* key_val_sep="=";
00143 const char* start_key_val="{";
00144 const char* stop_key_val="}";
00145 OptionsOrder_t::const_iterator it;
00146 std::string description;
00147 for(it=fOrder.begin();it!=fOrder.end();it++){
00148 description+=start_key_val;
00149 description+=(*it)->first;
00150 if((*it)->second!=""){
00151 description+=key_val_sep;
00152 description+=(*it)->second;
00153 }
00154 description+=stop_key_val;
00155 }
00156 return description;
00157 }