From cce7e35253aa63191f0211b509784b1dc96d49e5 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Fri, 21 Jan 2022 18:06:24 +0100 Subject: Q(Static)ByteArrayMatcher: manage indexIn() overloads Unlike QString and QStringView, QByteArrayView and QByteArray don't overload well. Solve the overload issue the usual way: by making the QByteArray one a Q_WEAK_OVERLOAD. This is trivial for QStaticByteArrayMatcher, which isn't exported, but require QT_REMOVED_SINCE magic for QByteArrayMatcher, which is. The additional const char* overload has shielded us from the worst fall-out so far, it seems, but it makes for a truly horrible overload set: matcher.indexIn(str, 3); Q: Is the 3 here the length of the haystack or the value of the from parameter? A: It depends on decltype(str)! If the (const char*, qsizetype, qsizetype=0) overload is the better match, then 3 limits the haystack's length. If, otoh, the (QByteArray(View), qsizetype) overload is the better match, then it's the value of the from parameter. As if this wasn't bad enough, QByteArray implcitly converts to const char* by default! A follow-up patch will therefore deprecate the (ptr, size) overloads, so we de-inline the QByteArrayView ones to avoid having to touch the implementation once more. Found during 6.3 API review. Pick-to: 6.3 Change-Id: I9640e0bdd298d651511adebcc85f314db9221d34 Reviewed-by: Thiago Macieira Reviewed-by: Qt CI Bot --- src/corelib/compat/removed_api.cpp | 5 +++++ src/corelib/text/qbytearraymatcher.cpp | 22 +++++++--------------- src/corelib/text/qbytearraymatcher.h | 14 ++++++++++---- 3 files changed, 22 insertions(+), 19 deletions(-) (limited to 'src') diff --git a/src/corelib/compat/removed_api.cpp b/src/corelib/compat/removed_api.cpp index 4cc0bffe20..d670bad407 100644 --- a/src/corelib/compat/removed_api.cpp +++ b/src/corelib/compat/removed_api.cpp @@ -75,6 +75,11 @@ int QStaticByteArrayMatcherBase::indexOfIn(const char *h, uint hl, const char *n # endif // QT_POINTER_SIZE != 4 +qsizetype QByteArrayMatcher::indexIn(const QByteArray &ba, qsizetype from) const +{ + return indexIn(QByteArrayView{ba}, from); // ba.isNull() may be significant, so don't ignore it! +} + #include "tools/qcryptographichash.h" void QCryptographicHash::addData(const QByteArray &data) diff --git a/src/corelib/text/qbytearraymatcher.cpp b/src/corelib/text/qbytearraymatcher.cpp index ee4d8d265b..0d96355df2 100644 --- a/src/corelib/text/qbytearraymatcher.cpp +++ b/src/corelib/text/qbytearraymatcher.cpp @@ -205,21 +205,6 @@ void QByteArrayMatcher::setPattern(const QByteArray &pattern) bm_init_skiptable(p.p, p.l, p.q_skiptable); } -/*! - Searches the byte array \a ba, from byte position \a from (default - 0, i.e. from the first byte), for the byte array pattern() that - was set in the constructor or in the most recent call to - setPattern(). Returns the position where the pattern() matched in - \a ba, or -1 if no match was found. -*/ -qsizetype QByteArrayMatcher::indexIn(const QByteArray &ba, qsizetype from) const -{ - if (from < 0) - from = 0; - return bm_find(reinterpret_cast(ba.constData()), ba.size(), from, - p.p, p.l, p.q_skiptable); -} - /*! Searches the char string \a str, which has length \a len, from byte position \a from (default 0, i.e. from the first byte), for @@ -246,6 +231,13 @@ qsizetype QByteArrayMatcher::indexIn(const char *str, qsizetype len, qsizetype f setPattern(). Returns the position where the pattern() matched in \a data, or -1 if no match was found. */ +qsizetype QByteArrayMatcher::indexIn(QByteArrayView data, qsizetype from) const +{ + if (from < 0) + from = 0; + return bm_find(reinterpret_cast(data.data()), data.size(), from, + p.p, p.l, p.q_skiptable); +} /*! \fn QByteArray QByteArrayMatcher::pattern() const diff --git a/src/corelib/text/qbytearraymatcher.h b/src/corelib/text/qbytearraymatcher.h index 80473c7585..7aa6226b24 100644 --- a/src/corelib/text/qbytearraymatcher.h +++ b/src/corelib/text/qbytearraymatcher.h @@ -65,12 +65,15 @@ public: void setPattern(const QByteArray &pattern); +#if QT_REMOVED_SINCE(6, 3) qsizetype indexIn(const QByteArray &ba, qsizetype from = 0) const; +#else + Q_WEAK_OVERLOAD + qsizetype indexIn(const QByteArray &ba, qsizetype from = 0) const + { return indexIn(QByteArrayView{ba}, from); } +#endif qsizetype indexIn(const char *str, qsizetype len, qsizetype from = 0) const; - qsizetype indexIn(QByteArrayView data, qsizetype from = 0) const - { - return indexIn(data.data(), data.size(), from); - } + qsizetype indexIn(QByteArrayView data, qsizetype from = 0) const; inline QByteArray pattern() const { if (q_pattern.isNull()) @@ -162,10 +165,13 @@ public: m_pattern[i] = patternToMatch[i]; } + Q_WEAK_OVERLOAD qsizetype indexIn(const QByteArray &haystack, qsizetype from = 0) const noexcept { return this->indexOfIn(m_pattern, N - 1, haystack.data(), haystack.size(), from); } qsizetype indexIn(const char *haystack, qsizetype hlen, qsizetype from = 0) const noexcept { return this->indexOfIn(m_pattern, N - 1, haystack, hlen, from); } + qsizetype indexIn(QByteArrayView haystack, qsizetype from = 0) const noexcept + { return this->indexOfIn(m_pattern, N - 1, haystack.data(), haystack.size(), from); } QByteArray pattern() const { return QByteArray(m_pattern, qsizetype(N - 1)); } }; -- cgit v1.2.3