Eliminate the last place that QBA::nulTerminated() is needed

By simply forwarding two QByteArray values (as views, since that
suffices) we can retain knowledge of their sizes and thus avoid the
need to null-terminate in order to forward to a hand-rolled strchr()
that depended on that. Using QBAV::contains() turns out to be quite
expensive, so use memchr() to implement a more efficient check.
In the process, turn a pointlessly repeated check into an assertion.

Change-Id: I316623206e1cf315a59d54cf574649d6acbb5c43
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
bb10
Edward Welbourne 2022-03-07 16:40:18 +01:00
parent 5291dc7dcf
commit 5a349a9c1b
1 changed files with 10 additions and 17 deletions

View File

@ -4568,22 +4568,15 @@ QByteArray QByteArray::fromPercentEncoding(const QByteArray &input, char percent
\sa fromStdString(), QString::toStdString()
*/
static inline bool q_strchr(const char str[], char chr)
static void q_toPercentEncoding(QByteArray *ba, QByteArrayView exclude,
QByteArrayView include, char percent)
{
if (!str) return false;
Q_ASSERT(!ba->isEmpty());
const char *ptr = str;
char c;
while ((c = *ptr++))
if (c == chr)
return true;
return false;
}
static void q_toPercentEncoding(QByteArray *ba, const char *dontEncode, const char *alsoEncode, char percent)
{
if (ba->isEmpty())
return;
const auto contains = [](QByteArrayView view, char c) {
// As view.contains(c), but optimised to bypass a lot of overhead:
return view.size() > 0 && memchr(view.data(), c, view.size()) != nullptr;
};
QByteArray input = *ba;
qsizetype len = input.size();
@ -4601,8 +4594,8 @@ static void q_toPercentEncoding(QByteArray *ba, const char *dontEncode, const ch
|| c == 0x2E // .
|| c == 0x5F // _
|| c == 0x7E // ~
|| q_strchr(dontEncode, c))
&& !q_strchr(alsoEncode, c)) {
|| contains(exclude, c))
&& !contains(include, c)) {
if (output)
output[length] = c;
++length;
@ -4654,7 +4647,7 @@ QByteArray QByteArray::toPercentEncoding(const QByteArray &exclude, const QByteA
return QByteArray(data(), 0);
QByteArray result = *this;
q_toPercentEncoding(&result, exclude.nulTerminated().constData(), include.nulTerminated().constData(), percent);
q_toPercentEncoding(&result, exclude, include, percent);
return result;
}