diff options
author | Marc Mutz <marc.mutz@qt.io> | 2022-02-18 09:01:08 +0100 |
---|---|---|
committer | Marc Mutz <marc.mutz@qt.io> | 2022-02-20 16:22:50 +0100 |
commit | 29b18a017968cbc79dfcd21ea1622de823dc1596 (patch) | |
tree | 88a331457654d73142a3081848c47042e6bcecaa /src/corelib | |
parent | d49f5752a560d7c8fec99c57bbfb192a9be1b296 (diff) |
QSettings: overload value() instead of using a default argument
... of non-trivial type, which needs to be constructed every time the
function is called, no matter whether the user supplies one or not.
Effects on Linux AMD64 O2 C++20 tst_qsettings builds, as an example
heavy-duty QSettings::value() user:
GCC 11.2 libstdc++ (TEXT -= 4.6%):
text data bss dec hex filename
662317 10952 2824 676093 a50fd tst_qsettings-00-baseline
631849 10960 2824 645633 9da01 tst_qsettings-01-qvariant
Clang 10.0.0 libc++ (TEXT -= 2.8%)
text data bss dec hex filename
808448 10616 2832 821896 c8a88 tst_qsettings-00-baseline
785890 10624 2832 799346 c3272 tst_qsettings-01-qvariant
Pick-to: 6.3
Task-number: QTBUG-98117
Change-Id: I7366f063e3ec34c040fd35ffd274e8ed5a722132
Reviewed-by: Kai Koehne <kai.koehne@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Diffstat (limited to 'src/corelib')
-rw-r--r-- | src/corelib/io/qsettings.cpp | 20 | ||||
-rw-r--r-- | src/corelib/io/qsettings.h | 3 | ||||
-rw-r--r-- | src/corelib/io/qsettings_p.h | 1 |
3 files changed, 22 insertions, 2 deletions
diff --git a/src/corelib/io/qsettings.cpp b/src/corelib/io/qsettings.cpp index 1d6f2dc912..34f07096eb 100644 --- a/src/corelib/io/qsettings.cpp +++ b/src/corelib/io/qsettings.cpp @@ -3254,6 +3254,9 @@ bool QSettings::event(QEvent *event) #endif /*! + \fn QSettings::value(const QString &key) const + \fn QSettings::value(const QString &key, const QVariant &defaultValue) const + Returns the value for setting \a key. If the setting doesn't exist, returns \a defaultValue. @@ -3271,14 +3274,29 @@ bool QSettings::event(QEvent *event) \sa setValue(), contains(), remove() */ +QVariant QSettings::value(const QString &key) const +{ + Q_D(const QSettings); + return d->value(key, nullptr); +} + QVariant QSettings::value(const QString &key, const QVariant &defaultValue) const { Q_D(const QSettings); + return d->value(key, &defaultValue); +} + +QVariant QSettingsPrivate::value(const QString &key, const QVariant *defaultValue) const +{ if (key.isEmpty()) { qWarning("QSettings::value: Empty key passed"); return QVariant(); } - return d->get(d->actualKey(key)).value_or(defaultValue); + if (std::optional r = get(actualKey(key))) + return std::move(*r); + if (defaultValue) + return *defaultValue; + return QVariant(); } /*! diff --git a/src/corelib/io/qsettings.h b/src/corelib/io/qsettings.h index 05b30b562b..42b2527f0b 100644 --- a/src/corelib/io/qsettings.h +++ b/src/corelib/io/qsettings.h @@ -163,7 +163,8 @@ public: bool isWritable() const; void setValue(const QString &key, const QVariant &value); - QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const; + QVariant value(const QString &key, const QVariant &defaultValue) const; + QVariant value(const QString &key) const; void remove(const QString &key); bool contains(const QString &key) const; diff --git a/src/corelib/io/qsettings_p.h b/src/corelib/io/qsettings_p.h index ddcbe0f76c..4849975f2a 100644 --- a/src/corelib/io/qsettings_p.h +++ b/src/corelib/io/qsettings_p.h @@ -208,6 +208,7 @@ public: virtual bool isWritable() const = 0; virtual QString fileName() const = 0; + QVariant value(const QString &key, const QVariant *defaultValue) const; QString actualKey(const QString &key) const; void beginGroupOrArray(const QSettingsGroup &group); void setStatus(QSettings::Status status) const; |