summaryrefslogtreecommitdiffstats
path: root/src/corelib/text/qstringconverter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/text/qstringconverter.cpp')
-rw-r--r--src/corelib/text/qstringconverter.cpp48
1 files changed, 38 insertions, 10 deletions
diff --git a/src/corelib/text/qstringconverter.cpp b/src/corelib/text/qstringconverter.cpp
index 565e3e598b..9fc3318d71 100644
--- a/src/corelib/text/qstringconverter.cpp
+++ b/src/corelib/text/qstringconverter.cpp
@@ -1910,20 +1910,37 @@ const QStringConverter::Interface QStringConverter::encodingInterfaces[QStringCo
};
// match names case insensitive and skipping '-' and '_'
-static bool nameMatch(const char *a, const char *b)
+static bool nameMatch_impl(const char *a, QLatin1StringView rhs)
{
+ const char *b = rhs.data();
+ const char *b_end = rhs.end();
do {
while (*a == '-' || *a == '_')
++a;
- while (*b == '-' || *b == '_')
+ while (b != b_end && (*b == '-' || *b == '_'))
++b;
- if (!*a && !*b) // end of both strings
+ if (!*a && b == b_end) // end of both strings
return true;
} while (QtMiscUtils::toAsciiLower(*a++) == QtMiscUtils::toAsciiLower(*b++));
return false;
}
+static bool nameMatch_impl(const char *a, QUtf8StringView b)
+{
+ return nameMatch_impl(a, QLatin1StringView{QByteArrayView{b}});
+}
+
+static bool nameMatch_impl(const char *a, QStringView b)
+{
+ return nameMatch_impl(a, QLatin1StringView{b.toString().toLatin1()}); // ### optimize
+}
+
+static bool nameMatch(const char *a, QAnyStringView b)
+{
+ return b.visit([a](auto b) { return nameMatch_impl(a, b); });
+}
+
/*!
\fn constexpr QStringConverter::QStringConverter()
@@ -2129,6 +2146,10 @@ struct QStringConverterICU : QStringConverter
return conv;
}
+ static const QStringConverter::Interface *
+ make_icu_converter(QStringConverterBase::State *state, QAnyStringView name)
+ { return make_icu_converter(state, name.toString().toLatin1().constData()); } // ### optimize
+
static const QStringConverter::Interface *make_icu_converter(
QStringConverterBase::State *state,
const char *name)
@@ -2166,7 +2187,7 @@ struct QStringConverterICU : QStringConverter
/*!
\internal
*/
-QStringConverter::QStringConverter(const char *name, Flags f)
+QStringConverter::QStringConverter(QAnyStringView name, Flags f)
: iface(nullptr), state(f)
{
auto e = encodingForName(name);
@@ -2237,17 +2258,18 @@ const char *QStringConverter::name() const noexcept
the QStringConverter constructor when Qt is built with ICU, if ICU provides a
converter with the given name.
- \a name is expected to be UTF-8 encoded.
+ \note In Qt versions prior to 6.8, this function took only a \c{const char *},
+ which was expected to be UTF-8-encoded.
*/
-std::optional<QStringConverter::Encoding> QStringConverter::encodingForName(const char *name) noexcept
+std::optional<QStringConverter::Encoding> QStringConverter::encodingForName(QAnyStringView name) noexcept
{
- if (!name)
+ if (name.isEmpty())
return std::nullopt;
for (qsizetype i = 0; i < LastEncoding + 1; ++i) {
if (nameMatch(encodingInterfaces[i].name, name))
return QStringConverter::Encoding(i);
}
- if (nameMatch(name, "latin1"))
+ if (nameMatch("latin1", name))
return QStringConverter::Latin1;
return std::nullopt;
}
@@ -2501,11 +2523,14 @@ const char *QStringConverter::nameForEncoding(QStringConverter::Encoding e)
*/
/*!
- \fn constexpr QStringEncoder::QStringEncoder(const char *name, Flags flags = Flag::Default)
+ \fn QStringEncoder::QStringEncoder(QAnyStringView name, Flags flags = Flag::Default)
Creates an encoder object using \a name and \a flags.
If \a name is not the name of a known encoding an invalid converter will get created.
+ \note In Qt versions prior to 6.8, this function took only a \c{const char *},
+ which was expected to be UTF-8-encoded.
+
\sa isValid()
*/
@@ -2592,11 +2617,14 @@ const char *QStringConverter::nameForEncoding(QStringConverter::Encoding e)
*/
/*!
- \fn constexpr QStringDecoder::QStringDecoder(const char *name, Flags flags = Flag::Default)
+ \fn QStringDecoder::QStringDecoder(QAnyStringView name, Flags flags = Flag::Default)
Creates an decoder object using \a name and \a flags.
If \a name is not the name of a known encoding an invalid converter will get created.
+ \note In Qt versions prior to 6.8, this function took only a \c{const char *},
+ which was expected to be UTF-8-encoded.
+
\sa isValid()
*/