From ad496ea3b5ae79172af3a0231a65ae7c7ee44492 Mon Sep 17 00:00:00 2001 From: Andrei Golubev Date: Thu, 22 Apr 2021 16:59:27 +0200 Subject: Add q_points_into_range to container utilities We already used it in QString and QBA. And implicitly in QADP (see parent commit). Might as well move to a common location and reuse Change-Id: I694f0f1dbd109f17c134f64b3f3dc28d19556c88 Reviewed-by: Lars Knoll (cherry picked from commit 10b46e7f0faecc42a94cc2e25ad3edd08ae28083) Reviewed-by: Qt Cherry-pick Bot --- src/corelib/text/qbytearray.cpp | 14 ++++---------- src/corelib/text/qstring.cpp | 10 ++-------- src/corelib/tools/qcontainertools_impl.h | 13 +++++++++++++ 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/corelib/text/qbytearray.cpp b/src/corelib/text/qbytearray.cpp index 89c7e0db66..045d8a73b4 100644 --- a/src/corelib/text/qbytearray.cpp +++ b/src/corelib/text/qbytearray.cpp @@ -67,12 +67,6 @@ QT_BEGIN_NAMESPACE -template > -static constexpr bool points_into_range(const T *p, const T *b, const T *e, Cmp less = {}) noexcept -{ - return !less(p, b) && less(p, e); -} - const char QByteArray::_empty = '\0'; // ASCII case system, used by QByteArray::to{Upper,Lower}() and qstr(n)icmp(): @@ -2015,7 +2009,7 @@ QByteArray &QByteArray::insert(qsizetype i, QByteArrayView data) return *this; } - if (!d->needsDetach() && points_into_range(str, d.data(), d.data() + d.size)) { + if (!d->needsDetach() && QtPrivate::q_points_into_range(str, d.data(), d.data() + d.size)) { QVarLengthArray a(str, str + size); return insert(i, a); } @@ -2144,7 +2138,7 @@ QByteArray &QByteArray::remove(qsizetype pos, qsizetype len) QByteArray &QByteArray::replace(qsizetype pos, qsizetype len, QByteArrayView after) { - if (points_into_range(after.data(), d.data(), d.data() + d.size)) { + if (QtPrivate::q_points_into_range(after.data(), d.data(), d.data() + d.size)) { QVarLengthArray copy(after.data(), after.data() + after.size()); return replace(pos, len, QByteArrayView{copy}); } @@ -2201,11 +2195,11 @@ QByteArray &QByteArray::replace(QByteArrayView before, QByteArrayView after) return *this; // protect against before or after being part of this - if (points_into_range(a, d.data(), d.data() + d.size)) { + if (QtPrivate::q_points_into_range(a, d.data(), d.data() + d.size)) { QVarLengthArray copy(a, a + asize); return replace(before, QByteArrayView{copy}); } - if (points_into_range(b, d.data(), d.data() + d.size)) { + if (QtPrivate::q_points_into_range(b, d.data(), d.data() + d.size)) { QVarLengthArray copy(b, b + bsize); return replace(QByteArrayView{copy}, after); } diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp index 46d836e9ba..c2af431c94 100644 --- a/src/corelib/text/qstring.cpp +++ b/src/corelib/text/qstring.cpp @@ -100,12 +100,6 @@ QT_BEGIN_NAMESPACE -template > -static constexpr bool points_into_range(const T *p, const T *b, const T *e, Cmp less = {}) noexcept -{ - return !less(p, b) && less(p, e); -} - const char16_t QString::_empty = 0; /* @@ -2814,7 +2808,7 @@ QString& QString::insert(qsizetype i, const QChar *unicode, qsizetype size) return *this; } - if (!d->needsDetach() && points_into_range(s, d.data(), d.data() + d.size)) + if (!d->needsDetach() && QtPrivate::q_points_into_range(s, d.data(), d.data() + d.size)) return insert(i, QStringView{QVarLengthArray(s, s + size)}); d->insert(i, s, size); @@ -3108,7 +3102,7 @@ static void removeStringImpl(QString &s, const T &needle, Qt::CaseSensitivity cs QString &QString::remove(const QString &str, Qt::CaseSensitivity cs) { const auto s = str.d.data(); - if (points_into_range(s, d.data(), d.data() + d.size)) + if (QtPrivate::q_points_into_range(s, d.data(), d.data() + d.size)) removeStringImpl(*this, QStringView{QVarLengthArray(s, s + str.size())}, cs); else removeStringImpl(*this, qToStringViewIgnoringNull(str), cs); diff --git a/src/corelib/tools/qcontainertools_impl.h b/src/corelib/tools/qcontainertools_impl.h index f4dfecffce..570eeba891 100644 --- a/src/corelib/tools/qcontainertools_impl.h +++ b/src/corelib/tools/qcontainertools_impl.h @@ -59,6 +59,19 @@ QT_BEGIN_NAMESPACE namespace QtPrivate { +/*! + \internal + + Returns whether \a p is within a range [b, e). In simplest form equivalent to: + b <= p < e. +*/ +template> +static constexpr bool q_points_into_range(const T *p, const T *b, const T *e, + Cmp less = {}) noexcept +{ + return !less(p, b) && less(p, e); +} + template void q_uninitialized_relocate_n(T* first, N n, T* out) { -- cgit v1.2.3