From 11e643f4b885ee1f96112fcf531739a339691272 Mon Sep 17 00:00:00 2001 From: Marius Nita Date: Mon, 26 Aug 2002 06:36:37 +0000 Subject: [PATCH] New and improved configuration management. It now handles bool, string and number types, and all conversions happen at initialization time, so retrieval is faster. (yay) --- util/epist/config.cc | 126 ++++++++++++++++++++++++++++++++++--------- util/epist/config.hh | 65 +++++++++++++--------- 2 files changed, 139 insertions(+), 52 deletions(-) diff --git a/util/epist/config.cc b/util/epist/config.cc index 506aab76..db9ecddd 100644 --- a/util/epist/config.cc +++ b/util/epist/config.cc @@ -28,19 +28,30 @@ Config::Config() {} Config::~Config() { - ItemList::const_iterator it = items.begin(), end = items.end(); - for (; it != end; ++it) - delete *it; - items.clear(); + // deallocate memory for the 3 lists + BoolItemList::const_iterator b_it, b_end = bool_items.end(); + for (b_it = bool_items.begin(); b_it != b_end; ++b_it) + delete *b_it; + bool_items.clear(); + + NumberItemList::const_iterator n_it, n_end = number_items.end(); + for (n_it = number_items.begin(); n_it != n_end; ++n_it) + delete *n_it; + number_items.clear(); + + StringItemList::const_iterator s_it, s_end = string_items.end(); + for (s_it = string_items.begin(); s_it != s_end; ++s_it) + delete *s_it; + string_items.clear(); } -bool Config::getStringValue(Config::ItemType type, string &ret) const +bool Config::getStringValue(Config::StringType type, string &ret) const { - ItemList::const_iterator it = items.begin(), end = items.end(); + StringItemList::const_iterator it = string_items.begin(), end = string_items.end(); for (; it != end; ++it) { - if ((*it)->getType() == type) { - ret = (*it)->getStringValue(); + if ((*it)->type == type) { + ret = (*it)->value; return true; } } @@ -48,20 +59,29 @@ bool Config::getStringValue(Config::ItemType type, string &ret) const } -int Config::getNumberValue(Config::ItemType type) const +bool Config::getNumberValue(Config::NumberType type, int &ret) const { - ItemList::const_iterator it = items.begin(), end = items.end(); + NumberItemList::const_iterator it = number_items.begin(), end = number_items.end(); for (; it != end; ++it) { - if ((*it)->getType() == type) - return (*it)->getNumberValue(); + if ((*it)->type == type) { + ret = (*it)->value; + return true; + } } - return 0; + return false; } -void Config::addOption(ConfigItem *item) +bool Config::getBoolValue(Config::BoolType type, bool &ret) const { - items.push_back(item); + BoolItemList::const_iterator it = bool_items.begin(), end = bool_items.end(); + for (; it != end; ++it) { + if ((*it)->type == type) { + ret = (*it)->type; + return true; + } + } + return false; } @@ -69,21 +89,75 @@ void Config::addOption(const std::string &name, const std::string &value) { const struct { const char *name; - Config::ItemType type; + Config::BoolType type; + } + bool_options[] = { + { "stackedcycling", Config::stackedCycling }, + { "", NUM_BOOL_TYPES } + }; + + const struct { + const char *name; + Config::StringType type; } - options[] = { - { "notype", Config::noType }, - { "chaintimeout", Config::chainTimeout }, - { "workspacecolumns", Config::workspaceColumns }, - { "", numTypes } + string_options[] = { + { "", NUM_STRING_TYPES } }; + const struct { + const char *name; + Config::NumberType type; + } + number_options[] = { + { "chaintimeout", chainTimeout }, + { "workspacecolumns", workspaceColumns }, + { "", NUM_NUMBER_TYPES } + }; + + // if it's bool option, add it to the bool_items list size_t i = 0; - while (options[i].type != numTypes) { - if (strcasecmp(name.c_str(), options[i].name) == 0) { - ConfigItem *item = new ConfigItem(options[i].type, value); - items.push_back(item); - break; + while (bool_options[i].type != NUM_BOOL_TYPES) { + if (strcasecmp(name.c_str(), bool_options[i].name) == 0) { + BoolItem *item = new BoolItem; + const char *tmp = value.c_str(); + + item->type = bool_options[i].type; + + if (strcasecmp(tmp, "true") == 0 || strcasecmp(tmp, "1")) + item->value = true; + else + item->value = false; + + bool_items.push_back(item); + return; + } + i++; + } + + // if it's a string, add it to the string_items list + i = 0; + while (string_options[i].type != NUM_STRING_TYPES) { + if (strcasecmp(name.c_str(), string_options[i].name) == 0) { + StringItem *item = new StringItem; + item->type = string_options[i].type; + item->value = value; + + string_items.push_back(item); + return; + } + i++; + } + + // if it's a number, add it to the number_items list + i = 0; + while (number_options[i].type != NUM_NUMBER_TYPES) { + if (strcasecmp(name.c_str(), number_options[i].name) == 0) { + NumberItem *item = new NumberItem; + item->type = number_options[i].type; + item->value = atoi( value.c_str() ); + + number_items.push_back(item); + return; } i++; } diff --git a/util/epist/config.hh b/util/epist/config.hh index 443834ed..0cb2a1c0 100644 --- a/util/epist/config.hh +++ b/util/epist/config.hh @@ -26,50 +26,63 @@ #include #include -class ConfigItem; +// forward declarations +struct BoolItem; +struct StringItem; +struct NumberItem; class Config { public: - enum ItemType { - noType, + enum BoolType { + NO_BOOL_TYPE, + stackedCycling, + NUM_BOOL_TYPES + }; + + enum StringType { + NO_STRING_TYPE, + NUM_STRING_TYPES + }; + + enum NumberType { + NO_NUMBER_TYPE, chainTimeout, workspaceColumns, - numTypes + NUM_NUMBER_TYPES }; private: - typedef std::list ItemList; - ItemList items; + typedef std::list BoolItemList; + typedef std::list StringItemList; + typedef std::list NumberItemList; + BoolItemList bool_items; + StringItemList string_items; + NumberItemList number_items; public: Config(); ~Config(); - bool getStringValue(Config::ItemType, std::string &) const; - int getNumberValue(Config::ItemType) const; - void addOption(ConfigItem *); + bool getBoolValue(BoolType, bool &) const; + bool getStringValue(StringType, std::string &) const; + bool getNumberValue(NumberType, int &) const; + void addOption(const std::string &, const std::string &); }; +struct BoolItem { + Config::BoolType type; + bool value; +}; -class ConfigItem { -private: - Config::ItemType _type; - std::string _value; - -public: - ConfigItem(Config::ItemType type, std::string value) - : _type(type), _value(value) {} - ~ConfigItem() {} - - inline const std::string &getStringValue() const - { return _value; } - - inline int getNumberValue() const - { return atoi(_value.c_str()); } +struct StringItem { + Config::StringType type; + std::string value; +}; - inline Config::ItemType getType() const - { return _type; } +struct NumberItem { + Config::NumberType type; + int value; }; #endif // __config_hh -- 2.39.2