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
5#ifndef QSTRINGITERATOR_H
6#define QSTRINGITERATOR_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include <QtCore/private/qglobal_p.h>
20#include <QtCore/qstring.h>
21
23
25{
26 QString::const_iterator i, pos, e;
27 static_assert((std::is_same<QString::const_iterator, const QChar *>::value));
28 static bool less(const QChar *lhs, const QChar *rhs) noexcept
29 { return std::less{}(lhs, rhs); }
30public:
31 explicit QStringIterator(QStringView string, qsizetype idx = 0)
32 : i(string.begin()),
33 pos(i + idx),
34 e(string.end())
35 {
36 }
37
38 inline explicit QStringIterator(const QChar *begin, const QChar *end)
39 : i(begin),
40 pos(begin),
41 e(end)
42 {
43 }
44
45 explicit QStringIterator(const QChar *begin, qsizetype idx, const QChar *end)
46 : i(begin),
47 pos(begin + idx),
48 e(end)
49 {
50 }
51
53 {
54 return pos;
55 }
56
58 {
59 return pos - i;
60 }
61
62 inline void setPosition(QString::const_iterator position)
63 {
64 Q_ASSERT_X(!less(position, i) && !less(e, position),
65 Q_FUNC_INFO, "position out of bounds");
66 pos = position;
67 }
68
69 // forward iteration
70
71 inline bool hasNext() const
72 {
73 return less(pos, e);
74 }
75
76 inline void advance()
77 {
78 Q_ASSERT_X(hasNext(), Q_FUNC_INFO, "iterator hasn't a next item");
79
80 if (Q_UNLIKELY((pos++)->isHighSurrogate())) {
81 if (Q_LIKELY(pos != e && pos->isLowSurrogate()))
82 ++pos;
83 }
84 }
85
86 inline void advanceUnchecked()
87 {
88 Q_ASSERT_X(hasNext(), Q_FUNC_INFO, "iterator hasn't a next item");
89
90 if (Q_UNLIKELY((pos++)->isHighSurrogate())) {
91 Q_ASSERT(hasNext() && pos->isLowSurrogate());
92 ++pos;
93 }
94 }
95
96 inline char32_t peekNextUnchecked() const
97 {
98 Q_ASSERT_X(hasNext(), Q_FUNC_INFO, "iterator hasn't a next item");
99
100 if (Q_UNLIKELY(pos->isHighSurrogate())) {
101 Q_ASSERT(less(pos + 1, e) && pos[1].isLowSurrogate());
102 return QChar::surrogateToUcs4(pos[0], pos[1]);
103 }
104
105 return pos->unicode();
106 }
107
108 inline char32_t peekNext(char32_t invalidAs = QChar::ReplacementCharacter) const
109 {
110 Q_ASSERT_X(hasNext(), Q_FUNC_INFO, "iterator hasn't a next item");
111
112 if (Q_UNLIKELY(pos->isSurrogate())) {
113 if (Q_LIKELY(pos->isHighSurrogate())) {
114 const QChar *low = pos + 1;
115 if (Q_LIKELY(low != e && low->isLowSurrogate()))
116 return QChar::surrogateToUcs4(*pos, *low);
117 }
118 return invalidAs;
119 }
120
121 return pos->unicode();
122 }
123
124 inline char32_t nextUnchecked()
125 {
126 Q_ASSERT_X(hasNext(), Q_FUNC_INFO, "iterator hasn't a next item");
127
128 const QChar cur = *pos++;
129 if (Q_UNLIKELY(cur.isHighSurrogate())) {
130 Q_ASSERT(hasNext() && pos->isLowSurrogate());
131 return QChar::surrogateToUcs4(cur, *pos++);
132 }
133 return cur.unicode();
134 }
135
136 inline char32_t next(char32_t invalidAs = QChar::ReplacementCharacter)
137 {
138 Q_ASSERT_X(hasNext(), Q_FUNC_INFO, "iterator hasn't a next item");
139
140 const QChar uc = *pos++;
141 if (Q_UNLIKELY(uc.isSurrogate())) {
142 if (Q_LIKELY(uc.isHighSurrogate() && hasNext() && pos->isLowSurrogate()))
143 return QChar::surrogateToUcs4(uc, *pos++);
144 return invalidAs;
145 }
146
147 return uc.unicode();
148 }
149
150 // backwards iteration
151
152 inline bool hasPrevious() const
153 {
154 return less(i, pos);
155 }
156
157 inline void recede()
158 {
159 Q_ASSERT_X(hasPrevious(), Q_FUNC_INFO, "iterator hasn't a previous item");
160
161 if (Q_UNLIKELY((--pos)->isLowSurrogate())) {
162 const QChar *high = pos - 1;
163 if (Q_LIKELY(high != i - 1 && high->isHighSurrogate()))
164 --pos;
165 }
166 }
167
168 inline void recedeUnchecked()
169 {
170 Q_ASSERT_X(hasPrevious(), Q_FUNC_INFO, "iterator hasn't a previous item");
171
172 if (Q_UNLIKELY((--pos)->isLowSurrogate())) {
173 Q_ASSERT(hasPrevious() && pos[-1].isHighSurrogate());
174 --pos;
175 }
176 }
177
178 inline char32_t peekPreviousUnchecked() const
179 {
180 Q_ASSERT_X(hasPrevious(), Q_FUNC_INFO, "iterator hasn't a previous item");
181
182 if (Q_UNLIKELY(pos[-1].isLowSurrogate())) {
183 Q_ASSERT(less(i + 1, pos) && pos[-2].isHighSurrogate());
184 return QChar::surrogateToUcs4(pos[-2], pos[-1]);
185 }
186 return pos[-1].unicode();
187 }
188
189 inline char32_t peekPrevious(char32_t invalidAs = QChar::ReplacementCharacter) const
190 {
191 Q_ASSERT_X(hasPrevious(), Q_FUNC_INFO, "iterator hasn't a previous item");
192
193 if (Q_UNLIKELY(pos[-1].isSurrogate())) {
194 if (Q_LIKELY(pos[-1].isLowSurrogate())) {
195 const QChar *high = pos - 2;
196 if (Q_LIKELY(high != i - 1 && high->isHighSurrogate()))
197 return QChar::surrogateToUcs4(*high, pos[-1]);
198 }
199 return invalidAs;
200 }
201
202 return pos[-1].unicode();
203 }
204
205 inline char32_t previousUnchecked()
206 {
207 Q_ASSERT_X(hasPrevious(), Q_FUNC_INFO, "iterator hasn't a previous item");
208
209 const QChar cur = *--pos;
210 if (Q_UNLIKELY(cur.isLowSurrogate())) {
211 Q_ASSERT(hasPrevious() && pos[-1].isHighSurrogate());
212 return QChar::surrogateToUcs4(*--pos, cur);
213 }
214 return cur.unicode();
215 }
216
217 inline char32_t previous(char32_t invalidAs = QChar::ReplacementCharacter)
218 {
219 Q_ASSERT_X(hasPrevious(), Q_FUNC_INFO, "iterator hasn't a previous item");
220
221 const QChar uc = *--pos;
222 if (Q_UNLIKELY(uc.isSurrogate())) {
223 if (Q_LIKELY(uc.isLowSurrogate() && hasPrevious() && pos[-1].isHighSurrogate()))
224 return QChar::surrogateToUcs4(*--pos, uc);
225 return invalidAs;
226 }
227
228 return uc.unicode();
229 }
230};
231
232QT_END_NAMESPACE
233
234#endif // QSTRINGITERATOR_H
The QCalendar class describes calendar systems.
Definition qcalendar.h:53
const QLocaleData *const m_data
Definition qlocale_p.h:559
QLocale::MeasurementSystem measurementSystem() const
Definition qlocale.cpp:3556
QByteArray bcp47Name(char separator='-') const
Definition qlocale.cpp:489
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()
Combined button and popup list for selecting options.
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:2224
static QString calculateFiller(qsizetype padding, char32_t fillChar, qsizetype fieldWidth, const QLocaleData *localeData)
Definition qlocale.cpp:2238
QDebug operator<<(QDebug dbg, const QLocale &l)
Definition qlocale.cpp:5439
static QLocalePrivate * findLocalePrivate(QLocale::Language language, QLocale::Script script, QLocale::Territory territory)
Definition qlocale.cpp:989
static std::optional< QString > systemLocaleString(const QLocaleData *that, QSystemLocale::QueryType type)
Definition qlocale.cpp:1038
static const QSystemLocale * systemLocale()
Definition qlocale.cpp:843
static bool checkParsed(QByteArrayView num, qsizetype used)
Definition qlocale.cpp:4852
static QString rawWeekDayName(const QLocaleData *data, const int day, QLocale::FormatType type)
Definition qlocale.cpp:3358
QDataStream & operator>>(QDataStream &ds, QLocale &l)
Definition qlocale.cpp:966
#define CheckCandidate(id)
static Q_DECL_COLD_FUNCTION void badSeparatorWarning(const char *method, char sep)
Definition qlocale.cpp:1525
static QString rawStandaloneWeekDayName(const QLocaleData *data, const int day, QLocale::FormatType type)
Definition qlocale.cpp:3382
static constexpr QLocale::NumberOptions defaultNumberOptions(QLocale::Language forLanguage)
Definition qlocale.cpp:782
static QStringView findTag(QStringView name) noexcept
Definition qlocale.cpp:629
static bool validTag(QStringView tag)
Definition qlocale.cpp:638
static qsizetype scriptIndex(QStringView code, Qt::CaseSensitivity cs) noexcept
Definition qlocale.cpp:181
static const QCalendarLocale & getMonthDataFor(const QLocalePrivate *loc, const QCalendarLocale *table)
Definition qlocale.cpp:3280
static T toIntegral_helper(const QLocalePrivate *d, QStringView str, bool *ok)
Definition qlocale.cpp:1573
static bool timeFormatContainsAP(QStringView format)
Definition qlocale.cpp:2445
size_t qHash(const QLocale &key, size_t seed) noexcept
Definition qlocale.cpp:1306
bool comparesEqual(const QLocale &loc, QLocale::Language lang)
Definition qlocale.cpp:1011
static qsizetype findLocaleIndexById(QLocaleId localeId) noexcept
Definition qlocale.cpp:499
static constexpr qsizetype locale_data_size
Definition qlocale.cpp:518
static void updateSystemPrivate()
Definition qlocale.cpp:855
static QString rawMonthName(const QCalendarLocale &localeData, const char16_t *monthsData, int month, QLocale::FormatType type)
Definition qlocale.cpp:3307
static qsizetype stringWidth(QStringView text)
Definition qlocale.cpp:2213
static QLocalePrivate * c_private() noexcept
Definition qlocale.cpp:776
static const QLocaleData * defaultData()
Definition qlocale.cpp:930
static QString rawStandaloneMonthName(const QCalendarLocale &localeData, const char16_t *monthsData, int month, QLocale::FormatType type)
Definition qlocale.cpp:3332
static QString localeString(const QLocaleData *that, QSystemLocale::QueryType type, QLocaleData::DataRange range)
Definition qlocale.cpp:1056
static const QLocaleData * systemData(qsizetype *sysIndex=nullptr)
Definition qlocale.cpp:890
static QString offsetFromAbbreviation(QString &&text)
Definition qlocale.cpp:3767
static qsizetype defaultIndex()
Definition qlocale.cpp:937
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:649
qsizetype qt_repeatCount(QStringView s) noexcept
Definition qlocale.cpp:762
QString qt_readEscapedFormatString(QStringView format, qsizetype *idx)
Definition qlocale.cpp:712
char32_t ucsFirst(const char16_t *table) const
Definition qlocale_p.h:433
QString positiveSign() const
Definition qlocale.cpp:1110
QString groupSeparator() const
Definition qlocale.cpp:1069
QSimpleParsedNumber< qint64 > stringToLongLong(QStringView str, int base, QLocale::NumberOptions options) const
Definition qlocale.cpp:4831
char32_t zeroUcs() const
Definition qlocale.cpp:1089
QString zeroDigit() const
Definition qlocale.cpp:1084
bool numberToCLocale(QStringView s, QLocale::NumberOptions number_options, NumberMode mode, CharBuff *result) const
Definition qlocale.cpp:4609
QString decimalPoint() const
Definition qlocale.cpp:1064
QString doubleToString(double d, int precision=-1, DoubleForm form=DFSignificantDigits, int width=-1, unsigned flags=NoFlags) const
Definition qlocale.cpp:4056
QLocaleId id() const
Definition qlocale_p.h:396
QString listSeparator() const
Definition qlocale.cpp:1079
QString percentSign() const
Definition qlocale.cpp:1074
@ BlankBeforePositive
Definition qlocale_p.h:264
@ AddTrailingZeroes
Definition qlocale_p.h:261
double stringToDouble(QStringView str, bool *ok, QLocale::NumberOptions options) const
Definition qlocale.cpp:4815
QString longLongToString(qint64 l, int precision=-1, int base=10, int width=-1, unsigned flags=NoFlags) const
Definition qlocale.cpp:4297
@ DoubleScientificMode
Definition qlocale_p.h:275
@ DFSignificantDigits
Definition qlocale_p.h:255
NumericData numericData(NumberMode mode) const
Definition qlocale.cpp:4382
QString exponentSeparator() const
Definition qlocale.cpp:1115
QString negativeSign() const
Definition qlocale.cpp:1105
static const QLocaleData * c() noexcept
Definition qlocale.cpp:953
QSimpleParsedNumber< quint64 > stringToUnsLongLong(QStringView str, int base, QLocale::NumberOptions options) const
Definition qlocale.cpp:4842
QString unsLongLongToString(quint64 l, int precision=-1, int base=10, int width=-1, unsigned flags=NoFlags) const
Definition qlocale.cpp:4312
QLocaleId withLikelySubtagsAdded() const noexcept
Fill in blank fields of a locale ID.
Definition qlocale.cpp:321
QLocaleId withLikelySubtagsRemoved() const noexcept
Definition qlocale.cpp:410
ushort script_id
Definition qlocale_p.h:223
bool operator==(QLocaleId other) const noexcept
Definition qlocale_p.h:192
bool matchesAll() const noexcept
Definition qlocale_p.h:201
ushort territory_id
Definition qlocale_p.h:223
QByteArray name(char separator='-') const
Definition qlocale.cpp:434
ushort language_id
Definition qlocale_p.h:223