From 88a6ecabae77854092a13e5cff070c62e6afaedf Mon Sep 17 00:00:00 2001 From: elsid Date: Wed, 15 Nov 2023 08:11:49 +0100 Subject: [PATCH] Add lookup index to editor settings category Prevent adding duplicate settings there. --- apps/opencs/model/prefs/category.cpp | 12 ++++++++---- apps/opencs/model/prefs/category.hpp | 2 ++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/apps/opencs/model/prefs/category.cpp b/apps/opencs/model/prefs/category.cpp index 5a82be08fc..9c8923f042 100644 --- a/apps/opencs/model/prefs/category.cpp +++ b/apps/opencs/model/prefs/category.cpp @@ -24,6 +24,9 @@ CSMPrefs::State* CSMPrefs::Category::getState() const void CSMPrefs::Category::addSetting(Setting* setting) { + if (!mIndex.emplace(setting->getKey(), setting).second) + throw std::logic_error("Category " + mKey + " already has setting: " + setting->getKey()); + mSettings.push_back(setting); } @@ -39,11 +42,12 @@ CSMPrefs::Category::Iterator CSMPrefs::Category::end() CSMPrefs::Setting& CSMPrefs::Category::operator[](const std::string& key) { - for (Iterator iter = mSettings.begin(); iter != mSettings.end(); ++iter) - if ((*iter)->getKey() == key) - return **iter; + const auto it = mIndex.find(key); - throw std::logic_error("Invalid user setting: " + key); + if (it != mIndex.end()) + return *it->second; + + throw std::logic_error("Invalid user setting in " + mKey + " category: " + key); } void CSMPrefs::Category::update() diff --git a/apps/opencs/model/prefs/category.hpp b/apps/opencs/model/prefs/category.hpp index 5c75f99067..19b559b384 100644 --- a/apps/opencs/model/prefs/category.hpp +++ b/apps/opencs/model/prefs/category.hpp @@ -3,6 +3,7 @@ #include #include +#include #include namespace CSMPrefs @@ -20,6 +21,7 @@ namespace CSMPrefs State* mParent; std::string mKey; Container mSettings; + std::unordered_map mIndex; public: Category(State* parent, const std::string& key);