00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 #ifndef DCONFIG_H
00020 #define DCONFIG_H
00021 
00022 #include <dtoolbase.h>
00023 
00024 #include "config_setup.h"
00025 #include "config_dconfig.h"
00026 #include "configTable.h"
00027 #include "executionEnvironment.h"
00028 
00029 #include <vector>
00030 #include <map>
00031 #include <time.h>
00032 
00033 namespace Config {
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 EXPCL_DTOOLCONFIG INLINE double get_total_time_config_init();
00055 EXPCL_DTOOLCONFIG INLINE double get_total_time_external_init();
00056 EXPCL_DTOOLCONFIG INLINE double get_total_num_get();
00057 
00058 
00059 
00060 EXPCL_DTOOLCONFIG extern clock_t total_time_config_init;
00061 EXPCL_DTOOLCONFIG extern clock_t total_time_external_init;
00062 EXPCL_DTOOLCONFIG extern int total_num_get;
00063 
00064 template <class GetConfig>
00065 class Config {
00066    protected:
00067       static void ConfigFunc(void);
00068       static void Flag(bool);
00069    public:
00070       Config(void);
00071       ~Config(void);
00072       static bool         AmInitializing(void);
00073       static ConfigString Name(void);
00074       static bool         Flag(void);
00075       static void         Init(void);
00076       static bool         Defined(const ConfigString& sym);
00077       static ConfigString Get(const ConfigString sym);
00078       static ConfigTable::Symbol& GetAll(const ConfigString,
00079                                          ConfigTable::Symbol&);
00080    PUBLISHED:
00081       static bool         GetBool(const ConfigString sym, bool def = false);
00082       static int          GetInt(const ConfigString sym, int def = 0);
00083       static float        GetFloat(const ConfigString sym, float def = 0.);
00084       static double       GetDouble(const ConfigString sym, double def = 0.);
00085       static ConfigString GetString(const ConfigString sym,
00086                                     const ConfigString def = "");
00087 };
00088 
00089 
00090 
00091 template<class GetConfig>
00092 void Config<GetConfig>::ConfigFunc(void)
00093 {
00094   GetConfig::config_func();
00095 }
00096 
00097 template<class GetConfig>
00098 bool Config<GetConfig>::AmInitializing(void)
00099 {
00100    ConfigTable* tab = ConfigTable::Instance();
00101    if (tab == (ConfigTable *)0L)
00102       return Flag();
00103    return tab->AmInitializing();
00104 }
00105 
00106 template<class GetConfig>
00107 ConfigString Config<GetConfig>::Name(void)
00108 {
00109    return GetConfig::get_name();
00110 }
00111 
00112 template<class GetConfig>
00113 bool Config<GetConfig>::Flag(void)
00114 {
00115    return GetConfig::_flag;
00116 }
00117 
00118 template<class GetConfig>
00119 void Config<GetConfig>::Flag(bool f)
00120 {
00121    GetConfig::_flag = f;
00122 }
00123 
00124 template<class GetConfig>
00125 void Config<GetConfig>::Init(void)
00126 {
00127    if (Flag())
00128       return;
00129    total_time_config_init -= clock();
00130    Flag(true);
00131    ConfigTable* tab = ConfigTable::Instance();
00132 
00133    if (Defined("notify-level-config")) {
00134       ConfigString s = Get("notify-level-config");
00135       NotifySeverity sev = Notify::string_severity(s);
00136       if (sev != NS_unspecified) {
00137          microconfig_cat->set_severity(sev);
00138          dconfig_cat->set_severity(sev);
00139       } else {
00140          microconfig_cat->set_severity(NS_info);
00141          dconfig_cat->set_severity(NS_info);
00142       }
00143    } else {
00144       if(!tab->IsConfigDbg()) {
00145           microconfig_cat->set_severity(NS_info);
00146           dconfig_cat->set_severity(NS_info);
00147       }
00148    }
00149 
00150    total_time_config_init += clock();
00151    total_time_external_init -= clock();
00152 
00153    if (dconfig_cat->is_spam())
00154       dconfig_cat->spam() << "calling ConfigFunc for '" << Name() << "'"
00155                          << endl;
00156    ConfigFunc();
00157    if (dconfig_cat->is_spam())
00158       dconfig_cat->spam() << "back from ConfigFunc for '" << Name() << "'"
00159                          << endl;
00160    total_time_external_init += clock();
00161 }
00162 
00163 template<class GetConfig>
00164 Config<GetConfig>::Config(void)
00165 {
00166    Init();
00167 }
00168 
00169 template<class GetConfig>
00170 Config<GetConfig>::~Config(void)
00171 {
00172 }
00173 
00174 template<class GetConfig>
00175 bool Config<GetConfig>::Defined(const ConfigString& sym)
00176 {
00177    Init();
00178    ConfigTable* tab = ConfigTable::Instance();
00179    if (tab->Defined(sym, Name()))
00180       return true;
00181    else if (tab->Defined(sym, ExecutionEnvironment::get_binary_name()))
00182       return true;
00183    else if (tab->Defined(sym))
00184       return true;
00185    return false;
00186 }
00187 
00188 template<class GetConfig>
00189 ConfigString Config<GetConfig>::Get(ConfigString sym)
00190 {
00191    Init();
00192    ConfigTable* tab = ConfigTable::Instance();
00193    if (tab->Defined(sym, Name()))
00194       return (tab->Get(sym, Name())).Val();
00195    else if (tab->Defined(sym, ExecutionEnvironment::get_binary_name()))
00196       return (tab->Get(sym, ExecutionEnvironment::get_binary_name())).Val();
00197    else if (tab->Defined(sym))
00198       return (tab->Get(sym)).Val();
00199    else
00200       return "";
00201 }
00202 
00203 template<class GetConfig>
00204 ConfigTable::Symbol& Config<GetConfig>::GetAll(const ConfigString sym,
00205                                                 ConfigTable::Symbol& s)
00206 {
00207    Init();
00208    ConfigTable* tab = ConfigTable::Instance();
00209    if (tab->Defined(sym, Name())) {
00210      const ConfigTable::Symbol& tsym = tab->GetSym(sym, Name());
00211      s.insert(s.end(), tsym.begin(), tsym.end());
00212    }
00213    if (tab->Defined(sym, ExecutionEnvironment::get_binary_name())) {
00214      const ConfigTable::Symbol& tsym = tab->GetSym(sym, ExecutionEnvironment::get_binary_name());
00215      s.insert(s.end(), tsym.begin(), tsym.end());
00216    }
00217    if (tab->Defined(sym)) {
00218      const ConfigTable::Symbol& tsym = tab->GetSym(sym);
00219      s.insert(s.end(), tsym.begin(), tsym.end());
00220    }
00221    return s;
00222 }
00223 
00224 template<class GetConfig>
00225 bool Config<GetConfig>::GetBool(const ConfigString sym, bool def)
00226 {
00227    Init();
00228    if (Defined(sym)) {
00229       ConfigString s = Get(sym);
00230       bool ret = ConfigTable::TrueOrFalse(s, def);
00231       if (dconfig_cat->is_spam())
00232          dconfig_cat->spam() << "symbol '" << sym << "' defined, returning: "
00233                             << (ret?"true":"false") << endl;
00234       return ret;
00235    } else {
00236       if (dconfig_cat->is_spam())
00237          dconfig_cat->spam()
00238             << "symbol '" << sym
00239             << "' is not defined, returning provided default: "
00240             << (def?"true":"false") << endl;
00241       return def;
00242    }
00243 }
00244 
00245 template<class GetConfig>
00246 int Config<GetConfig>::GetInt(const ConfigString sym, int def)
00247 {
00248    Init();
00249    if (Defined(sym)) {
00250       ConfigString v = Get(sym);
00251       istringstream s(v);
00252       int i;
00253       s >> i;
00254       if (dconfig_cat->is_spam())
00255          dconfig_cat->spam() << "symbol '" << sym << "' defined, returning: "
00256                             << i << endl;
00257       return i;
00258    } else {
00259       if (dconfig_cat->is_spam())
00260          dconfig_cat->spam()
00261             << "symbol '" << sym
00262             << "' is not defined, returning provided default: " << def << endl;
00263       return def;
00264    }
00265 }
00266 
00267 template<class GetConfig>
00268 float Config<GetConfig>::GetFloat(const ConfigString sym, float def)
00269 {
00270    Init();
00271    if (Defined(sym)) {
00272       ConfigString v = Get(sym);
00273       istringstream s(v);
00274       float f;
00275       s >> f;
00276       if (dconfig_cat->is_spam())
00277          dconfig_cat->spam() << "symbol '" << sym << "' defined, returning: "
00278                             << f << endl;
00279       return f;
00280    } else {
00281       if (dconfig_cat->is_spam())
00282          dconfig_cat->spam()
00283             << "symbol '" << sym
00284             << "' is not defined, returning provided default: " << def << endl;
00285       return def;
00286    }
00287 }
00288 
00289 template<class GetConfig>
00290 double Config<GetConfig>::GetDouble(const ConfigString sym, double def)
00291 {
00292    Init();
00293    if (Defined(sym)) {
00294       ConfigString v = Get(sym);
00295       istringstream s(v);
00296       double d;
00297       s >> d;
00298       if (dconfig_cat->is_spam())
00299          dconfig_cat->spam() << "symbol '" << sym << "' defined, returning: "
00300                             << d << endl;
00301       return d;
00302    } else {
00303       if (dconfig_cat->is_spam())
00304          dconfig_cat->spam()
00305             << "symbol '" << sym
00306             << "' is not defined, returning provided default: " << def << endl;
00307       return def;
00308    }
00309 }
00310 
00311 template<class GetConfig>
00312 ConfigString Config<GetConfig>::GetString(const ConfigString sym,
00313                                            const ConfigString def)
00314 {
00315    Init();
00316    if (Defined(sym)) {
00317       ConfigString ret = Get(sym);
00318       if (dconfig_cat->is_spam())
00319          dconfig_cat->spam() << "symbol '" << sym << "' defined, returning: '"
00320                             << ret << "'" << endl;
00321       return ret;
00322    } else {
00323       if (dconfig_cat->is_spam())
00324          dconfig_cat->spam()
00325             << "symbol '" << sym
00326             << "' is not defined, returning provided default: '" << def
00327             << "'" << endl;
00328       return def;
00329    }
00330 }
00331 
00332 #include "dconfig.I"
00333 
00334 } 
00335 
00336 
00337 
00338 
00339 
00340 
00341 
00342 
00343 
00344 #if defined(WIN32_VC) && !defined(CPPPARSER)
00345 
00346 #define ConfigureDecl(name, expcl, exptp) \
00347   class expcl ConfigureGetConfig_ ## name { \
00348   public: \
00349     static const char *get_name(); \
00350     static void config_func(); \
00351     static bool _flag; \
00352   }; \
00353   exptp template class expcl Config::Config<ConfigureGetConfig_ ## name>; \
00354   extern expcl Config::Config<ConfigureGetConfig_ ## name> name;
00355 
00356 #else // WIN32_VC
00357 
00358 #define ConfigureDecl(name, expcl, exptp) \
00359   class expcl ConfigureGetConfig_ ## name { \
00360   public: \
00361     static const char *get_name(); \
00362     static void config_func(); \
00363     static bool _flag; \
00364   }; \
00365   extern expcl Config::Config<ConfigureGetConfig_ ## name> name;
00366 
00367 #endif  // WIN32_VC
00368 
00369 
00370 
00371 
00372 #if defined(PENV_OSX)
00373 #define ConfigureDef(name) \
00374   Config::Config<ConfigureGetConfig_ ## name> name; \
00375   bool ConfigureGetConfig_ ## name::_flag = false; \
00376   int FILE_SYM_NAME = 0; \
00377   const char *ConfigureGetConfig_ ## name:: \
00378   get_name() { \
00379     return #name; \
00380   }
00381 #else  
00382 #define ConfigureDef(name) \
00383   Config::Config<ConfigureGetConfig_ ## name> name; \
00384   bool ConfigureGetConfig_ ## name::_flag = false; \
00385   const char *ConfigureGetConfig_ ## name:: \
00386   get_name() { \
00387     return #name; \
00388   }
00389 #endif 
00390 
00391 
00392 
00393 
00394 #if defined(PENV_OSX)
00395 #define Configure(name) \
00396   class ConfigureGetConfig_ ## name { \
00397   public: \
00398     static const char *get_name(); \
00399     static void config_func(); \
00400     static bool _flag; \
00401   }; \
00402   static Config::Config<ConfigureGetConfig_ ## name> name; \
00403   bool ConfigureGetConfig_ ## name::_flag = false; \
00404   int FILE_SYM_NAME = 0; \
00405   const char *ConfigureGetConfig_ ## name:: \
00406   get_name() { \
00407     return #name; \
00408   }
00409 #else  
00410 #define Configure(name) \
00411   class ConfigureGetConfig_ ## name { \
00412   public: \
00413     static const char *get_name(); \
00414     static void config_func(); \
00415     static bool _flag; \
00416   }; \
00417   static Config::Config<ConfigureGetConfig_ ## name> name; \
00418   bool ConfigureGetConfig_ ## name::_flag = false; \
00419   const char *ConfigureGetConfig_ ## name:: \
00420   get_name() { \
00421     return #name; \
00422   }
00423 #endif 
00424 
00425 
00426 
00427 
00428 
00429 #define ConfigureFn(name) \
00430   void ConfigureGetConfig_ ## name::config_func()
00431 
00432 #if defined(PENV_OSX)
00433 
00434 #define ConfigureLibSym \
00435   char LIB_SYMBOL_NAME[] = ALL_FILE_SYMS_NAME ;
00436 #else
00437 #define ConfigureLibSym
00438 #endif 
00439 
00440 #endif