diff options
Diffstat (limited to 'src/corelib/text/qstringconverter.cpp')
-rw-r--r-- | src/corelib/text/qstringconverter.cpp | 48 |
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() */ |