summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/corelib/global/qlibraryinfo.cpp72
-rw-r--r--src/corelib/tools/qoffsetstringarray_p.h20
2 files changed, 49 insertions, 43 deletions
diff --git a/src/corelib/global/qlibraryinfo.cpp b/src/corelib/global/qlibraryinfo.cpp
index a2bf7599fe..b77df87f91 100644
--- a/src/corelib/global/qlibraryinfo.cpp
+++ b/src/corelib/global/qlibraryinfo.cpp
@@ -304,35 +304,6 @@ QVersionNumber QLibraryInfo::version() noexcept
return QVersionNumber(QT_VERSION_MAJOR, QT_VERSION_MINOR, QT_VERSION_PATCH);
}
-/*
- * To add a new entry in QLibraryInfo::LibraryPath, add it to the enum
- * in qtbase/src/corelib/global/qlibraryinfo.h and:
- * - add its relative path in the qtConfEntries[] array below
- * (the key is what appears in a qt.conf file)
- */
-
-static const struct {
- char key[19], value[13];
-} qtConfEntries[] = {
- { "Prefix", "." },
- { "Documentation", "doc" }, // should be ${Data}/doc
- { "Headers", "include" },
- { "Libraries", "lib" },
-#ifdef Q_OS_WIN
- { "LibraryExecutables", "bin" },
-#else
- { "LibraryExecutables", "libexec" }, // should be ${ArchData}/libexec
-#endif
- { "Binaries", "bin" },
- { "Plugins", "plugins" }, // should be ${ArchData}/plugins
- { "Qml2Imports", "qml" }, // should be ${ArchData}/qml
- { "ArchData", "." },
- { "Data", "." },
- { "Translations", "translations" }, // should be ${Data}/translations
- { "Examples", "examples" },
- { "Tests", "tests" },
-};
-
static QString prefixFromAppDirHelper()
{
QString appDir;
@@ -515,17 +486,44 @@ static QString getPrefix()
void QLibraryInfoPrivate::keyAndDefault(QLibraryInfo::LibraryPath loc, QString *key,
QString *value)
{
- if (unsigned(loc) < sizeof(qtConfEntries)/sizeof(qtConfEntries[0])) {
- *key = QLatin1String(qtConfEntries[loc].key);
- *value = QLatin1String(qtConfEntries[loc].value);
- }
+ /*
+ * To add a new entry in QLibraryInfo::LibraryPath, add it to the enum
+ * in qtbase/src/corelib/global/qlibraryinfo.h and:
+ * - add its relative path in the qtConfEntries[] array below
+ * (the key is what appears in a qt.conf file)
+ */
+ static constexpr auto qtConfEntries = qOffsetStringArray(
+ "Prefix", ".",
+ "Documentation", "doc", // should be ${Data}/doc
+ "Headers", "include",
+ "Libraries", "lib",
+#ifdef Q_OS_WIN
+ "LibraryExecutables", "bin",
+#else
+ "LibraryExecutables", "libexec", // should be ${ArchData}/libexec
+#endif
+ "Binaries", "bin",
+ "Plugins", "plugins", // should be ${ArchData}/plugins
+ "Qml2Imports", "qml", // should be ${ArchData}/qml
+ "ArchData", ".",
+ "Data", ".",
+ "Translations", "translations", // should be ${Data}/translations
+ "Examples", "examples",
+ "Tests", "tests"
+ );
+ static constexpr QByteArrayView dot = qtConfEntries.viewAt(1);
+ static_assert(dot.size() == 1);
+ static_assert(dot[0] == '.');
+
+ if (int(loc) < qtConfEntries.count()) {
+ *key = QLatin1String(qtConfEntries.viewAt(loc * 2));
+ *value = QLatin1String(qtConfEntries.viewAt(loc * 2 + 1));
#ifndef Q_OS_WIN // On Windows we use the registry
- else if (loc == QLibraryInfo::SettingsPath) {
+ } else if (loc == QLibraryInfo::SettingsPath) {
*key = QLatin1String("Settings");
- *value = QLatin1String(".");
- }
+ *value = QLatin1String(dot);
#endif
- else {
+ } else {
key->clear();
value->clear();
}
diff --git a/src/corelib/tools/qoffsetstringarray_p.h b/src/corelib/tools/qoffsetstringarray_p.h
index 607f13d662..8bd7d79afb 100644
--- a/src/corelib/tools/qoffsetstringarray_p.h
+++ b/src/corelib/tools/qoffsetstringarray_p.h
@@ -54,9 +54,11 @@
#include "private/qglobal_p.h"
+#include <QByteArrayView>
+
#include <array>
#include <limits>
-#include <string>
+#include <string_view>
#include <tuple>
class tst_QOffsetStringArray;
@@ -80,7 +82,7 @@ public:
constexpr const char *operator[](const int index) const noexcept
{
- return m_string.data() + m_offsets[qBound(int(0), index, count() - 1)];
+ return m_string.data() + m_offsets[qBound(int(0), index, count())];
}
constexpr const char *at(const int index) const noexcept
@@ -88,7 +90,13 @@ public:
return m_string.data() + m_offsets[index];
}
- constexpr int count() const { return int(m_offsets.size()); }
+ constexpr QByteArrayView viewAt(qsizetype index) const noexcept
+ {
+ return { m_string.data() + m_offsets[index],
+ qsizetype(m_offsets[index + 1]) - qsizetype(m_offsets[index]) - 1 };
+ }
+
+ constexpr int count() const { return int(m_offsets.size()) - 1; }
private:
StaticString m_string;
@@ -162,9 +170,9 @@ constexpr auto qOffsetStringArray(StringExtractor extractString, const T &... en
size_t offset = 0;
std::array fullOffsetList = { offset += sizeof(extractString(T{}))... };
- // prepend zero, drop last element
- std::array<MinifiedOffsetType, Count> minifiedOffsetList = {};
- QtPrivate::copyData(fullOffsetList.begin(), Count - 1, minifiedOffsetList.begin() + 1);
+ // prepend zero
+ std::array<MinifiedOffsetType, Count + 1> minifiedOffsetList = {};
+ QtPrivate::copyData(fullOffsetList.begin(), Count, minifiedOffsetList.begin() + 1);
std::array staticString = QtPrivate::makeStaticString<StringLength>(extractString, entries...);
return QOffsetStringArray(staticString, minifiedOffsetList);