00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef IXE_conf_H
00026 #define IXE_conf_H
00027
00028
00029 #include "platform.h"
00030
00031
00032 #include <iostream>
00033 #include <map>
00034 #include <string>
00035
00036
00037 #include "text/less.h"
00038
00039 namespace IXE {
00040
00054 class Configuration
00055 {
00056
00057 public:
00058
00059 static void load(char const* file_name);
00060
00061
00062
00063
00064
00065
00066 class Item;
00067 typedef std::map<char const*, Item*> Map;
00068
00069 static Map& variables();
00070
00071 static void reset();
00072
00073 static std::ostream& error(std::ostream& o = std::cerr) {
00074 return msg(o, "error");
00075 }
00076 static std::ostream& warning(std::ostream& o = std::cerr) {
00077 return msg(o, "warning");
00078 }
00079
00080 private:
00081 static int current_config_file_line_no;
00082
00083 static void insert(Item* var);
00084
00085 static void parseLine(char const*& line, int& line_no);
00086
00087 static std::ostream& msg(std::ostream&, char const* label);
00088
00089 public:
00090
00100 friend class Item;
00101 class Item
00102 {
00103 public:
00104 char const* name() const { return name_; }
00105
00106 protected:
00107 Item(char const* name) : name_(name) {
00108 Configuration::insert(this);
00109 }
00110
00111 virtual ~Item() { };
00112
00113 virtual void parseValue(char const*& line) = 0;
00114
00115
00116
00117 virtual void reset() = 0;
00118
00119
00120
00121
00122 friend class Configuration;
00123
00124 private:
00125
00126 char const* const name_;
00127 };
00128 };
00129
00135 template <class T>
00136 class Var : public Configuration::Item
00137 {
00138 public:
00139 typedef T value_type;
00140
00141 Var(char const* name) : Item(name) { }
00142
00143 inline operator T() const { return this->value; }
00144 inline operator T*() const { return &this->value; }
00145
00146 T& operator *() { return this->value; }
00147 T* operator ->() { return &this->value; }
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164 T value;
00165
00166
00167 protected:
00168 Var(char const* name, T value) :
00169 Item(name), value(value) { }
00170
00171 };
00172
00178 template <class T> class VarDefault : public Var<T>
00179 {
00180 VarDefault() { }
00181
00182 protected:
00183 VarDefault(char const *name, T default_value) :
00184 Var<T>(name, default_value), default_value(default_value) { }
00185
00186 virtual void reset() { Var<T>::value = default_value; }
00187
00188 private:
00189 T default_value;
00190 };
00191
00192
00193 template <class T> class conf : public Configuration::Item { };
00194
00195 }
00196
00197 #endif