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
qspan.h
Go to the documentation of this file.
1// Copyright (C) 2023 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QSPAN_H
6#define QSPAN_H
7
8#include <QtCore/qcompilerdetection.h>
9#include <QtCore/qtypes.h>
10#include <QtCore/qcontainerfwd.h>
11
12#include <array>
13#include <cstddef>
14#include <cassert>
15#include <initializer_list>
16#include <QtCore/q20iterator.h>
17#include <QtCore/q20memory.h>
18#ifdef __cpp_lib_span
19#include <span>
20#endif
21#include <QtCore/q20type_traits.h>
22
23QT_BEGIN_NAMESPACE
24
25// like std::dynamic_extent
26namespace q20 {
27 inline constexpr auto dynamic_extent = std::size_t(-1);
28} // namespace q20
29
30QT_BEGIN_INCLUDE_NAMESPACE
31#ifdef __cpp_lib_span
32#ifdef __cpp_lib_concepts
33namespace std::ranges {
34// Officially, these are defined in <ranges>, but that is a heavy-hitter header.
35// OTOH, <span> must specialize these variable templates, too, so we assume that
36// <span> includes some meaningful subset of <ranges> and just go ahead and use them:
37template <typename T, std::size_t E>
38constexpr inline bool enable_borrowed_range<QT_PREPEND_NAMESPACE(QSpan)<T, E>> = true;
39template <typename T, std::size_t E>
40constexpr inline bool enable_view<QT_PREPEND_NAMESPACE(QSpan)<T, E>> = true;
41} // namespace std::ranges
42#endif // __cpp_lib_concepts
43#endif // __cpp_lib_span
44QT_END_INCLUDE_NAMESPACE
45
46namespace QSpanPrivate {
47
48template <typename From, typename To>
49std::conditional_t<std::is_const_v<From>, const To &, To &> // like [forward]/6.1 COPY_CONST
50const_propagated(To &in) { return in; }
51
52template <typename T, std::size_t E> class QSpanBase;
53
54template <typename T>
56template <typename T, std::size_t E>
58template <typename T, std::size_t E>
60template <typename T>
62
63template <typename T>
65#ifdef __cpp_lib_span
66template <typename T, std::size_t E>
67struct is_std_span_helper<std::span<T, E>> : std::true_type {};
68#endif // __cpp_lib_span
69template <typename T>
71
72template <typename T>
74template <typename T, std::size_t N>
75struct is_std_array_helper<std::array<T, N>> : std::true_type {};
76template <typename T>
78
79template <typename From, typename To>
81 std::is_convertible<From(*)[], To(*)[]>; // https://eel.is/c++draft/span.cons#note-1
82template <typename From, typename To>
84
85namespace AdlTester {
86#define MAKE_ADL_TEST(what)
87 using std:: what; /* bring into scope */
88 template <typename T> using what ## _result = decltype( what (std::declval<T&&>()));
89 /* end */
90MAKE_ADL_TEST(begin)
91MAKE_ADL_TEST(data)
92MAKE_ADL_TEST(size)
93#undef MAKE_ADL_TEST
94}
95
96// Replacements for std::ranges::XXX(), but only bringing in ADL XXX()s,
97// not doing the extra work C++20 requires
98template <typename Range>
99AdlTester::begin_result<Range> adl_begin(Range &&r) { using std::begin; return begin(r); }
100template <typename Range>
101AdlTester::data_result<Range> adl_data(Range &&r) { using std::data; return data(r); }
102template <typename Range>
103AdlTester::size_result<Range> adl_size(Range &&r) { using std::size; return size(r); }
104
105// Replacement for std::ranges::iterator_t (which depends on C++20 std::ranges::begin)
106// This one uses adl_begin() instead.
107template <typename Range>
108using iterator_t = decltype(QSpanPrivate::adl_begin(std::declval<Range&>()));
109template <typename Range>
111
112template <typename T>
114protected:
115 template <typename Iterator>
117 // ### C++20: extend to contiguous_iteratorss
121 >,
124 T
125 >
126 >;
127 template <typename Iterator, typename End>
129 // ### C++20: extend to contiguous_iterators and real sentinels
132 >;
133 template <typename Range, typename = void> // wrap use of SFINAE-unfriendly iterator_t:
135 template <typename Range>
138 template <typename Range>
140 // ### C++20: extend to contiguous_iterators
146 >;
147
148 // constraints
149 template <typename Iterator>
152 , bool>;
153 template <typename Iterator, typename End>
156 , bool>;
157 template <typename Range>
159}; // class QSpanCommon
160
161template <typename T, std::size_t E>
162class QSpanBase : protected QSpanCommon<T>
163{
164 static_assert(E < size_t{(std::numeric_limits<qsizetype>::max)()},
165 "QSpan only supports extents that fit into the signed size type (qsizetype).");
166
167 template <typename S, std::size_t N>
170 , bool>;
171
172 template <typename S>
175 , bool>;
176protected:
177 using Base = QSpanCommon<T>;
178
179 // data members:
181 static constexpr qsizetype m_size = qsizetype(E);
182
183 // types and constants:
184 // (in QSpan only)
185
186 // constructors (need to be public d/t the way ctor inheriting works):
187public:
188 template <std::size_t E2 = E, std::enable_if_t<E2 == 0, bool> = true>
189 Q_IMPLICIT constexpr QSpanBase() noexcept : m_data{nullptr} {}
190
191 template <typename It, typename Base::template if_compatible_iterator<It> = true>
192 explicit constexpr QSpanBase(It first, qsizetype count)
194 {
195 Q_ASSERT(count == m_size);
196 }
197
198 template <typename It, typename End, typename Base::template if_compatible_iterator_and_sentinel<It, End> = true>
199 explicit constexpr QSpanBase(It first, End last)
200 : QSpanBase(first, last - first) {}
201
202 template <size_t N, std::enable_if_t<N == E, bool> = true>
203 Q_IMPLICIT constexpr QSpanBase(q20::type_identity_t<T> (&arr)[N]) noexcept
204 : QSpanBase(arr, N) {}
205
206 template <typename S, size_t N, if_compatible_array<S, N> = true>
207 Q_IMPLICIT constexpr QSpanBase(std::array<S, N> &arr) noexcept
208 : QSpanBase(arr.data(), N) {}
209
210 template <typename S, size_t N, if_compatible_array<S, N> = true>
211 Q_IMPLICIT constexpr QSpanBase(const std::array<S, N> &arr) noexcept
212 : QSpanBase(arr.data(), N) {}
213
214 template <typename Range, typename Base::template if_compatible_range<Range> = true>
216 : QSpanBase(QSpanPrivate::adl_data(QSpanPrivate::const_propagated<T>(r)), // no forward<>() here (std doesn't have it, either)
217 qsizetype(QSpanPrivate::adl_size(r))) // ditto, no forward<>()
218 {}
219
220 template <typename S, if_qualification_conversion<S> = true>
221 Q_IMPLICIT constexpr QSpanBase(QSpan<S, E> other) noexcept
223 {}
224
225 template <typename S, if_qualification_conversion<S> = true>
228 {}
229
230 template <typename U = T, std::enable_if_t<std::is_const_v<U>, bool> = true>
234
235#ifdef __cpp_lib_span
236 template <typename S, if_qualification_conversion<S> = true>
237 Q_IMPLICIT constexpr QSpanBase(std::span<S, E> other) noexcept
239 {}
240
241 template <typename S, if_qualification_conversion<S> = true>
242 Q_IMPLICIT constexpr QSpanBase(std::span<S> other)
244 {}
245#endif // __cpp_lib_span
246}; // class QSpanBase (fixed extent)
247
248template <typename T>
250{
251 template <typename S>
254 , bool>;
255protected:
256 using Base = QSpanCommon<T>;
257
258 // data members:
261
262 // constructors (need to be public d/t the way ctor inheriting works):
263public:
264 Q_IMPLICIT constexpr QSpanBase() noexcept : m_data{nullptr}, m_size{0} {}
265
266 template <typename It, typename Base::template if_compatible_iterator<It> = true>
269
270 template <typename It, typename End, typename Base::template if_compatible_iterator_and_sentinel<It, End> = true>
273
274 template <size_t N>
275 Q_IMPLICIT constexpr QSpanBase(q20::type_identity_t<T> (&arr)[N]) noexcept
276 : QSpanBase(arr, N) {}
277
278 template <typename S, size_t N, if_qualification_conversion<S> = true>
279 Q_IMPLICIT constexpr QSpanBase(std::array<S, N> &arr) noexcept
280 : QSpanBase(arr.data(), N) {}
281
282 template <typename S, size_t N, if_qualification_conversion<S> = true>
283 Q_IMPLICIT constexpr QSpanBase(const std::array<S, N> &arr) noexcept
284 : QSpanBase(arr.data(), N) {}
285
286 template <typename Range, typename Base::template if_compatible_range<Range> = true>
288 : QSpanBase(QSpanPrivate::adl_data(QSpanPrivate::const_propagated<T>(r)), // no forward<>() here (std doesn't have it, either)
289 qsizetype(QSpanPrivate::adl_size(r))) // ditto, no forward<>()
290 {}
291
292 template <typename S, size_t N, if_qualification_conversion<S> = true>
293 Q_IMPLICIT constexpr QSpanBase(QSpan<S, N> other) noexcept
295 {}
296
297 template <typename U = T, std::enable_if_t<std::is_const_v<U>, bool> = true>
299 : QSpanBase(il.begin(), il.size())
300 {}
301
302#ifdef __cpp_lib_span
303 template <typename S, size_t N, if_qualification_conversion<S> = true>
304 Q_IMPLICIT constexpr QSpanBase(std::span<S, N> other) noexcept
306 {}
307#endif // __cpp_lib_span
308}; // class QSpanBase (dynamic extent)
309
310} // namespace QSpanPrivate
311
312template <typename T, std::size_t E>
313class QSpan
314#ifndef Q_QDOC
315 : private QSpanPrivate::QSpanBase<T, E>
316#endif
317{
318 using Base = QSpanPrivate::QSpanBase<T, E>;
319 Q_ALWAYS_INLINE constexpr void verify([[maybe_unused]] qsizetype pos = 0,
320 [[maybe_unused]] qsizetype n = 1) const
321 {
322 Q_ASSERT(pos >= 0);
323 Q_ASSERT(pos <= size());
324 Q_ASSERT(n >= 0);
325 Q_ASSERT(n <= size() - pos);
326 }
327
328 template <std::size_t N>
329 static constexpr bool subspan_always_succeeds_v = N <= E && E != q20::dynamic_extent;
330public:
331 // constants and types
333#ifdef QT_COMPILER_HAS_LWG3346
335 using element_type = T;
336#endif
337 using size_type = qsizetype; // difference to std::span
338 using difference_type = qptrdiff; // difference to std::span
339 using pointer = T*;
340 using const_pointer = const T*;
341 using reference = T&;
342 using const_reference = const T&;
343 using iterator = pointer; // implementation-defined choice
344 using const_iterator = const_pointer; // implementation-defined choice
345 using reverse_iterator = std::reverse_iterator<iterator>;
346 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
347 static constexpr std::size_t extent = E;
348
349 // [span.cons], constructors, copy, and assignment
350 using Base::Base;
351#ifdef Q_QDOC
352 template <typename It> using if_compatible_iterator = bool;
353 template <typename S> using if_qualification_conversion = bool;
354 template <typename Range> using if_compatible_range = bool;
355 template <typename It, if_compatible_iterator<It> = true> constexpr QSpan(It first, qsizetype count);
356 template <typename It, if_compatible_iterator<It> = true> constexpr QSpan(It first, It last);
357 template <size_t N> constexpr QSpan(q20::type_identity_t<T> (&arr)[N]) noexcept;
358 template <typename S, size_t N, if_qualification_conversion<S> = true> constexpr QSpan(std::array<S, N> &arr) noexcept;
359 template <typename S, size_t N, if_qualification_conversion<S> = true> constexpr QSpan(const std::array<S, N> &arr) noexcept;
360 template <typename Range, if_compatible_range<Range> = true> constexpr QSpan(Range &&r);
361 template <typename S, size_t N, if_qualification_conversion<S> = true> constexpr QSpan(QSpan<S, N> other) noexcept;
362 template <typename S, size_t N, if_qualification_conversion<S> = true> constexpr QSpan(std::span<S, N> other) noexcept;
364#endif // Q_QDOC
365
366 // [span.obs]
367 [[nodiscard]] constexpr size_type size() const noexcept { return this->m_size; }
368 [[nodiscard]] constexpr size_type size_bytes() const noexcept { return size() * sizeof(T); }
369 [[nodiscard]] constexpr bool empty() const noexcept { return size() == 0; }
370
371 // [span.elem]
372 [[nodiscard]] constexpr reference operator[](size_type idx) const
373 { verify(idx); return data()[idx]; }
374 [[nodiscard]] constexpr reference front() const { verify(); return *data(); }
375 [[nodiscard]] constexpr reference back() const { verify(); return data()[size() - 1]; }
376 [[nodiscard]] constexpr pointer data() const noexcept { return this->m_data; }
377
378 // [span.iterators]
379 [[nodiscard]] constexpr iterator begin() const noexcept { return data(); }
380 [[nodiscard]] constexpr iterator end() const noexcept { return data() + size(); }
381 [[nodiscard]] constexpr const_iterator cbegin() const noexcept { return begin(); }
382 [[nodiscard]] constexpr const_iterator cend() const noexcept { return end(); }
383 [[nodiscard]] constexpr reverse_iterator rbegin() const noexcept { return reverse_iterator{end()}; }
384 [[nodiscard]] constexpr reverse_iterator rend() const noexcept { return reverse_iterator{begin()}; }
385 [[nodiscard]] constexpr const_reverse_iterator crbegin() const noexcept { return rbegin(); }
386 [[nodiscard]] constexpr const_reverse_iterator crend() const noexcept { return rend(); }
387
388 // [span.sub]
389 template <std::size_t Count>
390 [[nodiscard]] constexpr QSpan<T, Count> first() const
392 {
393 static_assert(Count <= E,
394 "Count cannot be larger than the span's extent.");
395 verify(0, Count);
396 return QSpan<T, Count>{data(), Count};
397 }
398
399 template <std::size_t Count>
400 [[nodiscard]] constexpr QSpan<T, Count> last() const
402 {
403 static_assert(Count <= E,
404 "Count cannot be larger than the span's extent.");
405 verify(0, Count);
406 return QSpan<T, Count>{data() + (size() - Count), Count};
407 }
408
409 template <std::size_t Offset>
410 [[nodiscard]] constexpr auto subspan() const
412 {
413 static_assert(Offset <= E,
414 "Offset cannot be larger than the span's extent.");
415 verify(Offset, 0);
416 if constexpr (E == q20::dynamic_extent)
417 return QSpan<T>{data() + Offset, qsizetype(size() - Offset)};
418 else
419 return QSpan<T, E - Offset>{data() + Offset, qsizetype(E - Offset)};
420 }
421
422 template <std::size_t Offset, std::size_t Count>
423 [[nodiscard]] constexpr auto subspan() const
425 { return subspan<Offset>().template first<Count>(); }
426
427 [[nodiscard]] constexpr QSpan<T> first(size_type n) const { verify(0, n); return {data(), n}; }
428 [[nodiscard]] constexpr QSpan<T> last(size_type n) const { verify(0, n); return {data() + (size() - n), n}; }
429 [[nodiscard]] constexpr QSpan<T> subspan(size_type pos) const { verify(pos, 0); return {data() + pos, size() - pos}; }
430 [[nodiscard]] constexpr QSpan<T> subspan(size_type pos, size_type n) const { return subspan(pos).first(n); }
431
432 // Qt-compatibility API:
433 [[nodiscard]] constexpr bool isEmpty() const noexcept { return empty(); }
434 // nullary first()/last() clash with first<>() and last<>(), so they're not provided for QSpan
435 [[nodiscard]] constexpr QSpan<T> sliced(size_type pos) const { return subspan(pos); }
436 [[nodiscard]] constexpr QSpan<T> sliced(size_type pos, size_type n) const { return subspan(pos, n); }
437 [[nodiscard]] constexpr QSpan<T> chopped(size_type n) const { verify(0, n); return first(size() - n); }
438
439#ifdef __cpp_concepts
440# define QT_ONLY_IF_DYNAMIC_SPAN(DECL)
441 DECL requires(E == q20::dynamic_extent)
442#else
443# define QT_ONLY_IF_DYNAMIC_SPAN(DECL)
444 template <size_t M = E, typename = std::enable_if_t<M == q20::dynamic_extent>> DECL
445#endif
447 constexpr void slice(size_type pos)
448 )
449 { *this = sliced(pos); }
451 constexpr void slice(size_type pos, size_type n)
452 )
453 { *this = sliced(pos, n); }
455 constexpr void chop(size_type n)
456 )
457 { *this = chopped(n); }
458#undef QT_ONLY_IF_DYNAMIC_SPAN
459
460private:
461 // [span.objectrep]
462 [[nodiscard]] friend
463 QSpan<const std::byte, E == q20::dynamic_extent ? q20::dynamic_extent : E * sizeof(T)>
464 as_bytes(QSpan s) noexcept
465 {
466 using R = QSpan<const std::byte, E == q20::dynamic_extent ? q20::dynamic_extent : E * sizeof(T)>;
467 return R{reinterpret_cast<const std::byte *>(s.data()), s.size_bytes()};
468 }
469
470 template <typename U>
471 using if_mutable = std::enable_if_t<!std::is_const_v<U>, bool>;
472
473#ifndef Q_QDOC
474 template <typename T2 = T, if_mutable<T2> = true>
475#endif
476 [[nodiscard]] friend
477 QSpan<std::byte, E == q20::dynamic_extent ? q20::dynamic_extent : E * sizeof(T)>
479 {
480 using R = QSpan<std::byte, E == q20::dynamic_extent ? q20::dynamic_extent : E * sizeof(T)>;
481 return R{reinterpret_cast<std::byte *>(s.data()), s.size_bytes()};
482 }
483}; // class QSpan
484
485// [span.deduct]
486template <class It, class EndOrSize>
487QSpan(It, EndOrSize) -> QSpan<std::remove_reference_t<q20::iter_reference_t<It>>>;
488template <class T, std::size_t N>
489QSpan(T (&)[N]) -> QSpan<T, N>;
490template <class T, std::size_t N>
491QSpan(std::array<T, N> &) -> QSpan<T, N>;
492template <class T, std::size_t N>
493QSpan(const std::array<T, N> &) -> QSpan<const T, N>;
494template <class R>
495QSpan(R&&) -> QSpan<std::remove_reference_t<QSpanPrivate::range_reference_t<R>>>;
496
497QT_END_NAMESPACE
498
499#endif // QSPAN_H
\inmodule QtCore
QDataStream & operator>>(QDataStream &in, QByteArray &ba)
Reads a byte array into ba from the stream in and returns a reference to the stream.
quint16 qChecksum(QByteArrayView data, Qt::ChecksumType standard)
Definition qlist.h:81
static QLatin1StringView scriptToCode(QLocale::Script script)
Definition qlocale.cpp:259
QString toUpper(const QString &str, bool *ok) const
static const QLocalePrivate * get(const QLocale &l)
Definition qlocale_p.h:601
QString toLower(const QString &str, bool *ok) const
quint16 languageId() const
Definition qlocale_p.h:586
static QLocale::Language codeToLanguage(QStringView code, QLocale::LanguageCodeTypes codeTypes=QLocale::AnyLanguageCode) noexcept
Definition qlocale.cpp:109
const QLocaleData *const m_data
Definition qlocale_p.h:619
QLatin1StringView scriptCode() const
Definition qlocale_p.h:596
QLocale::MeasurementSystem measurementSystem() const
Definition qlocale.cpp:3550
quint16 territoryId() const
Definition qlocale_p.h:587
static QLatin1StringView territoryToCode(QLocale::Territory territory)
Definition qlocale.cpp:267
qsizetype m_index
Definition qlocale_p.h:621
static QLocale::Territory codeToTerritory(QStringView code) noexcept
Definition qlocale.cpp:215
static std::array< char, 4 > languageToCode(QLocale::Language language, QLocale::LanguageCodeTypes codeTypes=QLocale::AnyLanguageCode)
Definition qlocale.cpp:234
static QLocale::Script codeToScript(QStringView code) noexcept
Definition qlocale.cpp:209
QLocale::NumberOptions m_numberOptions
Definition qlocale_p.h:622
QLatin1StringView territoryCode() const
Definition qlocale_p.h:598
constexpr QLocalePrivate(const QLocaleData *data, qsizetype index, QLocale::NumberOptions numberOptions=QLocale::DefaultNumberOptions, int refs=0)
Definition qlocale_p.h:580
std::array< char, 4 > languageCode(QLocale::LanguageCodeTypes codeTypes=QLocale::AnyLanguageCode) const
Definition qlocale_p.h:592
static QBasicAtomicInt s_generation
Definition qlocale_p.h:624
QByteArray bcp47Name(char separator='-') const
Definition qlocale.cpp:495
QBasicAtomicInt ref
Definition qlocale_p.h:620
QSpanCommon< T > Base
Definition qspan.h:177
constexpr QSpanBase(It first, qsizetype count)
Definition qspan.h:192
static constexpr qsizetype m_size
Definition qspan.h:181
constexpr QSpanBase(It first, End last)
Definition qspan.h:199
Definition qspan.h:317
constexpr bool empty() const noexcept
Definition qspan.h:369
constexpr pointer data() const noexcept
Definition qspan.h:376
static constexpr std::size_t extent
Definition qspan.h:347
constexpr reverse_iterator rbegin() const noexcept
Definition qspan.h:383
constexpr reference front() const
Definition qspan.h:374
constexpr QSpan< T > sliced(size_type pos, size_type n) const
Definition qspan.h:436
constexpr QSpan< T > sliced(size_type pos) const
Definition qspan.h:435
const T * const_pointer
Definition qspan.h:340
constexpr size_type size() const noexcept
Definition qspan.h:367
const_pointer const_iterator
Definition qspan.h:344
T & reference
Definition qspan.h:341
constexpr iterator end() const noexcept
Definition qspan.h:380
constexpr const_iterator cbegin() const noexcept
Definition qspan.h:381
constexpr QSpan< T > subspan(size_type pos, size_type n) const
Definition qspan.h:430
constexpr const_iterator cend() const noexcept
Definition qspan.h:382
constexpr bool isEmpty() const noexcept
Definition qspan.h:433
constexpr reverse_iterator rend() const noexcept
Definition qspan.h:384
constexpr QSpan< T, Count > last() const noexcept(subspan_always_succeeds_v< Count >)
Definition qspan.h:400
T * pointer
Definition qspan.h:339
constexpr QSpan< T > last(size_type n) const
Definition qspan.h:428
constexpr const_reverse_iterator crend() const noexcept
Definition qspan.h:386
pointer iterator
Definition qspan.h:343
friend QSpan< const std::byte, E==q20::dynamic_extent ? q20::dynamic_extent :E *sizeof(T)> as_bytes(QSpan s) noexcept
Definition qspan.h:464
constexpr size_type size_bytes() const noexcept
Definition qspan.h:368
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition qspan.h:346
constexpr const_reverse_iterator crbegin() const noexcept
Definition qspan.h:385
constexpr reference operator[](size_type idx) const
Definition qspan.h:372
constexpr QSpan< T > first(size_type n) const
Definition qspan.h:427
constexpr reference back() const
Definition qspan.h:375
constexpr QSpan< T > subspan(size_type pos) const
Definition qspan.h:429
constexpr auto subspan() const noexcept(subspan_always_succeeds_v< Offset+Count >)
Definition qspan.h:423
constexpr QSpan< T, Count > first() const noexcept(subspan_always_succeeds_v< Count >)
Definition qspan.h:390
const T & const_reference
Definition qspan.h:342
std::reverse_iterator< iterator > reverse_iterator
Definition qspan.h:345
constexpr QSpan< T > chopped(size_type n) const
Definition qspan.h:437
friend QSpan< std::byte, E==q20::dynamic_extent ? q20::dynamic_extent :E *sizeof(T)> as_writable_bytes(QSpan s) noexcept
Definition qspan.h:478
constexpr iterator begin() const noexcept
Definition qspan.h:379
constexpr auto subspan() const noexcept(subspan_always_succeeds_v< Offset >)
Definition qspan.h:410
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:177
qsizetype fallbackLocaleIndex() const
Definition qlocale_p.h:628
@ StringToAlternateQuotation
Definition qlocale_p.h:181
@ DateTimeToStringShort
Definition qlocale_p.h:169
@ StandaloneMonthNameLong
Definition qlocale_p.h:187
@ ListToSeparatedString
Definition qlocale_p.h:183
@ StandaloneDayNameNarrow
Definition qlocale_p.h:192
@ StandaloneMonthNameNarrow
Definition qlocale_p.h:189
@ StringToStandardQuotation
Definition qlocale_p.h:180
@ StandaloneDayNameShort
Definition qlocale_p.h:191
@ StandaloneDayNameLong
Definition qlocale_p.h:190
@ StandaloneMonthNameShort
Definition qlocale_p.h:188
virtual QLocale fallbackLocale() const
virtual QVariant query(QueryType type, QVariant &&in=QVariant()) const
AdlTester::size_result< Range > adl_size(Range &&r)
Definition qspan.h:103
std::conditional_t< std::is_const_v< From >, const To &, To & > const_propagated(To &in)
Definition qspan.h:50
decltype(QSpanPrivate::adl_begin(std::declval< Range & >())) iterator_t
Definition qspan.h:108
AdlTester::data_result< Range > adl_data(Range &&r)
Definition qspan.h:101
AdlTester::begin_result< Range > adl_begin(Range &&r)
Definition qspan.h:99
constexpr bool is_qualification_conversion_v
Definition qspan.h:83
std::is_convertible< From(*)[], To(*)[]> is_qualification_conversion
Definition qspan.h:80
Combined button and popup list for selecting options.
constexpr char ascii_space_chars[]
Definition qlocale_p.h:91
constexpr auto makeCharacterSetMatch() noexcept
Definition qlocale_p.h:100
constexpr auto dynamic_extent
Definition qspan.h:27
static constexpr bool isLowerCaseAscii(char c)
static const quint16 crc_tbl[16]
QByteArray qCompress(const uchar *data, qsizetype nbytes, int compressionLevel)
ZLibOp
@ Decompression
static Q_DECL_COLD_FUNCTION const char * zlibOpAsString(ZLibOp op)
static qsizetype q_fromPercentEncoding(QByteArrayView src, char percent, QSpan< char > buffer)
static QByteArray toCase_template(T &input, uchar(*lookup)(uchar))
int qstrnicmp(const char *str1, qsizetype len1, const char *str2, qsizetype len2)
static qsizetype lastIndexOfHelper(const char *haystack, qsizetype l, const char *needle, qsizetype ol, qsizetype from)
static constexpr bool isUpperCaseAscii(char c)
static QByteArray xxflate(ZLibOp op, QArrayDataPointer< char > out, QByteArrayView input, qxp::function_ref< int(z_stream *) const > init, qxp::function_ref< int(z_stream *, size_t) const > processChunk, qxp::function_ref< void(z_stream *) const > deinit)
static constexpr uchar asciiLower(uchar c)
static qsizetype countCharHelper(QByteArrayView haystack, char needle) noexcept
static constexpr uchar asciiUpper(uchar c)
Q_CORE_EXPORT char * qstrncpy(char *dst, const char *src, size_t len)
Q_CORE_EXPORT int qstrnicmp(const char *, const char *, size_t len)
Q_CORE_EXPORT int qstricmp(const char *, const char *)
Q_CORE_EXPORT char * qstrdup(const char *)
Q_CORE_EXPORT char * qstrcpy(char *dst, const char *src)
Q_DECL_PURE_FUNCTION Q_CORE_EXPORT const void * qmemrchr(const void *s, int needle, size_t n) noexcept
Q_CORE_EXPORT int qstrcmp(const char *str1, const char *str2)
#define __has_include(x)
#define __has_feature(x)
bool qt_splitLocaleName(QStringView name, QStringView *lang=nullptr, QStringView *script=nullptr, QStringView *cntry=nullptr) noexcept
Definition qlocale.cpp:663
Q_DECLARE_TYPEINFO(QLocaleData::GroupSizes, Q_PRIMITIVE_TYPE)
Q_DECLARE_TYPEINFO(QLocaleId, Q_PRIMITIVE_TYPE)
qsizetype qt_repeatCount(QStringView s) noexcept
Definition qlocale.cpp:776
constexpr bool ascii_isspace(uchar c) noexcept
Definition qlocale_p.h:647
#define ForEachQLocaleRange(X)
Definition qlocale_p.h:531
QString qt_readEscapedFormatString(QStringView format, qsizetype *idx)
Definition qlocale.cpp:726
StrayCharacterMode
@ TrailingJunkAllowed
@ TrailingJunkProhibited
Q_CORE_EXPORT double qstrntod(const char *s00, qsizetype len, char const **se, bool *ok)
double qstrtod(const char *s00, char const **se, bool *ok)
QSimpleParsedNumber< double > qt_asciiToDouble(const char *num, qsizetype numLen, StrayCharacterMode strayCharMode=TrailingJunkProhibited)
QByteArray qdtoAscii(double d, QLocaleData::DoubleForm form, int precision, bool uppercase)
char * qulltoa2(char *p, qulonglong n, int base)
int wholePartSpace(double d)
QString qdtoBasicLatin(double d, QLocaleData::DoubleForm form, int precision, bool uppercase)
UcsInt unicodeForDigit(uint digit, UcsInt zero)
QString qulltoa(qulonglong l, int base, const QStringView zero)
QSimpleParsedNumber< qulonglong > qstrntoull(const char *nptr, qsizetype size, int base)
void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, char *buf, qsizetype bufSize, bool &sign, int &length, int &decpt)
QString qulltoBasicLatin(qulonglong l, int base, bool negative)
constexpr size_t qHash(const QSize &s, size_t seed=0) noexcept
Definition qsize.h:192
#define MAKE_ADL_TEST(what)
Definition qspan.h:86
QSpan(const std::array< T, N > &) -> QSpan< const T, N >
#define QT_ONLY_IF_DYNAMIC_SPAN(DECL)
Definition qspan.h:443
QSpan(T(&)[N]) -> QSpan< T, N >
QSpan(std::array< T, N > &) -> QSpan< T, N >
qregisteruint mask[Extent]
Definition qlocale_p.h:52
static constexpr int WordBits
Definition qlocale_p.h:50
static constexpr int MaxRange
Definition qlocale_p.h:51
constexpr auto maskLocation(uchar c) const noexcept
Definition qlocale_p.h:78
constexpr QCharacterSetMatch(std::string_view set) noexcept
Definition qlocale_p.h:54
constexpr bool matches(uchar c) const noexcept
Definition qlocale_p.h:63
QStringView viewListEntry(const char16_t *table, qsizetype index) const
Definition qlocale_p.h:489
char32_t ucsFirst(const char16_t *table) const
Definition qlocale_p.h:493
QString getData(const char16_t *table) const
Definition qlocale_p.h:475
QString getListEntry(const char16_t *table, qsizetype index) const
Definition qlocale_p.h:485
QStringView viewData(const char16_t *table) const
Definition qlocale_p.h:481
void setZero(QStringView zero)
Definition qlocale_p.h:377
bool fractionalIsGroup() const
Definition qlocale_p.h:439
const GroupSizes & groupSizes() const
Definition qlocale_p.h:403
bool isValid(NumberMode mode) const
Definition qlocale_p.h:405
const GroupSizes grouping
Definition qlocale_p.h:371
qint8 digitValue(char32_t digit) const
Definition qlocale_p.h:418
QString positiveSign() const
Definition qlocale.cpp:1121
static float convertDoubleToFloat(double d, bool *ok)
Definition qlocale_p.h:339
QString groupSeparator() const
Definition qlocale.cpp:1080
QSimpleParsedNumber< qint64 > stringToLongLong(QStringView str, int base, QLocale::NumberOptions options) const
Definition qlocale.cpp:4925
Q_AUTOTEST_EXPORT char32_t zeroUcs() const
Definition qlocale.cpp:1100
quint8 m_grouping_least
Definition qlocale_p.h:572
QString zeroDigit() const
Definition qlocale.cpp:1095
bool numberToCLocale(QStringView s, QLocale::NumberOptions number_options, NumberMode mode, CharBuff *result) const
Definition qlocale.cpp:4651
quint8 m_grouping_higher
Definition qlocale_p.h:571
QString decimalPoint() const
Definition qlocale.cpp:1075
QString doubleToString(double d, int precision=-1, DoubleForm form=DFSignificantDigits, int width=-1, unsigned flags=NoFlags) const
Definition qlocale.cpp:4079
static Q_AUTOTEST_EXPORT bool allLocaleDataRows(bool(*check)(qsizetype, const QLocaleData &))
Definition qlocale.cpp:525
quint8 m_weekend_start
Definition qlocale_p.h:568
quint8 m_currency_digits
Definition qlocale_p.h:565
QLocaleId id() const
Definition qlocale_p.h:456
QString listSeparator() const
Definition qlocale.cpp:1090
static QSimpleParsedNumber< quint64 > bytearrayToUnsLongLong(QByteArrayView num, int base)
Definition qlocale.cpp:4972
QString percentSign() const
Definition qlocale.cpp:1085
@ BlankBeforePositive
Definition qlocale_p.h:270
@ AddTrailingZeroes
Definition qlocale_p.h:267
double stringToDouble(QStringView str, bool *ok, QLocale::NumberOptions options) const
Definition qlocale.cpp:4909
QString longLongToString(qint64 l, int precision=-1, int base=10, int width=-1, unsigned flags=NoFlags) const
Definition qlocale.cpp:4322
@ DoubleScientificMode
Definition qlocale_p.h:281
@ DoubleStandardMode
Definition qlocale_p.h:281
@ DFSignificantDigits
Definition qlocale_p.h:261
quint8 m_first_day_of_week
Definition qlocale_p.h:567
quint8 m_weekend_end
Definition qlocale_p.h:569
quint8 m_currency_rounding
Definition qlocale_p.h:566
QString exponentSeparator() const
Definition qlocale.cpp:1126
QString negativeSign() const
Definition qlocale.cpp:1116
QSimpleParsedNumber< quint64 > stringToUnsLongLong(QStringView str, int base, QLocale::NumberOptions options) const
Definition qlocale.cpp:4936
QString unsLongLongToString(quint64 l, int precision=-1, int base=10, int width=-1, unsigned flags=NoFlags) const
Definition qlocale.cpp:4337
quint8 m_grouping_first
Definition qlocale_p.h:570
QLocaleId withLikelySubtagsAdded() const noexcept
Definition qlocale.cpp:327
QLocaleId withLikelySubtagsRemoved() const noexcept
Definition qlocale.cpp:416
ushort script_id
Definition qlocale_p.h:242
bool operator==(QLocaleId other) const noexcept
Definition qlocale_p.h:211
bool matchesAll() const noexcept
Definition qlocale_p.h:220
bool isValid() const noexcept
Definition qlocale_p.h:215
bool operator!=(QLocaleId other) const noexcept
Definition qlocale_p.h:213
bool acceptScriptTerritory(QLocaleId other) const noexcept
Definition qlocale_p.h:231
ushort territory_id
Definition qlocale_p.h:242
bool acceptLanguage(quint16 lang) const noexcept
Definition qlocale_p.h:225
ushort language_id
Definition qlocale_p.h:242
CurrencyToStringArgument(const QVariant &v, const QString &s)
Definition qlocale_p.h:138