summaryrefslogtreecommitdiffstats
path: root/src/corelib/text/qstringalgorithms.h
blob: 404eb79e70c458aa6f9a6ec8e81194b9f2431bfa (plain)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
// Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only#ifndef QSTRINGALGORITHMS_H#define QSTRINGALGORITHMS_H#include <QtCore/qbytearrayalgorithms.h>#include <QtCore/qcontainerfwd.h>#include <QtCore/qnamespace.h>#include <QtCore/qstringfwd.h>#if 0#pragma qt_class(QStringAlgorithms)#endif#include <algorithm>// std::find#include <iterator>// std::size#include <QtCore/q20type_traits.h>// q20::is_constant_evaluated QT_BEGIN_NAMESPACE namespace QtPrivate {[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype qustrlen(const char16_t *str) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype qustrnlen(const char16_t *str, qsizetype maxlen) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION const char16_t *qustrchr(QStringView str, char16_t ch) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION const char16_t *qustrcasechr(QStringView str, char16_t ch) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION intcompareStrings(QStringView lhs, QStringView rhs,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION intcompareStrings(QStringView lhs, QLatin1StringView rhs,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION intcompareStrings(QStringView lhs, QBasicUtf8StringView<false> rhs,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION intcompareStrings(QLatin1StringView lhs, QStringView rhs,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION intcompareStrings(QLatin1StringView lhs, QLatin1StringView rhs,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION intcompareStrings(QLatin1StringView lhs, QBasicUtf8StringView<false> rhs,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION intcompareStrings(QBasicUtf8StringView<false> lhs, QStringView rhs,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION intcompareStrings(QBasicUtf8StringView<false> lhs, QLatin1StringView rhs,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION intcompareStrings(QBasicUtf8StringView<false> lhs, QBasicUtf8StringView<false> rhs,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION boolequalStrings(QStringView lhs, QStringView rhs) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION boolequalStrings(QStringView lhs, QLatin1StringView rhs) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION boolequalStrings(QStringView lhs, QBasicUtf8StringView<false> rhs) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION boolequalStrings(QLatin1StringView lhs, QStringView rhs) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION boolequalStrings(QLatin1StringView lhs, QLatin1StringView rhs) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION boolequalStrings(QLatin1StringView lhs, QBasicUtf8StringView<false> rhs) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION boolequalStrings(QBasicUtf8StringView<false> lhs, QStringView rhs) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION boolequalStrings(QBasicUtf8StringView<false> lhs, QLatin1StringView rhs) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION boolequalStrings(QBasicUtf8StringView<false> lhs, QBasicUtf8StringView<false> rhs) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION boolstartsWith(QStringView haystack, QStringView needle,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION boolstartsWith(QStringView haystack, QLatin1StringView needle,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION boolstartsWith(QLatin1StringView haystack, QStringView needle,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION boolstartsWith(QLatin1StringView haystack, QLatin1StringView needle,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION boolendsWith(QStringView haystack, QStringView needle,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION boolendsWith(QStringView haystack, QLatin1StringView needle,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION boolendsWith(QLatin1StringView haystack, QStringView needle,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION boolendsWith(QLatin1StringView haystack, QLatin1StringView needle,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]]inline qsizetype findString(QStringView str, qsizetype from, QChar needle,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype findString(QStringView haystack, qsizetype from, QStringView needle,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype findString(QStringView haystack, qsizetype from, QLatin1StringView needle,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype findString(QLatin1StringView haystack, qsizetype from, QStringView needle,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype findString(QLatin1StringView haystack, qsizetype from, QLatin1StringView needle,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype lastIndexOf(QStringView haystack, qsizetype from, char16_t needle,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype lastIndexOf(QStringView haystack, qsizetype from, QStringView needle,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype lastIndexOf(QStringView haystack, qsizetype from, QLatin1StringView needle,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype lastIndexOf(QLatin1StringView haystack, qsizetype from, QStringView needle,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype lastIndexOf(QLatin1StringView haystack, qsizetype from, QLatin1StringView needle,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION QStringView trimmed(QStringView s) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION QLatin1StringView trimmed(QLatin1StringView s) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION boolisLower(QStringView s) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION boolisUpper(QStringView s) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype count(QStringView haystack, QChar needle,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype count(QStringView haystack, QStringView needle,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype count(QStringView haystack, QLatin1StringView needle,Qt::CaseSensitivity cs =Qt::CaseSensitive);[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype count(QLatin1StringView haystack, QLatin1StringView needle,Qt::CaseSensitivity cs =Qt::CaseSensitive);[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype count(QLatin1StringView haystack, QStringView needle,Qt::CaseSensitivity cs =Qt::CaseSensitive);[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype count(QLatin1StringView haystack, QChar needle,Qt::CaseSensitivity cs =Qt::CaseSensitive) noexcept;#if QT_CONFIG(regularexpression)// ### Qt 7: unify these overloads;// remove the ones taking only a QStringView, export the others, adjust callers[[nodiscard]] qsizetype indexOf(QStringView viewHaystack,const QString *stringHaystack,const QRegularExpression &re, qsizetype from =0, QRegularExpressionMatch *rmatch =nullptr);[[nodiscard]] Q_CORE_EXPORT qsizetype indexOf(QStringView haystack,const QRegularExpression &re, qsizetype from =0, QRegularExpressionMatch *rmatch =nullptr);[[nodiscard]] qsizetype lastIndexOf(QStringView viewHaystack,const QString *stringHaystack,const QRegularExpression &re, qsizetype from = -1, QRegularExpressionMatch *rmatch =nullptr);[[nodiscard]] Q_CORE_EXPORT qsizetype lastIndexOf(QStringView haystack,const QRegularExpression &re, qsizetype from = -1, QRegularExpressionMatch *rmatch =nullptr);[[nodiscard]]boolcontains(QStringView viewHaystack,const QString *stringHaystack,const QRegularExpression &re, QRegularExpressionMatch *rmatch =nullptr);[[nodiscard]] Q_CORE_EXPORT boolcontains(QStringView haystack,const QRegularExpression &re, QRegularExpressionMatch *rmatch =nullptr);[[nodiscard]] Q_CORE_EXPORT qsizetype count(QStringView haystack,const QRegularExpression &re);#endif[[nodiscard]] Q_CORE_EXPORT QString convertToQString(QAnyStringView s);[[nodiscard]] Q_CORE_EXPORT QByteArray convertToLatin1(QStringView str);[[nodiscard]] Q_CORE_EXPORT QByteArray convertToUtf8(QStringView str);[[nodiscard]] Q_CORE_EXPORT QByteArray convertToLocal8Bit(QStringView str);[[nodiscard]] Q_CORE_EXPORT QList<uint>convertToUcs4(QStringView str);// ### Qt 7 char32_t[[nodiscard]] Q_CORE_EXPORT QByteArray convertToUtf8(QLatin1StringView str);[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION boolisRightToLeft(QStringView string) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION boolisAscii(QLatin1StringView s) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION boolisAscii(QStringView s) noexcept;[[nodiscard]]constexpr inlineboolisLatin1(QLatin1StringView s) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION boolisLatin1(QStringView s) noexcept;[[nodiscard]] Q_CORE_EXPORT Q_DECL_PURE_FUNCTION boolisValidUtf16(QStringView s) noexcept;template<typename Char,size_t N> [[nodiscard]] Q_ALWAYS_INLINE constexpr qsizetype lengthHelperContainerLoop(constChar(&str)[N]){#if defined(__cpp_lib_constexpr_algorithms) && defined(Q_CC_GNU_ONLY)// libstdc++'s std::find / std::find_if manages to execute more steps// than the loop belowconstauto it =std::find(str, str + N,Char(0));return it - str;#else// std::char_traits<C> is deprecated for C not one of the standard char// types, so we have to roll out our own loop.for(size_t i =0; i < N; ++i) {if(str[i] ==Char(0))returnqsizetype(i);}returnqsizetype(N);#endif}template<typename Char,size_t N> [[nodiscard]] Q_ALWAYS_INLINE constexprstd::enable_if_t<sizeof(Char) ==sizeof(char16_t), qsizetype>lengthHelperContainer(constChar(&str)[N]){// The following values were empirically determined to detect the threshold// at which the compiler gives up pre-calculating the std::find() below and// instead inserts code to be executed at runtime.constexprsize_t RuntimeThreshold =#if defined(Q_CC_CLANG)// tested on Clang 15, 16 & 171023#elif defined(Q_CC_GNU)// tested through GCC 13.1 at -O3 compilation level// note: at -O2, GCC always generates a loop! __cplusplus >=202002L?39:17#else0#endif;ifconstexpr(N ==1) {return str[0] ==Char(0) ?0:1;}else ifconstexpr(N > RuntimeThreshold) {#ifdef QT_SUPPORTS_IS_CONSTANT_EVALUATEDif(!q20::is_constant_evaluated())returnQtPrivate::qustrnlen(reinterpret_cast<const char16_t *>(str), N);#endif}returnlengthHelperContainerLoop(str);}inline qsizetype qstrnlen_helper(const char*str,size_t maxlen){#if !defined(Q_COMPILER_SLOW_QSTRNLEN_COMPILATION)returnqstrnlen(str, maxlen);#elsereturnstrnlen_s(str, maxlen);#endif}template<typename Char,size_t N> [[nodiscard]]constexpr inlinestd::enable_if_t<sizeof(Char) ==1, qsizetype>lengthHelperContainer(constChar(&str)[N]){#ifdef QT_SUPPORTS_IS_CONSTANT_EVALUATEDif(!q20::is_constant_evaluated())returnqstrnlen_helper(reinterpret_cast<const char*>(str), N);#endifreturnlengthHelperContainerLoop(str);}template<typename Container>constexpr qsizetype lengthHelperContainer(const Container &c) noexcept {returnqsizetype(std::size(c));}}// namespace QtPrivate QT_END_NAMESPACE #endif// QSTRINGALGORTIHMS_H
close