diff options
Diffstat (limited to 'src/corelib/text/qstaticlatin1stringmatcher.h')
-rw-r--r-- | src/corelib/text/qstaticlatin1stringmatcher.h | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/src/corelib/text/qstaticlatin1stringmatcher.h b/src/corelib/text/qstaticlatin1stringmatcher.h index d80ebd8547..bd6d9db08b 100644 --- a/src/corelib/text/qstaticlatin1stringmatcher.h +++ b/src/corelib/text/qstaticlatin1stringmatcher.h @@ -109,13 +109,30 @@ public: } constexpr qsizetype indexIn(QLatin1StringView haystack, qsizetype from = 0) const noexcept + { return indexIn_helper(haystack, from); } + + constexpr qsizetype indexIn(QStringView haystack, qsizetype from = 0) const noexcept + { return indexIn_helper(haystack, from); } + +private: + template <typename String> + constexpr qsizetype indexIn_helper(String haystack, qsizetype from = 0) const noexcept { + static_assert(QtPrivate::isLatin1OrUtf16View<String>); + if (from >= haystack.size()) return -1; - const char *begin = haystack.begin() + from; - const char *end = haystack.end(); + + const auto start = [haystack]() constexpr { + if constexpr (std::is_same_v<String, QStringView>) + return haystack.utf16(); + else + return haystack.begin(); + }(); + const auto begin = start + from; + const auto end = start + haystack.size(); const auto r = m_searcher(begin, end, m_pattern.begin(), m_pattern.end()); - return r.begin == end ? -1 : std::distance(haystack.begin(), r.begin); + return r.begin == end ? -1 : std::distance(start, r.begin); } }; |