SettingItem Setting::GetItem(string key) { auto itm = items.find(key); if (itm != items.end()) { return itm->second; } return SettingItem(); }
void Setting::LoadFromXml(xml_node& node) { name = node.attribute("name").as_string(""); for (auto itemNode : node.children("item")) { SettingItem item = SettingItem(); item.key = itemNode.attribute("key").as_string(""); auto value = itemNode.attribute("value"); if (value) { // single string <item key="abc" value="def" /> item.AddValues(value.as_string("")); } else { /* more xml elements: <item key="abc"> <value>val1</value> <value>val2</value> </item> */ for (auto valueNode : itemNode.children("value")) { string val = valueNode.value(); item.AddValues(val); } } items[item.key] = item; } // items may be declared as attributes, e.g. <setting name="myset" key1="value1" key2="value2" /> for (auto attrNode : node.attributes()) { auto attrName = attrNode.name(); if (string(attrName).compare("name") != 0) { string val = attrNode.value(); items[attrName] = SettingItem(attrName, val); } } }
void add(const std::string &lk, const std::string &k, const std::string &desc, T&& default_value) { if (lk.empty()) { throw std::runtime_error("key is empty: " + k); } if (m_Items.find(lk) != m_Items.end()) { throw std::runtime_error("options key already registered: " + lk); } m_Items[lk] = SettingItem(lk, k, desc, std::forward<T>(default_value)); }
void Setting::AddItem(string key, string value) { SettingItem newItem = SettingItem(key, value); items[key] = newItem; }