Browse Source

use non-auto visitor

pull/2/head
Skycoder42 7 years ago
parent
commit
daeb9ea07b
No known key found for this signature in database GPG Key ID: 8E01AD9EF0578D2B
  1. 40
      src/settingsconfig/settingsconfigimpl.cpp
  2. 5
      src/settingsconfig/settingsconfigimpl.h

40
src/settingsconfig/settingsconfigimpl.cpp

@ -36,6 +36,36 @@ struct VariantInfo<QList<SettingsConfigBase::variant<SettingsConfigBase::Include
} }
}; };
template <typename TIter, typename TList>
struct visitor
{
using IterType = typename std::decay<TIter>::type;
using ListType = typename std::decay<TList>::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) void SettingsConfigImpl::setFilters(QString frontend, const QFileSelector *selector)
@ -106,15 +136,7 @@ void SettingsConfigImpl::finishContents(QXmlStreamReader &reader, TGroup &group)
index = it->index(); index = it->index();
//erase if not usable due to selectors //erase if not usable due to selectors
bool visited = false; nonstd::visit(visitor<decltype(it), decltype(group)>{*this, it, group}, *it);
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);
} }
} }

5
src/settingsconfig/settingsconfigimpl.h

@ -7,6 +7,9 @@ class QFileSelector;
class SettingsConfigImpl : public SettingsConfigBase class SettingsConfigImpl : public SettingsConfigBase
{ {
public:
bool isUsable(const SelectableContrainerInfo &element) const;
protected: protected:
void setFilters(QString frontend, const QFileSelector *selector); void setFilters(QString frontend, const QFileSelector *selector);
void resetFilters(); void resetFilters();
@ -23,8 +26,6 @@ private:
template <typename TIter, typename TList> template <typename TIter, typename TList>
bool readGeneralInclude(QXmlStreamReader &reader, IncludeType include, TIter &it, TList &list); bool readGeneralInclude(QXmlStreamReader &reader, IncludeType include, TIter &it, TList &list);
bool isUsable(const SelectableContrainerInfo &element) const;
QString _frontend; QString _frontend;
const QFileSelector *_selector = nullptr; const QFileSelector *_selector = nullptr;
bool _alwaysOptional = false; bool _alwaysOptional = false;

Loading…
Cancel
Save