Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qstringiterator_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
4// Qt-Security score:critical reason:data-parser
5
6#ifndef QSTRINGITERATOR_H
7#define QSTRINGITERATOR_H
8
9//
10// W A R N I N G
11// -------------
12//
13// This file is not part of the Qt API. It exists purely as an
14// implementation detail. This header file may change from version to
15// version without notice, or even be removed.
16//
17// We mean it.
18//
19
20#include <QtCore/private/qglobal_p.h>
21#include <QtCore/qstring.h>
22
24
26{
27 QString::const_iterator i, pos, e;
28 static_assert((std::is_same<QString::const_iterator, const QChar *>::value));
29 static bool less(const QChar *lhs, const QChar *rhs) noexcept
30 { return std::less{}(lhs, rhs); }
31public:
32 explicit QStringIterator(QStringView string, qsizetype idx = 0)
33 : i(string.begin()),
34 pos(i + idx),
35 e(string.end())
36 {
37 }
38
39 inline explicit QStringIterator(const QChar *begin, const QChar *end)
40 : i(begin),
41 pos(begin),
42 e(end)
43 {
44 }
45
46 explicit QStringIterator(const QChar *begin, qsizetype idx, const QChar *end)
47 : i(begin),
48 pos(begin + idx),
49 e(end)
50 {
51 }
52
54 {
55 return pos;
56 }
57
59 {
60 return pos - i;
61 }
62
63 inline void setPosition(QString::const_iterator position)
64 {
65 Q_ASSERT_X(!less(position, i) && !less(e, position),
66 Q_FUNC_INFO, "position out of bounds");
67 pos = position;
68 }
69
70 // forward iteration
71
72 inline bool hasNext() const
73 {
74 return less(pos, e);
75 }
76
77 inline void advance()
78 {
79 Q_ASSERT_X(hasNext(), Q_FUNC_INFO, "iterator hasn't a next item");
80
81 if (Q_UNLIKELY((pos++)->isHighSurrogate())) {
82 if (Q_LIKELY(pos != e && pos->isLowSurrogate()))
83 ++pos;
84 }
85 }
86
87 inline void advanceUnchecked()
88 {
89 Q_ASSERT_X(hasNext(), Q_FUNC_INFO, "iterator hasn't a next item");
90
91 if (Q_UNLIKELY((pos++)->isHighSurrogate())) {
92 Q_ASSERT(hasNext() && pos->isLowSurrogate());
93 ++pos;
94 }
95 }
96
97 inline char32_t peekNextUnchecked() const
98 {
99 Q_ASSERT_X(hasNext(), Q_FUNC_INFO, "iterator hasn't a next item");
100
101 if (Q_UNLIKELY(pos->isHighSurrogate())) {
102 Q_ASSERT(less(pos + 1, e) && pos[1].isLowSurrogate());
103 return QChar::surrogateToUcs4(pos[0], pos[1]);
104 }
105
106 return pos->unicode();
107 }
108
109 inline char32_t peekNext(char32_t invalidAs = QChar::ReplacementCharacter) const
110 {
111 Q_ASSERT_X(hasNext(), Q_FUNC_INFO, "iterator hasn't a next item");
112
113 if (Q_UNLIKELY(pos->isSurrogate())) {
114 if (Q_LIKELY(pos->isHighSurrogate())) {
115 const QChar *low = pos + 1;
116 if (Q_LIKELY(low != e && low->isLowSurrogate()))
117 return QChar::surrogateToUcs4(*pos, *low);
118 }
119 return invalidAs;
120 }
121
122 return pos->unicode();
123 }
124
125 inline char32_t nextUnchecked()
126 {
127 Q_ASSERT_X(hasNext(), Q_FUNC_INFO, "iterator hasn't a next item");
128
129 const QChar cur = *pos++;
130 if (Q_UNLIKELY(cur.isHighSurrogate())) {
131 Q_ASSERT(hasNext() && pos->isLowSurrogate());
132 return QChar::surrogateToUcs4(cur, *pos++);
133 }
134 return cur.unicode();
135 }
136
137 inline char32_t next(char32_t invalidAs = QChar::ReplacementCharacter)
138 {
139 Q_ASSERT_X(hasNext(), Q_FUNC_INFO, "iterator hasn't a next item");
140
141 const QChar uc = *pos++;
142 if (Q_UNLIKELY(uc.isSurrogate())) {
143 if (Q_LIKELY(uc.isHighSurrogate() && hasNext() && pos->isLowSurrogate()))
144 return QChar::surrogateToUcs4(uc, *pos++);
145 return invalidAs;
146 }
147
148 return uc.unicode();
149 }
150
151 // backwards iteration
152
153 inline bool hasPrevious() const
154 {
155 return less(i, pos);
156 }
157
158 inline void recede()
159 {
160 Q_ASSERT_X(hasPrevious(), Q_FUNC_INFO, "iterator hasn't a previous item");
161
162 if (Q_UNLIKELY((--pos)->isLowSurrogate())) {
163 const QChar *high = pos - 1;
164 if (Q_LIKELY(high != i - 1 && high->isHighSurrogate()))
165 --pos;
166 }
167 }
168
169 inline void recedeUnchecked()
170 {
171 Q_ASSERT_X(hasPrevious(), Q_FUNC_INFO, "iterator hasn't a previous item");
172
173 if (Q_UNLIKELY((--pos)->isLowSurrogate())) {
174 Q_ASSERT(hasPrevious() && pos[-1].isHighSurrogate());
175 --pos;
176 }
177 }
178
179 inline char32_t peekPreviousUnchecked() const
180 {
181 Q_ASSERT_X(hasPrevious(), Q_FUNC_INFO, "iterator hasn't a previous item");
182
183 if (Q_UNLIKELY(pos[-1].isLowSurrogate())) {
184 Q_ASSERT(less(i + 1, pos) && pos[-2].isHighSurrogate());
185 return QChar::surrogateToUcs4(pos[-2], pos[-1]);
186 }
187 return pos[-1].unicode();
188 }
189
190 inline char32_t peekPrevious(char32_t invalidAs = QChar::ReplacementCharacter) const
191 {
192 Q_ASSERT_X(hasPrevious(), Q_FUNC_INFO, "iterator hasn't a previous item");
193
194 if (Q_UNLIKELY(pos[-1].isSurrogate())) {
195 if (Q_LIKELY(pos[-1].isLowSurrogate())) {
196 const QChar *high = pos - 2;
197 if (Q_LIKELY(high != i - 1 && high->isHighSurrogate()))
198 return QChar::surrogateToUcs4(*high, pos[-1]);
199 }
200 return invalidAs;
201 }
202
203 return pos[-1].unicode();
204 }
205
206 inline char32_t previousUnchecked()
207 {
208 Q_ASSERT_X(hasPrevious(), Q_FUNC_INFO, "iterator hasn't a previous item");
209
210 const QChar cur = *--pos;
211 if (Q_UNLIKELY(cur.isLowSurrogate())) {
212 Q_ASSERT(hasPrevious() && pos[-1].isHighSurrogate());
213 return QChar::surrogateToUcs4(*--pos, cur);
214 }
215 return cur.unicode();
216 }
217
218 inline char32_t previous(char32_t invalidAs = QChar::ReplacementCharacter)
219 {
220 Q_ASSERT_X(hasPrevious(), Q_FUNC_INFO, "iterator hasn't a previous item");
221
222 const QChar uc = *--pos;
223 if (Q_UNLIKELY(uc.isSurrogate())) {
224 if (Q_LIKELY(uc.isLowSurrogate() && hasPrevious() && pos[-1].isHighSurrogate()))
225 return QChar::surrogateToUcs4(*--pos, uc);
226 return invalidAs;
227 }
228
229 return uc.unicode();
230 }
231};
232
233QT_END_NAMESPACE
234
235#endif // QSTRINGITERATOR_H
The QCalendar class describes calendar systems.
Definition qcalendar.h:53
const QLocaleData *const m_data
Definition qlocale_p.h:619
QLocale::MeasurementSystem measurementSystem() const
Definition qlocale.cpp:3549
QByteArray bcp47Name(char separator='-') const
Definition qlocale.cpp:494
char32_t peekNext(char32_t invalidAs=QChar::ReplacementCharacter) const
char32_t next(char32_t invalidAs=QChar::ReplacementCharacter)
QStringIterator(const QChar *begin, qsizetype idx, const QChar *end)
QString::const_iterator position() const
char32_t previous(char32_t invalidAs=QChar::ReplacementCharacter)
QStringIterator(QStringView string, qsizetype idx=0)
bool hasNext() const
char32_t peekPreviousUnchecked() const
QStringIterator(const QChar *begin, const QChar *end)
char32_t peekNextUnchecked() const
qsizetype index() const
bool hasPrevious() const
void setPosition(QString::const_iterator position)
char32_t peekPrevious(char32_t invalidAs=QChar::ReplacementCharacter) const
char32_t previousUnchecked()
Definition qcompare.h:76
CaseSensitivity
@ CaseInsensitive
@ CaseSensitive
Q_GLOBAL_STATIC(DefaultRoleNames, qDefaultRoleNames, { { Qt::DisplayRole, "display" }, { Qt::DecorationRole, "decoration" }, { Qt::EditRole, "edit" }, { Qt::ToolTipRole, "toolTip" }, { Qt::StatusTipRole, "statusTip" }, { Qt::WhatsThisRole, "whatsThis" }, }) const QHash< int
static unsigned calculateFlags(int fieldWidth, char32_t fillChar, const QLocale &locale)
Definition qlocale.cpp:2236
static QString calculateFiller(qsizetype padding, char32_t fillChar, qsizetype fieldWidth, const QLocaleData *localeData)
Definition qlocale.cpp:2250
QDebug operator<<(QDebug dbg, const QLocale &l)
Definition qlocale.cpp:5520
static QLocalePrivate * findLocalePrivate(QLocale::Language language, QLocale::Script script, QLocale::Territory territory)
Definition qlocale.cpp:1001
static std::optional< QString > systemLocaleString(const QLocaleData *that, QSystemLocale::QueryType type)
Definition qlocale.cpp:1048
static const QSystemLocale * systemLocale()
Definition qlocale.cpp:856
static bool checkParsed(QByteArrayView num, qsizetype used)
Definition qlocale.cpp:4925
static QString rawWeekDayName(const QLocaleData *data, const int day, QLocale::FormatType type)
Definition qlocale.cpp:3351
QDataStream & operator>>(QDataStream &ds, QLocale &l)
Definition qlocale.cpp:979
#define CheckCandidate(id)
static Q_DECL_COLD_FUNCTION void badSeparatorWarning(const char *method, char sep)
Definition qlocale.cpp:1537
static QString rawStandaloneWeekDayName(const QLocaleData *data, const int day, QLocale::FormatType type)
Definition qlocale.cpp:3375
static constexpr QLocale::NumberOptions defaultNumberOptions(QLocale::Language forLanguage)
Definition qlocale.cpp:795
static QStringView findTag(QStringView name) noexcept
Definition qlocale.cpp:642
static bool validTag(QStringView tag)
Definition qlocale.cpp:651
static qsizetype scriptIndex(QStringView code, Qt::CaseSensitivity cs) noexcept
Definition qlocale.cpp:184
static const QCalendarLocale & getMonthDataFor(const QLocalePrivate *loc, const QCalendarLocale *table)
Definition qlocale.cpp:3298
static T toIntegral_helper(const QLocalePrivate *d, QStringView str, bool *ok)
Definition qlocale.cpp:1585
static bool timeFormatContainsAP(QStringView format)
Definition qlocale.cpp:2457
size_t qHash(const QLocale &key, size_t seed) noexcept
Definition qlocale.cpp:1318
bool comparesEqual(const QLocale &loc, QLocale::Language lang)
Definition qlocale.cpp:1022
static qsizetype findLocaleIndexById(QLocaleId localeId) noexcept
Definition qlocale.cpp:504
static constexpr qsizetype locale_data_size
Definition qlocale.cpp:523
static void updateSystemPrivate()
Definition qlocale.cpp:868
static QString rawMonthName(const QCalendarLocale &localeData, const char16_t *monthsData, int month, QLocale::FormatType type)
Definition qlocale.cpp:3325
static qsizetype stringWidth(QStringView text)
Definition qlocale.cpp:2225
static QLocalePrivate * c_private() noexcept
Definition qlocale.cpp:789
static const QLocaleData * defaultData()
Definition qlocale.cpp:943
static QString rawStandaloneMonthName(const QCalendarLocale &localeData, const char16_t *monthsData, int month, QLocale::FormatType type)
Definition qlocale.cpp:3337
static QString localeString(const QLocaleData *that, QSystemLocale::QueryType type, QLocaleData::DataRange range)
Definition qlocale.cpp:1066
static const QLocaleData * systemData(qsizetype *sysIndex=nullptr)
Definition qlocale.cpp:903
static QString offsetFromAbbreviation(QString &&text)
Definition qlocale.cpp:3760
static qsizetype defaultIndex()
Definition qlocale.cpp:950
static constexpr char16_t single_character_data[]
static constexpr char16_t days_data[]
static constexpr QLocaleData locale_data[]
static constexpr QLocaleId likely_subtags[]
static constexpr unsigned char territory_code_list[]
static constexpr unsigned char script_code_list[]
bool qt_splitLocaleName(QStringView name, QStringView *lang=nullptr, QStringView *script=nullptr, QStringView *cntry=nullptr) noexcept
Definition qlocale.cpp:662
qsizetype qt_repeatCount(QStringView s) noexcept
Definition qlocale.cpp:775
QString qt_readEscapedFormatString(QStringView format, qsizetype *idx)
Definition qlocale.cpp:725
#define QStringLiteral(str)
Definition qstring.h:1826
char32_t ucsFirst(const char16_t *table) const
Definition qlocale_p.h:493
const GroupSizes grouping
Definition qlocale_p.h:371
QString positiveSign() const
Definition qlocale.cpp:1120
QString groupSeparator() const
Definition qlocale.cpp:1079
QSimpleParsedNumber< qint64 > stringToLongLong(QStringView str, int base, QLocale::NumberOptions options) const
Definition qlocale.cpp:4904
Q_AUTOTEST_EXPORT char32_t zeroUcs() const
Definition qlocale.cpp:1099
QString zeroDigit() const
Definition qlocale.cpp:1094
bool numberToCLocale(QStringView s, QLocale::NumberOptions number_options, NumberMode mode, CharBuff *result) const
Definition qlocale.cpp:4630
QString decimalPoint() const
Definition qlocale.cpp:1074
QString doubleToString(double d, int precision=-1, DoubleForm form=DFSignificantDigits, int width=-1, unsigned flags=NoFlags) const
Definition qlocale.cpp:4058
QLocaleId id() const
Definition qlocale_p.h:456
QString listSeparator() const
Definition qlocale.cpp:1089
QString percentSign() const
Definition qlocale.cpp:1084
@ AddTrailingZeroes
Definition qlocale_p.h:267
double stringToDouble(QStringView str, bool *ok, QLocale::NumberOptions options) const
Definition qlocale.cpp:4888
QString longLongToString(qint64 l, int precision=-1, int base=10, int width=-1, unsigned flags=NoFlags) const
Definition qlocale.cpp:4301
@ DoubleScientificMode
Definition qlocale_p.h:281
@ DFSignificantDigits
Definition qlocale_p.h:261
QString exponentSeparator() const
Definition qlocale.cpp:1125
QString negativeSign() const
Definition qlocale.cpp:1115
QSimpleParsedNumber< quint64 > stringToUnsLongLong(QStringView str, int base, QLocale::NumberOptions options) const
Definition qlocale.cpp:4915
QString unsLongLongToString(quint64 l, int precision=-1, int base=10, int width=-1, unsigned flags=NoFlags) const
Definition qlocale.cpp:4316
QLocaleId withLikelySubtagsAdded() const noexcept
Fill in blank fields of a locale ID.
Definition qlocale.cpp:326
QLocaleId withLikelySubtagsRemoved() const noexcept
Definition qlocale.cpp:415
ushort script_id
Definition qlocale_p.h:242
bool operator==(QLocaleId other) const noexcept
Definition qlocale_p.h:211
ushort territory_id
Definition qlocale_p.h:242
ushort language_id
Definition qlocale_p.h:242