diff --git a/src/corelib/compat/removed_api.cpp b/src/corelib/compat/removed_api.cpp index 4cc0bffe208..d670bad4074 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 ee4d8d265be..0d96355df2d 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 80473c75852..7aa6226b243 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)); } }; diff --git a/tests/auto/corelib/text/qbytearraymatcher/tst_qbytearraymatcher.cpp b/tests/auto/corelib/text/qbytearraymatcher/tst_qbytearraymatcher.cpp index aa2b928e95e..859854dfbc7 100644 --- a/tests/auto/corelib/text/qbytearraymatcher/tst_qbytearraymatcher.cpp +++ b/tests/auto/corelib/text/qbytearraymatcher/tst_qbytearraymatcher.cpp @@ -48,12 +48,46 @@ class tst_QByteArrayMatcher : public QObject Q_OBJECT private slots: + void overloads(); void interface(); void indexIn(); void staticByteArrayMatcher(); void haystacksWithMoreThan4GiBWork(); }; +void tst_QByteArrayMatcher::overloads() +{ + QByteArray hello = QByteArrayLiteral("hello"); + QByteArray hello2 = hello.repeated(2); + { + QByteArrayMatcher m("hello"); + QCOMPARE(m.pattern(), "hello"); + QCOMPARE(m.indexIn("hello"), 0); + } + { + QByteArrayMatcher m("hello", qsizetype(3)); + QCOMPARE(m.pattern(), "hel"); + QCOMPARE(m.indexIn("hellohello", qsizetype(2)), -1); // haystack is "he", not: from is 2 + QCOMPARE(m.indexIn("hellohello", qsizetype(3)), 0); // haystack is "hel", not: from is 3 + } + { + QByteArrayMatcher m(hello); + QCOMPARE(m.pattern(), "hello"); + QCOMPARE(m.indexIn(hello), 0); + QCOMPARE(m.indexIn(hello2, qsizetype(1)), hello.size()); + } + { + QStaticByteArrayMatcher m("hel"); + QCOMPARE(m.pattern(), "hel"); + QCOMPARE(m.indexIn("hello"), qsizetype(0)); + QCOMPARE(m.indexIn("hellohello", qsizetype(2)), -1); // haystack is "he", not: from is 2 + QCOMPARE(m.indexIn("hellohello", qsizetype(3)), 0); // haystack is "hel", not: from is 3 + QCOMPARE(m.indexIn(hello), 0); + QCOMPARE(m.indexIn(hello2, qsizetype(2)), hello.size()); // from is 2 + QCOMPARE(m.indexIn(hello2, qsizetype(3)), hello.size()); // from is 3 + } +} + void tst_QByteArrayMatcher::interface() { const char needle[] = "abc123";