11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
42
43
44
45
46QLatin1StringMatcher::QLatin1StringMatcher()
noexcept
48 m_cs(Qt::CaseSensitive),
49 m_caseSensitiveSearcher(m_pattern.data(), m_pattern.data())
54
55
56
57
58
60 Qt::CaseSensitivity cs)
noexcept
61 : m_pattern(pattern), m_cs(cs)
67
68
75
76
79 if (m_cs == Qt::CaseSensitive) {
80 new (&m_caseSensitiveSearcher) CaseSensitiveSearcher(m_pattern.data(), m_pattern.end());
83 qsizetype bufferSize = std::min(m_pattern.size(), qsizetype(
sizeof m_foldBuffer));
84 for (qsizetype i = 0; i < bufferSize; ++i)
85 m_foldBuffer[i] =
static_cast<
char>(foldCase(m_pattern[i].toLatin1()));
87 new (&m_caseInsensitiveSearcher)
88 CaseInsensitiveSearcher(m_foldBuffer, &m_foldBuffer[bufferSize]);
93
94
97 if (m_cs == Qt::CaseSensitive)
98 m_caseSensitiveSearcher.~CaseSensitiveSearcher();
100 m_caseInsensitiveSearcher.~CaseInsensitiveSearcher();
104
105
106
107
108
109
110
113 if (m_pattern.latin1() == pattern.latin1() && m_pattern.size() == pattern.size())
122
123
124
125
132
133
134
135
147
148
149
150
157
158
159
160
161
164 return indexIn_helper(haystack, from);
168
169
170
171
172
173
174
175
178 return indexIn_helper(haystack, from);
182
183
184template <
typename String>
187 static_assert(
QtPrivate::isLatin1OrUtf16View<String>);
189 if (m_pattern.isEmpty() && from == haystack.size())
192 from += haystack.size();
193 if (from >= haystack.size())
196 const auto start = [haystack] {
197 if constexpr (std::is_same_v<String, QStringView>)
198 return haystack.utf16();
200 return haystack.begin();
203 auto begin = start + from;
204 auto end = start + haystack.size();
206 if (m_cs == Qt::CaseSensitive) {
207 found = m_caseSensitiveSearcher(begin, end, m_pattern.begin(), m_pattern.end()).begin;
211 const qsizetype bufferSize = std::min(m_pattern.size(), qsizetype(
sizeof m_foldBuffer));
212 const QLatin1StringView restNeedle = m_pattern.sliced(bufferSize);
213 const bool needleLongerThanBuffer = restNeedle.size() > 0;
214 String restHaystack = haystack;
216 found = m_caseInsensitiveSearcher
(found
, end
, m_foldBuffer
, &m_foldBuffer[bufferSize]
)
220 }
else if (!needleLongerThanBuffer) {
223 restHaystack = haystack.sliced(
224 qMin(haystack.size(),
225 bufferSize + qsizetype(std::distance(start, found))));
226 if (restHaystack.startsWith(restNeedle, Qt::CaseInsensitive))
231 return std::distance(start, found);
Q_CORE_EXPORT void setPattern(QLatin1StringView pattern) noexcept
Sets the pattern to search for.
Q_CORE_EXPORT ~QLatin1StringMatcher() noexcept
Destroys the Latin-1 string matcher.
CaseInsensitiveSearcher m_caseInsensitiveSearcher
Q_CORE_EXPORT void setCaseSensitivity(Qt::CaseSensitivity cs) noexcept
Sets the case sensitivity to cs.