Change Layer code not to create superfluous std::optional entries in LayerMap

This commit is contained in:
Silent 2019-07-30 18:43:54 +02:00
parent cb4eecde52
commit 48a4b62125
No known key found for this signature in database
GPG Key ID: AE53149BB0C45AF1
2 changed files with 17 additions and 11 deletions

View File

@ -46,8 +46,14 @@ bool Layer::Exists(const ConfigLocation& location) const
bool Layer::DeleteKey(const ConfigLocation& location) bool Layer::DeleteKey(const ConfigLocation& location)
{ {
m_is_dirty = true; m_is_dirty = true;
bool had_value = m_map[location].has_value(); bool had_value = false;
m_map[location].reset(); const auto iter = m_map.find(location);
if (iter != m_map.end() && iter->second.has_value())
{
iter->second.reset();
had_value = true;
}
return had_value; return had_value;
} }

View File

@ -103,18 +103,18 @@ public:
void DeleteAllKeys(); void DeleteAllKeys();
template <typename T> template <typename T>
T Get(const ConfigInfo<T>& config_info) T Get(const ConfigInfo<T>& config_info) const
{ {
return Get<T>(config_info.location).value_or(config_info.default_value); return Get<T>(config_info.location).value_or(config_info.default_value);
} }
template <typename T> template <typename T>
std::optional<T> Get(const ConfigLocation& location) std::optional<T> Get(const ConfigLocation& location) const
{ {
const std::optional<std::string>& str_value = m_map[location]; const auto iter = m_map.find(location);
if (!str_value) if (iter == m_map.end() || !iter->second.has_value())
return std::nullopt; return std::nullopt;
return detail::TryParse<T>(*str_value); return detail::TryParse<T>(*iter->second);
} }
template <typename T> template <typename T>
@ -129,13 +129,13 @@ public:
Set(location, ValueToString(value)); Set(location, ValueToString(value));
} }
void Set(const ConfigLocation& location, const std::string& new_value) void Set(const ConfigLocation& location, std::string new_value)
{ {
std::optional<std::string>& current_value = m_map[location]; const auto iter = m_map.find(location);
if (current_value == new_value) if (iter != m_map.end() && iter->second == new_value)
return; return;
m_is_dirty = true; m_is_dirty = true;
current_value = new_value; m_map.insert_or_assign(location, std::move(new_value));
} }
Section GetSection(System system, const std::string& section); Section GetSection(System system, const std::string& section);