From b3e90ac833424ef21a0f8947f74aa3ed445e16e1 Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Mon, 20 Aug 2018 07:28:45 +0900 Subject: Settings: get<>(); pass arguments more efficiently Settings::get() and SettingsGroup::get() allow concise and efficient type-specific interface to value(); instead of wrapping your defaultValue into a QVariant, just pass it to get() instead of value(). --- lib/settings.h | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/lib/settings.h b/lib/settings.h index 27ec9ba5..0b3ecaff 100644 --- a/lib/settings.h +++ b/lib/settings.h @@ -51,6 +51,15 @@ namespace QMatrixClient const QVariant &value); Q_INVOKABLE QVariant value(const QString &key, const QVariant &defaultValue = {}) const; + + template + T get(const QString& key, const T& defaultValue = {}) const + { + const auto qv = value(key, QVariant()); + return qv.isValid() && qv.canConvert() ? qv.value() + : defaultValue; + } + Q_INVOKABLE bool contains(const QString& key) const; Q_INVOKABLE QStringList childGroups() const; @@ -67,14 +76,23 @@ namespace QMatrixClient { public: template - explicit SettingsGroup(const QString& path, ArgTs... qsettingsArgs) - : Settings(qsettingsArgs...) - , groupPath(path) + explicit SettingsGroup(QString path, ArgTs&&... qsettingsArgs) + : Settings(std::forward(qsettingsArgs)...) + , groupPath(std::move(path)) { } Q_INVOKABLE bool contains(const QString& key) const; Q_INVOKABLE QVariant value(const QString &key, const QVariant &defaultValue = {}) const; + + template + T get(const QString& key, const T& defaultValue = {}) const + { + const auto qv = value(key, QVariant()); + return qv.isValid() && qv.canConvert() ? qv.value() + : defaultValue; + } + Q_INVOKABLE QString group() const; Q_INVOKABLE QStringList childGroups() const; Q_INVOKABLE void setValue(const QString &key, @@ -96,7 +114,7 @@ namespace QMatrixClient #define QMC_DEFINE_SETTING(classname, type, propname, qsettingname, defaultValue, setter) \ type classname::propname() const \ { \ - return value(QStringLiteral(qsettingname), defaultValue).value(); \ + return get(QStringLiteral(qsettingname), defaultValue); \ } \ \ void classname::setter(type newValue) \ -- cgit v1.2.3