QSettings: port API from QString to QAnyStringView keys
With the public interface ported to QAnyStringView, we can now internally optimize memory allocations _in a central place_ (e.g. by returning std::u16string or QVarLengthArray<QChar> from normalizeKey() instead of QString). But first we needed to get rid of all the unwarranted allocations in user code. Effects on Linux AMD64 stripped C++20 release builds: GCC 11.2 libstdc++ (TEXT -= 6.5%): text data bss dec hex filename 635148 10992 2824 648964 9e704 tst_qsettings-01-baseline 593691 10992 2824 607507 94513 tst_qsettings-02-qanystringview Clang 10.0.0 libc++ (TEXT -= 11.6%(!)): text data bss dec hex filename 790336 10640 2832 803808 c43e0 tst_qsettings-01-baseline 698572 10640 2832 712044 add6c tst_qsettings-02-qanystringview That's the beauty of QAnyStringView: transparently reducing temporary QString creation; and the simplest code is also the most efficient. [ChangeLog][QtCore][QSettings] Keys can now be passed as QAnyStringView (was: QString). The most efficient way to pass literal keys is now "key"_L1, the backwards-compatible way is QStringLiteral("key"). Fixes: QTBUG-101390 Change-Id: I510fb4ce17ef109dac7c9cdc5d90ede0d1a9db5f Reviewed-by: Edward Welbourne <edward.welbourne@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
parent
a9cef86b8f
commit
4cf299eb5b
@ -214,6 +214,49 @@ void QObject::setObjectName(const QString &name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#include "qsettings.h"
|
||||||
|
|
||||||
|
void QSettings::beginGroup(const QString &prefix)
|
||||||
|
{
|
||||||
|
return beginGroup(qToAnyStringViewIgnoringNull(prefix));
|
||||||
|
}
|
||||||
|
|
||||||
|
int QSettings::beginReadArray(const QString &prefix)
|
||||||
|
{
|
||||||
|
return beginReadArray(qToAnyStringViewIgnoringNull(prefix));
|
||||||
|
}
|
||||||
|
|
||||||
|
void QSettings::beginWriteArray(const QString &prefix, int size)
|
||||||
|
{
|
||||||
|
beginWriteArray(qToAnyStringViewIgnoringNull(prefix), size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QSettings::setValue(const QString &key, const QVariant &value)
|
||||||
|
{
|
||||||
|
setValue(qToAnyStringViewIgnoringNull(key), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QSettings::remove(const QString &key)
|
||||||
|
{
|
||||||
|
remove(qToAnyStringViewIgnoringNull(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QSettings::contains(const QString &key) const
|
||||||
|
{
|
||||||
|
return contains(qToAnyStringViewIgnoringNull(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant QSettings::value(const QString &key, const QVariant &defaultValue) const
|
||||||
|
{
|
||||||
|
return value(qToAnyStringViewIgnoringNull(key), defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant QSettings::value(const QString &key) const
|
||||||
|
{
|
||||||
|
return value(qToAnyStringViewIgnoringNull(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#include "qversionnumber.h"
|
#include "qversionnumber.h"
|
||||||
|
|
||||||
QT_WARNING_PUSH
|
QT_WARNING_PUSH
|
||||||
|
@ -2914,9 +2914,12 @@ void QSettings::setAtomicSyncRequired(bool enable)
|
|||||||
Call endGroup() to reset the current group to what it was before
|
Call endGroup() to reset the current group to what it was before
|
||||||
the corresponding beginGroup() call. Groups can be nested.
|
the corresponding beginGroup() call. Groups can be nested.
|
||||||
|
|
||||||
|
\note In Qt versions prior to 6.4, this function took QString, not
|
||||||
|
QAnyStringView.
|
||||||
|
|
||||||
\sa endGroup(), group()
|
\sa endGroup(), group()
|
||||||
*/
|
*/
|
||||||
void QSettings::beginGroup(const QString &prefix)
|
void QSettings::beginGroup(QAnyStringView prefix)
|
||||||
{
|
{
|
||||||
Q_D(QSettings);
|
Q_D(QSettings);
|
||||||
d->beginGroupOrArray(QSettingsGroup(d->normalizedKey(prefix)));
|
d->beginGroupOrArray(QSettingsGroup(d->normalizedKey(prefix)));
|
||||||
@ -2970,9 +2973,12 @@ QString QSettings::group() const
|
|||||||
|
|
||||||
Use beginWriteArray() to write the array in the first place.
|
Use beginWriteArray() to write the array in the first place.
|
||||||
|
|
||||||
|
\note In Qt versions prior to 6.4, this function took QString, not
|
||||||
|
QAnyStringView.
|
||||||
|
|
||||||
\sa beginWriteArray(), endArray(), setArrayIndex()
|
\sa beginWriteArray(), endArray(), setArrayIndex()
|
||||||
*/
|
*/
|
||||||
int QSettings::beginReadArray(const QString &prefix)
|
int QSettings::beginReadArray(QAnyStringView prefix)
|
||||||
{
|
{
|
||||||
Q_D(QSettings);
|
Q_D(QSettings);
|
||||||
d->beginGroupOrArray(QSettingsGroup(d->normalizedKey(prefix), false));
|
d->beginGroupOrArray(QSettingsGroup(d->normalizedKey(prefix), false));
|
||||||
@ -3006,9 +3012,12 @@ int QSettings::beginReadArray(const QString &prefix)
|
|||||||
|
|
||||||
To read back an array, use beginReadArray().
|
To read back an array, use beginReadArray().
|
||||||
|
|
||||||
|
\note In Qt versions prior to 6.4, this function took QString, not
|
||||||
|
QAnyStringView.
|
||||||
|
|
||||||
\sa beginReadArray(), endArray(), setArrayIndex()
|
\sa beginReadArray(), endArray(), setArrayIndex()
|
||||||
*/
|
*/
|
||||||
void QSettings::beginWriteArray(const QString &prefix, int size)
|
void QSettings::beginWriteArray(QAnyStringView prefix, int size)
|
||||||
{
|
{
|
||||||
Q_D(QSettings);
|
Q_D(QSettings);
|
||||||
d->beginGroupOrArray(QSettingsGroup(d->normalizedKey(prefix), size < 0));
|
d->beginGroupOrArray(QSettingsGroup(d->normalizedKey(prefix), size < 0));
|
||||||
@ -3169,9 +3178,12 @@ bool QSettings::isWritable() const
|
|||||||
|
|
||||||
\snippet code/src_corelib_io_qsettings.cpp 23
|
\snippet code/src_corelib_io_qsettings.cpp 23
|
||||||
|
|
||||||
|
\note In Qt versions prior to 6.4, this function took QString, not
|
||||||
|
QAnyStringView.
|
||||||
|
|
||||||
\sa value(), remove(), contains()
|
\sa value(), remove(), contains()
|
||||||
*/
|
*/
|
||||||
void QSettings::setValue(const QString &key, const QVariant &value)
|
void QSettings::setValue(QAnyStringView key, const QVariant &value)
|
||||||
{
|
{
|
||||||
Q_D(QSettings);
|
Q_D(QSettings);
|
||||||
if (key.isEmpty()) {
|
if (key.isEmpty()) {
|
||||||
@ -3203,9 +3215,12 @@ void QSettings::setValue(const QString &key, const QVariant &value)
|
|||||||
case-sensitive keys. To avoid portability problems, see the
|
case-sensitive keys. To avoid portability problems, see the
|
||||||
\l{Section and Key Syntax} rules.
|
\l{Section and Key Syntax} rules.
|
||||||
|
|
||||||
|
\note In Qt versions prior to 6.4, this function took QString, not
|
||||||
|
QAnyStringView.
|
||||||
|
|
||||||
\sa setValue(), value(), contains()
|
\sa setValue(), value(), contains()
|
||||||
*/
|
*/
|
||||||
void QSettings::remove(const QString &key)
|
void QSettings::remove(QAnyStringView key)
|
||||||
{
|
{
|
||||||
Q_D(QSettings);
|
Q_D(QSettings);
|
||||||
/*
|
/*
|
||||||
@ -3238,9 +3253,12 @@ void QSettings::remove(const QString &key)
|
|||||||
case-sensitive keys. To avoid portability problems, see the
|
case-sensitive keys. To avoid portability problems, see the
|
||||||
\l{Section and Key Syntax} rules.
|
\l{Section and Key Syntax} rules.
|
||||||
|
|
||||||
|
\note In Qt versions prior to 6.4, this function took QString, not
|
||||||
|
QAnyStringView.
|
||||||
|
|
||||||
\sa value(), setValue()
|
\sa value(), setValue()
|
||||||
*/
|
*/
|
||||||
bool QSettings::contains(const QString &key) const
|
bool QSettings::contains(QAnyStringView key) const
|
||||||
{
|
{
|
||||||
Q_D(const QSettings);
|
Q_D(const QSettings);
|
||||||
return d->get(d->actualKey(key)) != std::nullopt;
|
return d->get(d->actualKey(key)) != std::nullopt;
|
||||||
@ -3288,8 +3306,8 @@ bool QSettings::event(QEvent *event)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn QSettings::value(const QString &key) const
|
\fn QSettings::value(QAnyStringView key) const
|
||||||
\fn QSettings::value(const QString &key, const QVariant &defaultValue) const
|
\fn QSettings::value(QAnyStringView key, const QVariant &defaultValue) const
|
||||||
|
|
||||||
Returns the value for setting \a key. If the setting doesn't
|
Returns the value for setting \a key. If the setting doesn't
|
||||||
exist, returns \a defaultValue.
|
exist, returns \a defaultValue.
|
||||||
@ -3306,15 +3324,18 @@ bool QSettings::event(QEvent *event)
|
|||||||
|
|
||||||
\snippet code/src_corelib_io_qsettings.cpp 26
|
\snippet code/src_corelib_io_qsettings.cpp 26
|
||||||
|
|
||||||
|
\note In Qt versions prior to 6.4, this function took QString, not
|
||||||
|
QAnyStringView.
|
||||||
|
|
||||||
\sa setValue(), contains(), remove()
|
\sa setValue(), contains(), remove()
|
||||||
*/
|
*/
|
||||||
QVariant QSettings::value(const QString &key) const
|
QVariant QSettings::value(QAnyStringView key) const
|
||||||
{
|
{
|
||||||
Q_D(const QSettings);
|
Q_D(const QSettings);
|
||||||
return d->value(key, nullptr);
|
return d->value(key, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariant QSettings::value(const QString &key, const QVariant &defaultValue) const
|
QVariant QSettings::value(QAnyStringView key, const QVariant &defaultValue) const
|
||||||
{
|
{
|
||||||
Q_D(const QSettings);
|
Q_D(const QSettings);
|
||||||
return d->value(key, &defaultValue);
|
return d->value(key, &defaultValue);
|
||||||
|
@ -148,12 +148,19 @@ public:
|
|||||||
bool isAtomicSyncRequired() const;
|
bool isAtomicSyncRequired() const;
|
||||||
void setAtomicSyncRequired(bool enable);
|
void setAtomicSyncRequired(bool enable);
|
||||||
|
|
||||||
|
#if QT_CORE_REMOVED_SINCE(6, 4)
|
||||||
void beginGroup(const QString &prefix);
|
void beginGroup(const QString &prefix);
|
||||||
|
#endif
|
||||||
|
void beginGroup(QAnyStringView prefix);
|
||||||
void endGroup();
|
void endGroup();
|
||||||
QString group() const;
|
QString group() const;
|
||||||
|
|
||||||
|
#if QT_CORE_REMOVED_SINCE(6, 4)
|
||||||
int beginReadArray(const QString &prefix);
|
int beginReadArray(const QString &prefix);
|
||||||
void beginWriteArray(const QString &prefix, int size = -1);
|
void beginWriteArray(const QString &prefix, int size = -1);
|
||||||
|
#endif
|
||||||
|
int beginReadArray(QAnyStringView prefix);
|
||||||
|
void beginWriteArray(QAnyStringView prefix, int size = -1);
|
||||||
void endArray();
|
void endArray();
|
||||||
void setArrayIndex(int i);
|
void setArrayIndex(int i);
|
||||||
|
|
||||||
@ -162,12 +169,21 @@ public:
|
|||||||
QStringList childGroups() const;
|
QStringList childGroups() const;
|
||||||
bool isWritable() const;
|
bool isWritable() const;
|
||||||
|
|
||||||
|
#if QT_CORE_REMOVED_SINCE(6, 4)
|
||||||
void setValue(const QString &key, const QVariant &value);
|
void setValue(const QString &key, const QVariant &value);
|
||||||
QVariant value(const QString &key, const QVariant &defaultValue) const;
|
QVariant value(const QString &key, const QVariant &defaultValue) const;
|
||||||
QVariant value(const QString &key) const;
|
QVariant value(const QString &key) const;
|
||||||
|
#endif
|
||||||
|
void setValue(QAnyStringView key, const QVariant &value);
|
||||||
|
QVariant value(QAnyStringView key, const QVariant &defaultValue) const;
|
||||||
|
QVariant value(QAnyStringView key) const;
|
||||||
|
|
||||||
|
#if QT_CORE_REMOVED_SINCE(6, 4)
|
||||||
void remove(const QString &key);
|
void remove(const QString &key);
|
||||||
bool contains(const QString &key) const;
|
bool contains(const QString &key) const;
|
||||||
|
#endif
|
||||||
|
void remove(QAnyStringView key);
|
||||||
|
bool contains(QAnyStringView key) const;
|
||||||
|
|
||||||
void setFallbacksEnabled(bool b);
|
void setFallbacksEnabled(bool b);
|
||||||
bool fallbacksEnabled() const;
|
bool fallbacksEnabled() const;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user