param.h

Go to the documentation of this file.
00001 // Copyright (C) 2006 Ivo Nowak and Stefan Vigerske
00002 // All Rights Reserved.
00003 // This code is published under the Common Public License.
00004 //
00005 // Author: Stefan Vigerske
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*> &paramfiles_, 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(strdup("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 //    if (parvalue) free(parvalue);
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 //    if (parvalue) free(parvalue);
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) {  // Check against self assignment
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

Generated on Tue Oct 21 03:12:10 2008 for LaGO by  doxygen 1.4.7