00001
00002
00003
00004
00005
00006
00009 #ifndef PARAM_H
00010 #define PARAM_H
00011
00012 #include "standard.h"
00013
00016 class ParamTree {
00017 public:
00020 ParamTree *left, *right;
00021
00024 const char *name;
00025
00028 const char *value;
00029
00035 ParamTree(const char* name_, const char* value_=(char*)NULL)
00036 : left(NULL), right(NULL), name(name_), value(value_)
00037 { if (! name_) {
00038 out_err << "Can't handle NULL-pointer as argument for ParamTree::ParamTree(char*, char*=0)." << endl;
00039 exit(-1);
00040 }
00041 }
00042
00048 ParamTree(ParamTree &PT)
00049 : name(strdup(PT.name)), value(PT.value ? strdup(PT.value) : NULL),
00050 left(PT.left ? new ParamTree(*PT.left) : NULL),
00051 right(PT.right ? new ParamTree(*PT.right) : NULL)
00052 { }
00053
00057 ~ParamTree();
00058
00064 void add(const char* name_, const char* value_=(const char*)NULL);
00065
00070 const char* get(const char* name_);
00071
00076 void dump(ostream& out);
00077
00078 };
00079
00082 class Param {
00083
00087 friend ostream& operator<<(ostream &out, Param& a) {
00088 if (a.head) a.head->dump(out);
00089 else out << "Empty parameter-tree";
00090 return out;
00091 }
00092
00093 private:
00097 int filenr;
00098
00101 ifstream *file;
00102
00105 vector<char*> paramfiles;
00106
00109 ParamTree *head;
00110
00111 public:
00114 char *basedir;
00115
00124 Param(vector<char*> ¶mfiles_, const char* basedir_="resource/")
00125 : paramfiles(paramfiles_.size()), filenr(-1), head(NULL), basedir(basedir_ ? strdup(basedir_) : new char(0))
00126 { for (int i=0; i<paramfiles_.size(); i++)
00127 paramfiles[i]=(paramfiles_[i] ? strdup(paramfiles_[i]) : NULL);
00128 }
00129
00138 Param(const char* paramfile_, const char* basedir_="resource/")
00139 : paramfiles(paramfile_ ? 1 : 0), filenr(-1), head(NULL), basedir(basedir_ ? strdup(basedir_) : new char(0))
00140 {
00141 if (paramfile_) paramfiles[0]=strdup(paramfile_);
00142 }
00143
00149 Param() : filenr(-1), head(NULL), basedir("resource/") { }
00150
00159 Param(Param& P) {
00160 *this=P;
00161 }
00162
00167 ~Param();
00168
00172 void add_file(char* filename) {
00173 if (filename) paramfiles.push_back(strdup(filename));
00174 }
00175
00180 int read();
00181
00187 Pointer<char> get(const char *name, const char* def=(const char*)NULL) const {
00188 const char* parvalue=(head ? head->get(name) : NULL);
00189 return (parvalue ? strdup(parvalue) : (def ? strdup(def) : NULL));
00190 }
00191
00197 double get_d(const char* name_, double def=0) const {
00198 Pointer<char> parvalue=get(name_);
00199 double val=(parvalue ? (double)atof(parvalue) : def);
00200
00201
00202 return val;
00203 };
00204
00210 int get_i(const char* name_, int def=0) const {
00211 Pointer<char> parvalue=get(name_);
00212 int val=(parvalue ? atoi(parvalue) : def);
00213
00214
00215 return val;
00216 }
00217
00223 void add(const char* name_, const char* value_) {
00224 if (!name_) return;
00225 if (head) head->add(strdup(name_), value_ ? strdup(value_) : NULL);
00226 else head=new ParamTree(strdup(name_), value_ ? strdup(value_) : NULL);
00227 }
00228
00233 Param& operator = (const Param &p)
00234 {
00235 if (&p != this) {
00236 basedir = (p.basedir ? strdup(p.basedir) : new char(0));
00237
00238 for (int i=0; i<p.paramfiles.size(); i++)
00239 paramfiles.push_back(p.paramfiles[i] ? strdup(p.paramfiles[i]) : NULL);
00240
00241 filenr=p.filenr;
00242
00243 head=(p.head ? new ParamTree(*p.head) : NULL);
00244 }
00245 return *this;
00246 }
00247 };
00248
00249 #endif // PARAM_H