diff --git a/src/settingsconfig/settingsconfigimpl.cpp b/src/settingsconfig/settingsconfigimpl.cpp index 38c059a..d37fbc9 100644 --- a/src/settingsconfig/settingsconfigimpl.cpp +++ b/src/settingsconfig/settingsconfigimpl.cpp @@ -36,6 +36,36 @@ struct VariantInfo +struct visitor +{ + using IterType = typename std::decay::type; + using ListType = typename std::decay::type; + + SettingsConfigImpl &_reader; + IterType &_iter; + ListType &_list; + + visitor(SettingsConfigImpl &reader, IterType &iter, ListType &list) : + _reader{reader}, + _iter{iter}, + _list{list} + {} + + void process(const SettingsConfigBase::SelectableContrainerInfo &info) const { + if(_reader.isUsable(info)) + ++_iter; + else + _iter = _list.erase(_iter); + } + + void operator()(const SettingsConfigBase::IncludeType &) const { Q_UNREACHABLE(); } + void operator()(const SettingsConfigBase::EntryType &info) const { process(info); } + void operator()(const SettingsConfigBase::GroupType &info) const { process(info); } + void operator()(const SettingsConfigBase::SectionType &info) const { process(info); } + void operator()(const SettingsConfigBase::CategoryType &info) const { process(info); } +}; + } void SettingsConfigImpl::setFilters(QString frontend, const QFileSelector *selector) @@ -106,15 +136,7 @@ void SettingsConfigImpl::finishContents(QXmlStreamReader &reader, TGroup &group) index = it->index(); //erase if not usable due to selectors - bool visited = false; - nonstd::visit([&](auto &&element){ //TODO use trick if neccessary: https://en.cppreference.com/w/cpp/utility/variant/visit - visited = true; - if(isUsable(element)) - ++it; - else - it = group.erase(it); - }, *it); - Q_ASSERT(visited); + nonstd::visit(visitor{*this, it, group}, *it); } } diff --git a/src/settingsconfig/settingsconfigimpl.h b/src/settingsconfig/settingsconfigimpl.h index 881451e..211a5da 100644 --- a/src/settingsconfig/settingsconfigimpl.h +++ b/src/settingsconfig/settingsconfigimpl.h @@ -7,6 +7,9 @@ class QFileSelector; class SettingsConfigImpl : public SettingsConfigBase { +public: + bool isUsable(const SelectableContrainerInfo &element) const; + protected: void setFilters(QString frontend, const QFileSelector *selector); void resetFilters(); @@ -23,8 +26,6 @@ private: template bool readGeneralInclude(QXmlStreamReader &reader, IncludeType include, TIter &it, TList &list); - bool isUsable(const SelectableContrainerInfo &element) const; - QString _frontend; const QFileSelector *_selector = nullptr; bool _alwaysOptional = false;