10
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
41
42
43
44
45QLatin1StringMatcher::QLatin1StringMatcher()
noexcept
47 m_cs(Qt::CaseSensitive),
48 m_caseSensitiveSearcher(m_pattern.data(), m_pattern.data())
53
54
55
56
57
59 Qt::CaseSensitivity cs)
noexcept
60 : m_pattern(pattern), m_cs(cs)
66
67
74
75
78 if (m_cs == Qt::CaseSensitive) {
79 new (&m_caseSensitiveSearcher) CaseSensitiveSearcher(m_pattern.data(), m_pattern.end());
82 qsizetype bufferSize = std::min(m_pattern.size(), qsizetype(
sizeof m_foldBuffer));
83 for (qsizetype i = 0; i < bufferSize; ++i)
84 m_foldBuffer[i] =
static_cast<
char>(foldCase(m_pattern[i].toLatin1()));
86 new (&m_caseInsensitiveSearcher)
87 CaseInsensitiveSearcher(m_foldBuffer, &m_foldBuffer[bufferSize]);
92
93
96 if (m_cs == Qt::CaseSensitive)
97 m_caseSensitiveSearcher.~CaseSensitiveSearcher();
99 m_caseInsensitiveSearcher.~CaseInsensitiveSearcher();
103
104
105
106
107
108
109
112 if (m_pattern.latin1() == pattern.latin1() && m_pattern.size() == pattern.size())
121
122
123
124
131
132
133
134
146
147
148
149
156
157
158
159
160
163 return indexIn_helper(haystack, from);
167
168
169
170
171
172
173
174
177 return indexIn_helper(haystack, from);
181
182
183template <
typename String>
186 static_assert(
QtPrivate::isLatin1OrUtf16View<String>);
188 if (m_pattern.isEmpty() && from == haystack.size())
191 from += haystack.size();
192 if (from >= haystack.size())
195 const auto start = [haystack] {
196 if constexpr (std::is_same_v<String, QStringView>)
197 return haystack.utf16();
199 return haystack.begin();
202 auto begin = start + from;
203 auto end = start + haystack.size();
205 if (m_cs == Qt::CaseSensitive) {
206 found = m_caseSensitiveSearcher(begin, end, m_pattern.begin(), m_pattern.end()).begin;
210 const qsizetype bufferSize = std::min(m_pattern.size(), qsizetype(
sizeof m_foldBuffer));
211 const QLatin1StringView restNeedle = m_pattern.sliced(bufferSize);
212 const bool needleLongerThanBuffer = restNeedle.size() > 0;
213 String restHaystack = haystack;
215 found = m_caseInsensitiveSearcher
(found
, end
, m_foldBuffer
, &m_foldBuffer[bufferSize]
)
219 }
else if (!needleLongerThanBuffer) {
222 restHaystack = haystack.sliced(
223 qMin(haystack.size(),
224 bufferSize + qsizetype(std::distance(start, found))));
225 if (restHaystack.startsWith(restNeedle, Qt::CaseInsensitive))
230 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.
Combined button and popup list for selecting options.