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
qbytearray.h
Go to the documentation of this file.
1// Copyright (C) 2022 The Qt Company Ltd.
2// Copyright (C) 2016 Intel Corporation.
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 QBYTEARRAY_H
7#define QBYTEARRAY_H
8
9#include <QtCore/qrefcount.h>
10#include <QtCore/qnamespace.h>
11#include <QtCore/qarraydata.h>
12#include <QtCore/qarraydatapointer.h>
13#include <QtCore/qcompare.h>
14#include <QtCore/qcontainerfwd.h>
15#include <QtCore/qbytearrayalgorithms.h>
16#include <QtCore/qbytearrayview.h>
17
18#include <stdlib.h>
19#include <string.h>
20
21#include <string>
22#include <iterator>
23
24#ifndef QT5_NULL_STRINGS
25// Would ideally be off, but in practice breaks too much (Qt 6.0).
26#define QT5_NULL_STRINGS 1
27#endif
28
29#ifdef truncate
30#error qbytearray.h must be included before any header file that defines truncate
31#endif
32
33#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
34Q_FORWARD_DECLARE_CF_TYPE(CFData);
35Q_FORWARD_DECLARE_OBJC_CLASS(NSData);
36#endif
37
38#if defined(Q_OS_WASM) || defined(Q_QDOC)
39namespace emscripten {
40 class val;
41}
42#endif
43
44class tst_QByteArray;
45
46QT_BEGIN_NAMESPACE
47
48class QString;
49class QDataStream;
50
51using QByteArrayData = QArrayDataPointer<char>;
52
53# define QByteArrayLiteral(str)
54 (QByteArray(QByteArrayData(nullptr, const_cast<char *>(str), sizeof(str) - 1)))
55 /**/
56
57class Q_CORE_EXPORT QByteArray
58{
59public:
60 using DataPointer = QByteArrayData;
61private:
62 typedef QTypedArrayData<char> Data;
63
64 DataPointer d;
65 static const char _empty;
66
67 friend class ::tst_QByteArray;
68
69 template <typename InputIterator>
70 using if_input_iterator = QtPrivate::IfIsInputIterator<InputIterator>;
71public:
72 enum Base64Option {
73 Base64Encoding = 0,
74 Base64UrlEncoding = 1,
75
76 KeepTrailingEquals = 0,
77 OmitTrailingEquals = 2,
78
79 IgnoreBase64DecodingErrors = 0,
80 AbortOnBase64DecodingErrors = 4,
81 };
82 Q_DECLARE_FLAGS(Base64Options, Base64Option)
83
84 enum class Base64DecodingStatus {
85 Ok,
86 IllegalInputLength,
87 IllegalCharacter,
88 IllegalPadding,
89 };
90
91 constexpr QByteArray() noexcept = default;
92 QByteArray(const char *, qsizetype size = -1);
93 QByteArray(qsizetype size, char c);
94 QByteArray(qsizetype size, Qt::Initialization);
95 explicit QByteArray(QByteArrayView v) : QByteArray(v.data(), v.size()) {}
96 Q_DECL_CONSTEXPR_DTOR QByteArray(const QByteArray &other) noexcept : d(other.d) {}
97#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
98 Q_DECL_CONSTEXPR_DTOR ~QByteArray() = default;
99#endif
100
101 QT_CORE_CONSTEXPR_DTOR_INLINE_SINCE(6, 13)
102 QByteArray &operator=(const QByteArray &) noexcept;
103 QByteArray &operator=(const char *str);
104 Q_DECL_CONSTEXPR_DTOR QByteArray(QByteArray &&other) noexcept = default;
105 Q_DECL_CONSTEXPR_DTOR
106 QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QByteArray)
107 constexpr void swap(QByteArray &other) noexcept
108 { d.swap(other.d); }
109
110 constexpr bool isEmpty() const noexcept { return size() == 0; }
111 void resize(qsizetype size);
112 void resize(qsizetype size, char c);
113 void resizeForOverwrite(qsizetype size);
114
115 QByteArray &fill(char ch);
116 QByteArray &fill(char c, qsizetype size);
117
118 inline qsizetype capacity() const;
119 inline void reserve(qsizetype size);
120 inline void squeeze();
121
122#ifndef QT_NO_CAST_FROM_BYTEARRAY
123 inline operator const char *() const;
124 inline operator const void *() const;
125#endif
126
127 // Some compilers consider this conversion ambiguous, so
128 // we're not offering it there:
129 // * QCC 8.3 on QNX
130 // * GHS 2022.1.4 on INTEGRITY
131#if (!defined(Q_OS_QNX) || !defined(Q_CC_GNU_ONLY) || Q_CC_GNU_ONLY > 803) &&
132 (!defined(Q_CC_GHS) || !defined(__GHS_VERSION_NUMBER) || __GHS_VERSION_NUMBER > 202214)
133# define QT_BYTEARRAY_CONVERTS_TO_STD_STRING_VIEW
134 constexpr Q_IMPLICIT operator std::string_view() const noexcept
135 { return std::string_view(data(), std::size_t(size())); }
136#endif
137
138 inline char *data();
139 constexpr
140 inline const char *data() const noexcept;
141 constexpr
142 const char *constData() const noexcept { return data(); }
143 inline void detach();
144 inline bool isDetached() const;
145 inline bool isSharedWith(const QByteArray &other) const noexcept
146 { return data() == other.data() && size() == other.size(); }
147 void clear();
148
149 constexpr
150 inline char at(qsizetype i) const;
151 constexpr
152 inline char operator[](qsizetype i) const;
153 [[nodiscard]] inline char &operator[](qsizetype i);
154 [[nodiscard]] constexpr char front() const { return at(0); }
155 [[nodiscard]] inline char &front();
156 [[nodiscard]] constexpr char back() const { return at(size() - 1); }
157 [[nodiscard]] inline char &back();
158
159 QT_CORE_INLINE_SINCE(6, 8)
160 qsizetype indexOf(char c, qsizetype from = 0) const;
161 qsizetype indexOf(QByteArrayView bv, qsizetype from = 0) const
162 { return QByteArrayView(begin(), size()).indexOf(bv, from); }
163
164 QT_CORE_INLINE_SINCE(6, 8)
165 qsizetype lastIndexOf(char c, qsizetype from = -1) const;
166 qsizetype lastIndexOf(QByteArrayView bv) const
167 { return lastIndexOf(bv, size()); }
168 qsizetype lastIndexOf(QByteArrayView bv, qsizetype from) const
169 { return QByteArrayView(begin(), size()).lastIndexOf(bv, from); }
170
171 inline bool contains(char c) const;
172 inline bool contains(QByteArrayView bv) const;
173 qsizetype count(char c) const;
174 qsizetype count(QByteArrayView bv) const
175 { return QByteArrayView(begin(), size()).count(bv); }
176
177 inline int compare(QByteArrayView a) const noexcept;
178 inline int compare(QByteArrayView a, Qt::CaseSensitivity cs) const noexcept;
179
180#if QT_CORE_REMOVED_SINCE(6, 7)
181 QByteArray left(qsizetype len) const;
182 QByteArray right(qsizetype len) const;
183 QByteArray mid(qsizetype index, qsizetype len = -1) const;
184 QByteArray first(qsizetype n) const;
185 QByteArray last(qsizetype n) const;
186 QByteArray sliced(qsizetype pos) const;
187 QByteArray sliced(qsizetype pos, qsizetype n) const;
188 QByteArray chopped(qsizetype len) const;
189#else
190 [[nodiscard]] QByteArray left(qsizetype n) const &
191 {
192 if (n >= size())
193 return *this;
194 return first(qMax(n, 0));
195 }
196 [[nodiscard]] QByteArray left(qsizetype n) &&
197 {
198 if (n >= size())
199 return std::move(*this);
200 return std::move(*this).first(qMax(n, 0));
201 }
202 [[nodiscard]] QByteArray right(qsizetype n) const &
203 {
204 if (n >= size())
205 return *this;
206 return last(qMax(n, 0));
207 }
208 [[nodiscard]] QByteArray right(qsizetype n) &&
209 {
210 if (n >= size())
211 return std::move(*this);
212 return std::move(*this).last(qMax(n, 0));
213 }
214 [[nodiscard]] QByteArray mid(qsizetype index, qsizetype len = -1) const &;
215 [[nodiscard]] QByteArray mid(qsizetype index, qsizetype len = -1) &&;
216
217 [[nodiscard]] QByteArray first(qsizetype n) const &
218 { verify(0, n); return sliced(0, n); }
219 [[nodiscard]] QByteArray last(qsizetype n) const &
220 { verify(0, n); return sliced(size() - n, n); }
221 [[nodiscard]] QByteArray sliced(qsizetype pos) const &
222 { verify(pos, 0); return sliced(pos, size() - pos); }
223 [[nodiscard]] QByteArray sliced(qsizetype pos, qsizetype n) const &
224 { verify(pos, n); return QByteArray(d.data() + pos, n); }
225 [[nodiscard]] QByteArray chopped(qsizetype len) const &
226 { verify(0, len); return sliced(0, size() - len); }
227
228 [[nodiscard]] QByteArray first(qsizetype n) &&
229 {
230 verify(0, n);
231 resize(n); // may detach and allocate memory
232 return std::move(*this);
233 }
234 [[nodiscard]] QByteArray last(qsizetype n) &&
235 { verify(0, n); return sliced_helper(*this, size() - n, n); }
236 [[nodiscard]] QByteArray sliced(qsizetype pos) &&
237 { verify(pos, 0); return sliced_helper(*this, pos, size() - pos); }
238 [[nodiscard]] QByteArray sliced(qsizetype pos, qsizetype n) &&
239 { verify(pos, n); return sliced_helper(*this, pos, n); }
240 [[nodiscard]] QByteArray chopped(qsizetype len) &&
241 { verify(0, len); chop(len); return std::move(*this); }
242#endif
243
244 bool startsWith(QByteArrayView bv) const
245 { return QByteArrayView(begin(), size()).startsWith(bv); }
246 bool startsWith(char c) const { return size() > 0 && front() == c; }
247
248 bool endsWith(char c) const { return size() > 0 && back() == c; }
249 bool endsWith(QByteArrayView bv) const
250 { return QByteArrayView(begin(), size()).endsWith(bv); }
251
252 bool isUpper() const;
253 bool isLower() const;
254
255 [[nodiscard]] bool isValidUtf8() const noexcept
256 {
257 return QtPrivate::isValidUtf8(qToByteArrayViewIgnoringNull(*this));
258 }
259
260 void truncate(qsizetype pos);
261 void chop(qsizetype n);
262
263 QByteArray &slice(qsizetype pos)
264 { verify(pos, 0); return remove(0, pos); }
265 QByteArray &slice(qsizetype pos, qsizetype n)
266 {
267 verify(pos, n);
268 if (isNull())
269 return *this;
270 resize(pos + n);
271 return remove(0, pos);
272 }
273
274#if !defined(Q_QDOC)
275 [[nodiscard]] QByteArray toLower() const &
276 { return toLower_helper(*this); }
277 [[nodiscard]] QByteArray toLower() &&
278 { return toLower_helper(*this); }
279 [[nodiscard]] QByteArray toUpper() const &
280 { return toUpper_helper(*this); }
281 [[nodiscard]] QByteArray toUpper() &&
282 { return toUpper_helper(*this); }
283 [[nodiscard]] QByteArray trimmed() const &
284 { return trimmed_helper(*this); }
285 [[nodiscard]] QByteArray trimmed() &&
286 { return trimmed_helper(*this); }
287 [[nodiscard]] QByteArray simplified() const &
288 { return simplified_helper(*this); }
289 [[nodiscard]] QByteArray simplified() &&
290 { return simplified_helper(*this); }
291#else
292 [[nodiscard]] QByteArray toLower() const;
293 [[nodiscard]] QByteArray toUpper() const;
294 [[nodiscard]] QByteArray trimmed() const;
295 [[nodiscard]] QByteArray simplified() const;
296#endif
297
298 [[nodiscard]] QByteArray leftJustified(qsizetype width, char fill = ' ', bool truncate = false) const;
299 [[nodiscard]] QByteArray rightJustified(qsizetype width, char fill = ' ', bool truncate = false) const;
300
301 QByteArray &prepend(char c)
302 { return insert(0, QByteArrayView(&c, 1)); }
303 inline QByteArray &prepend(qsizetype count, char c);
304 QByteArray &prepend(const char *s)
305 { return insert(0, QByteArrayView(s, qsizetype(qstrlen(s)))); }
306 QByteArray &prepend(const char *s, qsizetype len)
307 { return insert(0, QByteArrayView(s, len)); }
308 QByteArray &prepend(const QByteArray &a);
309 QByteArray &prepend(QByteArrayView a)
310 { return insert(0, a); }
311
312 QByteArray &append(char c);
313 inline QByteArray &append(qsizetype count, char c);
314 QByteArray &append(const char *s)
315 { return append(s, -1); }
316 QByteArray &append(const char *s, qsizetype len)
317 { return append(QByteArrayView(s, len < 0 ? qsizetype(qstrlen(s)) : len)); }
318 QByteArray &append(const QByteArray &a);
319 QByteArray &append(QByteArrayView a)
320 { return insert(size(), a); }
321
322 QByteArray &assign(QByteArrayView v);
323 QByteArray &assign(qsizetype n, char c)
324 {
325 Q_PRE(n >= 0);
326 resizeForOverwrite(n);
327 return fill(c);
328 }
329 template <typename InputIterator, if_input_iterator<InputIterator> = true>
330 QByteArray &assign(InputIterator first, InputIterator last)
331 {
332 if constexpr (QtPrivate::IsCompatibleByteArrayPointer<InputIterator>::value) {
333 return assign(QByteArrayView(first, last));
334 } else {
335 d->assign(first, last);
336 if (d.isMutable())
337 d.data()[d.size] = '\0';
338 return *this;
339 }
340 }
341
342 QByteArray &insert(qsizetype i, QByteArrayView data);
343 inline QByteArray &insert(qsizetype i, const char *s)
344 { return insert(i, QByteArrayView(s)); }
345 inline QByteArray &insert(qsizetype i, const QByteArray &data)
346 { return insert(i, QByteArrayView(data)); }
347 QByteArray &insert(qsizetype i, qsizetype count, char c);
348 QByteArray &insert(qsizetype i, char c)
349 { return insert(i, QByteArrayView(&c, 1)); }
350 QByteArray &insert(qsizetype i, const char *s, qsizetype len)
351 { return insert(i, QByteArrayView(s, len)); }
352
353 QByteArray &remove(qsizetype index, qsizetype len);
354 QByteArray &removeAt(qsizetype pos)
355 { return size_t(pos) < size_t(size()) ? remove(pos, 1) : *this; }
356 QByteArray &removeFirst() { return !isEmpty() ? remove(0, 1) : *this; }
357 QByteArray &removeLast() { return !isEmpty() ? remove(size() - 1, 1) : *this; }
358
359 template <typename Predicate>
360 QByteArray &removeIf(Predicate pred)
361 {
362 removeIf_helper(pred);
363 return *this;
364 }
365
366 QByteArray &replace(qsizetype index, qsizetype len, const char *s, qsizetype alen)
367 { return replace(index, len, QByteArrayView(s, alen)); }
368 QByteArray &replace(qsizetype index, qsizetype len, QByteArrayView s);
369 QByteArray &replace(char before, QByteArrayView after)
370 { return replace(QByteArrayView(&before, 1), after); }
371 QByteArray &replace(const char *before, qsizetype bsize, const char *after, qsizetype asize)
372 { return replace(QByteArrayView(before, bsize), QByteArrayView(after, asize)); }
373 QByteArray &replace(QByteArrayView before, QByteArrayView after);
374 QByteArray &replace(char before, char after);
375
376 QByteArray &operator+=(char c)
377 { return append(c); }
378 QByteArray &operator+=(const char *s)
379 { return append(s); }
380 QByteArray &operator+=(const QByteArray &a)
381 { return append(a); }
382 QByteArray &operator+=(QByteArrayView a)
383 { return append(a); }
384
385 QList<QByteArray> split(char sep) const;
386
387 [[nodiscard]] QByteArray repeated(qsizetype times) const;
388
389#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
390#if QT_CORE_REMOVED_SINCE(6, 8)
391 QT_ASCII_CAST_WARN inline bool operator==(const QString &s2) const;
392 QT_ASCII_CAST_WARN inline bool operator!=(const QString &s2) const;
393 QT_ASCII_CAST_WARN inline bool operator<(const QString &s2) const;
394 QT_ASCII_CAST_WARN inline bool operator>(const QString &s2) const;
395 QT_ASCII_CAST_WARN inline bool operator<=(const QString &s2) const;
396 QT_ASCII_CAST_WARN inline bool operator>=(const QString &s2) const;
397#endif // QT_CORE_REMOVED_SINCE(6, 8)
398#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
399
400 short toShort(bool *ok = nullptr, int base = 10) const;
401 ushort toUShort(bool *ok = nullptr, int base = 10) const;
402 int toInt(bool *ok = nullptr, int base = 10) const;
403 uint toUInt(bool *ok = nullptr, int base = 10) const;
404 long toLong(bool *ok = nullptr, int base = 10) const;
405 ulong toULong(bool *ok = nullptr, int base = 10) const;
406 qlonglong toLongLong(bool *ok = nullptr, int base = 10) const;
407 qulonglong toULongLong(bool *ok = nullptr, int base = 10) const;
408 float toFloat(bool *ok = nullptr) const;
409 double toDouble(bool *ok = nullptr) const;
410 QByteArray toBase64(Base64Options options = Base64Encoding) const;
411 QByteArray toHex(char separator = '\0') const;
412 QByteArray toPercentEncoding(const QByteArray &exclude = QByteArray(),
413 const QByteArray &include = QByteArray(),
414 char percent = '%') const;
415#if QT_CORE_REMOVED_SINCE(6, 11)
416 [[nodiscard]] QByteArray percentDecoded(char percent = '%') const;
417#else
418 [[nodiscard]] QByteArray percentDecoded(char percent = '%') const &
419 { return fromPercentEncoding(*this, percent); }
420 [[nodiscard]] QByteArray percentDecoded(char percent = '%') &&
421 { return fromPercentEncoding(std::move(*this), percent); }
422#endif
423
424 inline QByteArray &setNum(short, int base = 10);
425 inline QByteArray &setNum(ushort, int base = 10);
426 inline QByteArray &setNum(int, int base = 10);
427 inline QByteArray &setNum(uint, int base = 10);
428 inline QByteArray &setNum(long, int base = 10);
429 inline QByteArray &setNum(ulong, int base = 10);
430 QByteArray &setNum(qlonglong, int base = 10);
431 QByteArray &setNum(qulonglong, int base = 10);
432 inline QByteArray &setNum(float, char format = 'g', int precision = 6);
433 QByteArray &setNum(double, char format = 'g', int precision = 6);
434 QByteArray &setRawData(const char *a, qsizetype n);
435
436 [[nodiscard]] static QByteArray number(int, int base = 10);
437 [[nodiscard]] static QByteArray number(uint, int base = 10);
438 [[nodiscard]] static QByteArray number(long, int base = 10);
439 [[nodiscard]] static QByteArray number(ulong, int base = 10);
440 [[nodiscard]] static QByteArray number(qlonglong, int base = 10);
441 [[nodiscard]] static QByteArray number(qulonglong, int base = 10);
442 [[nodiscard]] static QByteArray number(double, char format = 'g', int precision = 6);
443 [[nodiscard]] static QByteArray fromRawData(const char *data, qsizetype size)
444 {
445 return QByteArray(DataPointer::fromRawData(data, size));
446 }
447
448 class FromBase64Result;
449 [[nodiscard]] static FromBase64Result fromBase64Encoding(QByteArray &&base64, Base64Options options = Base64Encoding);
450 [[nodiscard]] static FromBase64Result fromBase64Encoding(const QByteArray &base64, Base64Options options = Base64Encoding);
451 [[nodiscard]] static QByteArray fromBase64(const QByteArray &base64, Base64Options options = Base64Encoding);
452 [[nodiscard]] static QByteArray fromHex(const QByteArray &hexEncoded);
453 [[nodiscard]] static QByteArray fromPercentEncoding(const QByteArray &pctEncoded, char percent = '%');
454 [[nodiscard]] static QByteArray fromPercentEncoding(QByteArray &&pctEncoded, char percent = '%');
455
456#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
457 static QByteArray fromCFData(CFDataRef data);
458 static QByteArray fromRawCFData(CFDataRef data);
459 CFDataRef toCFData() const Q_DECL_CF_RETURNS_RETAINED;
460 CFDataRef toRawCFData() const Q_DECL_CF_RETURNS_RETAINED;
461 static QByteArray fromNSData(const NSData *data);
462 static QByteArray fromRawNSData(const NSData *data);
463 NSData *toNSData() const Q_DECL_NS_RETURNS_AUTORELEASED;
464 NSData *toRawNSData() const Q_DECL_NS_RETURNS_AUTORELEASED;
465#endif
466
467#if defined(Q_OS_WASM) || defined(Q_QDOC)
468 static QByteArray fromEcmaUint8Array(emscripten::val uint8array);
469 emscripten::val toEcmaUint8Array();
470#endif
471
472 typedef char *iterator;
473 typedef const char *const_iterator;
474 typedef iterator Iterator;
475 typedef const_iterator ConstIterator;
476 typedef std::reverse_iterator<iterator> reverse_iterator;
477 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
478 iterator begin() { return data(); }
479 constexpr
480 const_iterator begin() const noexcept { return d.data(); }
481 constexpr
482 const_iterator cbegin() const noexcept { return begin(); }
483 constexpr
484 const_iterator constBegin() const noexcept { return begin(); }
485 iterator end() { return begin() + size(); }
486 constexpr
487 const_iterator end() const noexcept { return begin() + size(); }
488 constexpr
489 const_iterator cend() const noexcept { return end(); }
490 constexpr
491 const_iterator constEnd() const noexcept { return end(); }
492 reverse_iterator rbegin() { return reverse_iterator(end()); }
493 reverse_iterator rend() { return reverse_iterator(begin()); }
494 constexpr
495 const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
496 constexpr
497 const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
498 constexpr
499 const_reverse_iterator crbegin() const noexcept { return rbegin(); }
500 constexpr
501 const_reverse_iterator crend() const noexcept { return rend(); }
502
503 // stl compatibility
504 typedef qsizetype size_type;
505 typedef qptrdiff difference_type;
506 typedef const char & const_reference;
507 typedef char & reference;
508 typedef char *pointer;
509 typedef const char *const_pointer;
510 typedef char value_type;
511 void push_back(char c)
512 { append(c); }
513 void push_back(const char *s)
514 { append(s); }
515 void push_back(const QByteArray &a)
516 { append(a); }
517 void push_back(QByteArrayView a)
518 { append(a); }
519 void push_front(char c)
520 { prepend(c); }
521 void push_front(const char *c)
522 { prepend(c); }
523 void push_front(const QByteArray &a)
524 { prepend(a); }
525 void push_front(QByteArrayView a)
526 { prepend(a); }
527 void shrink_to_fit() { squeeze(); }
528 iterator erase(const_iterator first, const_iterator last);
529 inline iterator erase(const_iterator it) { return erase(it, it + 1); }
530 constexpr qsizetype max_size() const noexcept
531 {
532 return maxSize();
533 }
534
535 static QByteArray fromStdString(const std::string &s);
536 std::string toStdString() const;
537
538 static constexpr qsizetype maxSize() noexcept
539 {
540 // -1 to deal with the NUL terminator
541 return Data::maxSize() - 1;
542 }
543 constexpr qsizetype size() const noexcept
544 {
545 constexpr size_t MaxSize = maxSize();
546 Q_PRESUME(size_t(d.size) <= MaxSize);
547 return d.size;
548 }
549#if QT_DEPRECATED_SINCE(6, 4)
550 QT_DEPRECATED_VERSION_X_6_4("Use size() or length() instead.")
551 constexpr qsizetype count() const noexcept { return size(); }
552#endif
553 constexpr qsizetype length() const noexcept { return size(); }
554 QT_CORE_CONSTEXPR_INLINE_SINCE(6, 4)
555 bool isNull() const noexcept;
556
557 inline const DataPointer &data_ptr() const { return d; }
558 inline DataPointer &data_ptr() { return d; }
559#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
560 explicit inline QByteArray(const DataPointer &dd) : d(dd) {}
561#endif
562 explicit Q_DECL_CONSTEXPR_DTOR QByteArray(DataPointer &&dd) : d(std::move(dd)) {}
563
564 [[nodiscard]] QByteArray nullTerminated() const &;
565 [[nodiscard]] QByteArray nullTerminated() &&;
566 QByteArray &nullTerminate();
567
568private:
569 friend bool comparesEqual(const QByteArray &lhs, char rhs) noexcept
570 { return QByteArrayView(lhs) == rhs; }
571 friend bool comparesEqual(const QByteArray &lhs, const QByteArrayView &rhs) noexcept
572 { return QByteArrayView(lhs) == rhs; }
573 friend Qt::strong_ordering
574 compareThreeWay(const QByteArray &lhs, char rhs) noexcept
575 {
576 return compareThreeWay(QByteArrayView(lhs), rhs);
577 }
578 friend Qt::strong_ordering
579 compareThreeWay(const QByteArray &lhs, const QByteArrayView &rhs) noexcept
580 {
581 const int res = QtPrivate::compareMemory(QByteArrayView(lhs), rhs);
582 return Qt::compareThreeWay(res, 0);
583 }
584 Q_DECLARE_STRONGLY_ORDERED(QByteArray)
585 Q_DECLARE_STRONGLY_ORDERED(QByteArray, char)
586 Q_DECLARE_STRONGLY_ORDERED(QByteArray, const char *)
587#if defined(__GLIBCXX__) && defined(__cpp_lib_three_way_comparison)
588 // libstdc++ has a bug [0] when `operator const void *()` is preferred over
589 // `operator<=>()` when calling std::less<> and other similar methods.
590 // Fix it by explicitly providing relational operators in such case.
591 // [0]: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114153
592 friend bool operator<(const QByteArray &lhs, const QByteArray &rhs) noexcept
593 { return is_lt(compareThreeWay(lhs, rhs)); }
594 friend bool operator<=(const QByteArray &lhs, const QByteArray &rhs) noexcept
595 { return is_lteq(compareThreeWay(lhs, rhs)); }
596 friend bool operator>(const QByteArray &lhs, const QByteArray &rhs) noexcept
597 { return is_gt(compareThreeWay(lhs, rhs)); }
598 friend bool operator>=(const QByteArray &lhs, const QByteArray &rhs) noexcept
599 { return is_gteq(compareThreeWay(lhs, rhs)); }
600#endif // defined(__GLIBCXX__) && defined(__cpp_lib_three_way_comparison)
601
602 // Check isEmpty() instead of isNull() for backwards compatibility.
603 friend bool comparesEqual(const QByteArray &lhs, std::nullptr_t) noexcept
604 { return lhs.isEmpty(); }
605 friend Qt::strong_ordering compareThreeWay(const QByteArray &lhs, std::nullptr_t) noexcept
606 { return lhs.isEmpty() ? Qt::strong_ordering::equivalent : Qt::strong_ordering::greater; }
607 Q_DECLARE_STRONGLY_ORDERED(QByteArray, std::nullptr_t)
608
609 // defined in qstring.cpp
610 friend Q_CORE_EXPORT bool comparesEqual(const QByteArray &lhs, const QChar &rhs) noexcept;
611 friend Q_CORE_EXPORT Qt::strong_ordering
612 compareThreeWay(const QByteArray &lhs, const QChar &rhs) noexcept;
613 friend Q_CORE_EXPORT bool comparesEqual(const QByteArray &lhs, char16_t rhs) noexcept;
614 friend Q_CORE_EXPORT Qt::strong_ordering
615 compareThreeWay(const QByteArray &lhs, char16_t rhs) noexcept;
616#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
617 Q_DECLARE_STRONGLY_ORDERED(QByteArray, QChar, QT_ASCII_CAST_WARN)
618 Q_DECLARE_STRONGLY_ORDERED(QByteArray, char16_t, QT_ASCII_CAST_WARN)
619#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
620
621
622 void reallocData(qsizetype alloc, QArrayData::AllocationOption option);
623 void reallocGrowData(qsizetype n);
624 void expand(qsizetype i);
625
626 Q_ALWAYS_INLINE constexpr void verify([[maybe_unused]] qsizetype pos = 0,
627 [[maybe_unused]] qsizetype n = 1) const
628 {
629 Q_ASSERT(pos >= 0);
630 Q_ASSERT(pos <= d.size);
631 Q_ASSERT(n >= 0);
632 Q_ASSERT(n <= d.size - pos);
633 }
634
635 static QByteArray sliced_helper(QByteArray &a, qsizetype pos, qsizetype n);
636 static QByteArray toLower_helper(const QByteArray &a);
637 static QByteArray toLower_helper(QByteArray &a);
638 static QByteArray toUpper_helper(const QByteArray &a);
639 static QByteArray toUpper_helper(QByteArray &a);
640 static QByteArray trimmed_helper(const QByteArray &a);
641 static QByteArray trimmed_helper(QByteArray &a);
642 static QByteArray simplified_helper(const QByteArray &a);
643 static QByteArray simplified_helper(QByteArray &a);
644 template <typename Predicate>
645 qsizetype removeIf_helper(Predicate pred)
646 {
647 const qsizetype result = d->eraseIf(pred);
648 if (result > 0)
649 d.data()[d.size] = '\0';
650 return result;
651 }
652
653 friend class QString;
654 friend Q_CORE_EXPORT QByteArray qUncompress(const uchar *data, qsizetype nbytes);
655
656 template <typename T> friend qsizetype erase(QByteArray &ba, const T &t);
657 template <typename Predicate> friend qsizetype erase_if(QByteArray &ba, Predicate pred);
658};
659
660Q_DECLARE_OPERATORS_FOR_FLAGS(QByteArray::Base64Options)
661
662constexpr
663inline char QByteArray::at(qsizetype i) const
664{ verify(i, 1); return d.data()[i]; }
665constexpr
666inline char QByteArray::operator[](qsizetype i) const
667{ verify(i, 1); return d.data()[i]; }
668
669#ifndef QT_NO_CAST_FROM_BYTEARRAY
670inline QByteArray::operator const char *() const
671{ return data(); }
672inline QByteArray::operator const void *() const
673{ return data(); }
674#endif
675inline char *QByteArray::data()
676{
677 detach();
678 Q_ASSERT(d.data());
679 return d.data();
680}
681constexpr
682inline const char *QByteArray::data() const noexcept
683{
684#if QT5_NULL_STRINGS == 1
685 return d.data() ? d.data() : &_empty;
686#else
687 return d.data();
688#endif
689}
690inline void QByteArray::detach()
691{ if (d.needsDetach()) reallocData(size(), QArrayData::KeepSize); }
692inline bool QByteArray::isDetached() const
693{ return !d.isShared(); }
694#if QT_CORE_INLINE_IMPL_SINCE(6, 13)
695QT_CORE_CONSTEXPR_DTOR_INLINE_SINCE(6, 13)
696QByteArray &QByteArray::operator=(const QByteArray &other) noexcept
697{
698 d = other.d;
699 return *this;
700}
701#endif // QT_CORE_INLINE_IMPL_SINCE(6, 13)
702
703inline qsizetype QByteArray::capacity() const { return qsizetype(d.constAllocatedCapacity()); }
704
705inline void QByteArray::reserve(qsizetype asize)
706{
707 if (d.needsDetach() || asize > capacity() - d.freeSpaceAtBegin())
708 reallocData(qMax(size(), asize), QArrayData::KeepSize);
709 if (d.constAllocatedCapacity())
710 d.setFlag(Data::CapacityReserved);
711}
712
713inline void QByteArray::squeeze()
714{
715 if (!d.isMutable())
716 return;
717 if (d.needsDetach() || size() < capacity())
718 reallocData(size(), QArrayData::KeepSize);
719 if (d.constAllocatedCapacity())
720 d.clearFlag(Data::CapacityReserved);
721}
722
723inline char &QByteArray::operator[](qsizetype i)
724{ verify(i, 1); return data()[i]; }
725inline char &QByteArray::front() { return operator[](0); }
726inline char &QByteArray::back() { return operator[](size() - 1); }
727inline QByteArray &QByteArray::append(qsizetype n, char ch)
728{ return insert(size(), n, ch); }
729inline QByteArray &QByteArray::prepend(qsizetype n, char ch)
730{ return insert(0, n, ch); }
731inline bool QByteArray::contains(char c) const
732{ return indexOf(c) != -1; }
733inline bool QByteArray::contains(QByteArrayView bv) const
734{ return indexOf(bv) != -1; }
735inline int QByteArray::compare(QByteArrayView a) const noexcept
736{
737 return QByteArrayView(*this).compare(a);
738}
739inline int QByteArray::compare(QByteArrayView a, Qt::CaseSensitivity cs) const noexcept
740{
741 return QByteArrayView(*this).compare(a, cs);
742}
743#if !defined(QT_USE_QSTRINGBUILDER)
744inline QByteArray operator+(const QByteArray &a1, const QByteArray &a2)
745{ return QByteArray(a1) += a2; }
746inline QByteArray operator+(QByteArray &&lhs, const QByteArray &rhs)
747{ return std::move(lhs += rhs); }
748inline QByteArray operator+(const QByteArray &a1, const char *a2)
749{ return QByteArray(a1) += a2; }
750inline QByteArray operator+(QByteArray &&lhs, const char *rhs)
751{ return std::move(lhs += rhs); }
752inline QByteArray operator+(const QByteArray &a1, char a2)
753{ return QByteArray(a1) += a2; }
754inline QByteArray operator+(QByteArray &&lhs, char rhs)
755{ return std::move(lhs += rhs); }
756inline QByteArray operator+(const char *a1, const QByteArray &a2)
757{ return QByteArray(a1) += a2; }
758inline QByteArray operator+(char a1, const QByteArray &a2)
759{ return QByteArray(&a1, 1) += a2; }
761inline QByteArray operator+(const QByteArray &lhs, QByteArrayView rhs)
762{
763 QByteArray tmp{lhs.size() + rhs.size(), Qt::Uninitialized};
764 return tmp.assign(lhs).append(rhs);
765}
767inline QByteArray operator+(QByteArrayView lhs, const QByteArray &rhs)
768{
769 QByteArray tmp{lhs.size() + rhs.size(), Qt::Uninitialized};
770 return tmp.assign(lhs).append(rhs);
771}
772#endif // QT_USE_QSTRINGBUILDER
773
774inline QByteArray &QByteArray::setNum(short n, int base)
775{ return setNum(qlonglong(n), base); }
776inline QByteArray &QByteArray::setNum(ushort n, int base)
777{ return setNum(qulonglong(n), base); }
778inline QByteArray &QByteArray::setNum(int n, int base)
779{ return setNum(qlonglong(n), base); }
780inline QByteArray &QByteArray::setNum(uint n, int base)
781{ return setNum(qulonglong(n), base); }
782inline QByteArray &QByteArray::setNum(long n, int base)
783{ return setNum(qlonglong(n), base); }
784inline QByteArray &QByteArray::setNum(ulong n, int base)
785{ return setNum(qulonglong(n), base); }
786inline QByteArray &QByteArray::setNum(float n, char format, int precision)
787{ return setNum(double(n), format, precision); }
788
789#if QT_CORE_INLINE_IMPL_SINCE(6, 4)
790QT_CORE_CONSTEXPR_INLINE_SINCE(6, 4)
791bool QByteArray::isNull() const noexcept
792{
793 return d.isNull();
794}
795#endif
796#if QT_CORE_INLINE_IMPL_SINCE(6, 8)
797qsizetype QByteArray::indexOf(char ch, qsizetype from) const
798{
799 return qToByteArrayViewIgnoringNull(*this).indexOf(ch, from);
800}
801qsizetype QByteArray::lastIndexOf(char ch, qsizetype from) const
802{
803 return qToByteArrayViewIgnoringNull(*this).lastIndexOf(ch, from);
804}
805#endif
806
807#if !defined(QT_NO_DATASTREAM) || defined(QT_BOOTSTRAPPED)
808Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QByteArray &);
809Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QByteArray &);
810#endif
811
812#ifndef QT_NO_COMPRESS
813Q_CORE_EXPORT QByteArray qCompress(const uchar* data, qsizetype nbytes, int compressionLevel = -1);
814Q_CORE_EXPORT QByteArray qUncompress(const uchar* data, qsizetype nbytes);
815inline QByteArray qCompress(const QByteArray& data, int compressionLevel = -1)
816{ return qCompress(reinterpret_cast<const uchar *>(data.constData()), data.size(), compressionLevel); }
817inline QByteArray qUncompress(const QByteArray& data)
818{ return qUncompress(reinterpret_cast<const uchar*>(data.constData()), data.size()); }
819#endif
820
822
824{
825public:
828
829 void swap(QByteArray::FromBase64Result &other) noexcept
830 {
831 decoded.swap(other.decoded);
832 std::swap(decodingStatus, other.decodingStatus);
833 }
834
835 explicit operator bool() const noexcept { return decodingStatus == QByteArray::Base64DecodingStatus::Ok; }
836
837 QByteArray &operator*() & noexcept { return decoded; }
838 const QByteArray &operator*() const & noexcept { return decoded; }
839 QByteArray &&operator*() && noexcept { return std::move(decoded); }
840 const QByteArray &&operator*() const && noexcept { return std::move(decoded); }
841
842 friend inline bool operator==(const QByteArray::FromBase64Result &lhs, const QByteArray::FromBase64Result &rhs) noexcept
843 {
844 if (lhs.decodingStatus != rhs.decodingStatus)
845 return false;
846
847 if (lhs.decodingStatus == QByteArray::Base64DecodingStatus::Ok && lhs.decoded != rhs.decoded)
848 return false;
849
850 return true;
851 }
852
853 friend inline bool operator!=(const QByteArray::FromBase64Result &lhs, const QByteArray::FromBase64Result &rhs) noexcept
854 {
855 return !(lhs == rhs);
856 }
857};
858
859Q_DECLARE_SHARED(QByteArray::FromBase64Result)
860
861
862Q_CORE_EXPORT Q_DECL_PURE_FUNCTION size_t qHash(const QByteArray::FromBase64Result &key, size_t seed = 0) noexcept;
863
864template <typename T>
865qsizetype erase(QByteArray &ba, const T &t)
866{
867 return ba.removeIf_helper([&t](const auto &e) { return t == e; });
868}
869
870template <typename Predicate>
871qsizetype erase_if(QByteArray &ba, Predicate pred)
872{
873 return ba.removeIf_helper(pred);
874}
875
876//
877// QByteArrayView members that require QByteArray:
878//
879QByteArray QByteArrayView::toByteArray() const
880{
881 return QByteArray(*this);
882}
883
884namespace Qt {
885inline namespace Literals {
886inline namespace StringLiterals {
887
888Q_DECL_CONSTEXPR_DTOR QByteArray operator""_ba(const char *str, size_t size) noexcept
889{
890 return QByteArray(QByteArrayData(nullptr, const_cast<char *>(str), qsizetype(size)));
891}
892
893} // StringLiterals
894} // Literals
895} // Qt
896
897inline namespace QtLiterals {
898#if QT_DEPRECATED_SINCE(6, 8)
899
900QT_DEPRECATED_VERSION_X_6_8("Use _ba from Qt::StringLiterals namespace instead.")
901inline QByteArray operator""_qba(const char *str, size_t size) noexcept
902{
903 return Qt::StringLiterals::operator""_ba(str, size);
904}
905
906#endif // QT_DEPRECATED_SINCE(6, 8)
907} // QtLiterals
908
909QT_END_NAMESPACE
910
911#endif // QBYTEARRAY_H
QByteArray::Base64DecodingStatus decodingStatus
Definition qbytearray.h:827
friend bool operator==(const QByteArray::FromBase64Result &lhs, const QByteArray::FromBase64Result &rhs) noexcept
Returns true if lhs and rhs are equal, otherwise returns false.
Definition qbytearray.h:842
QByteArray & operator*() &noexcept
Definition qbytearray.h:837
const QByteArray & operator*() const &noexcept
Definition qbytearray.h:838
void swap(QByteArray::FromBase64Result &other) noexcept
Definition qbytearray.h:829
operator bool() const noexcept
\variable QByteArray::FromBase64Result::decoded
Definition qbytearray.h:835
QByteArray && operator*() &&noexcept
Definition qbytearray.h:839
const QByteArray && operator*() const &&noexcept
Definition qbytearray.h:840
friend bool operator!=(const QByteArray::FromBase64Result &lhs, const QByteArray::FromBase64Result &rhs) noexcept
Returns true if lhs and rhs are different, otherwise returns false.
Definition qbytearray.h:853
\inmodule QtCore
Definition qbytearray.h:58
\inmodule QtCore\reentrant
Definition qdatastream.h:50
int initFrom(const QMessageLogContext &logContext)
void populateBacktrace(int frameCount)
QInternalMessageLogContext(const QMessageLogContext &logContext, const QLoggingCategory &categoryOverride)
Definition qlogging_p.h:67
static constexpr int MaxBacktraceDepth
Definition qlogging_p.h:49
std::optional< BacktraceStorage > backtrace
Definition qlogging_p.h:59
static constexpr int DefaultBacktraceDepth
Definition qlogging_p.h:48
Definition qlist.h:82
\inmodule QtCore
Definition qlogging.h:44
constexpr QMessageLogContext(const char *fileName, int lineNumber, const char *functionName, const char *categoryName) noexcept
Definition qlogging.h:49
const char * category
Definition qlogging.h:56
constexpr QMessageLogContext() noexcept=default
const char * function
Definition qlogging.h:55
const char * file
Definition qlogging.h:54
\inmodule QtCore
Definition qlogging.h:74
QDebug debug(CategoryFunction catFunc) const
QDebug debug(const QLoggingCategory &cat) const
Logs a debug message into category cat using a QDebug stream.
Definition qlogging.cpp:528
void void void void Q_DECL_COLD_FUNCTION void Q_DECL_COLD_FUNCTION void Q_DECL_COLD_FUNCTION void Q_DECL_COLD_FUNCTION void QT_MESSAGE_LOGGER_NORETURN Q_DECL_COLD_FUNCTION void QT_MESSAGE_LOGGER_NORETURN Q_DECL_COLD_FUNCTION void QDebug debug() const
Logs a debug message using a QDebug stream.
Definition qlogging.cpp:514
QDebug info(const QLoggingCategory &cat) const
Logs an informational message into the category cat using a QDebug stream.
Definition qlogging.cpp:617
QDebug info() const
Logs an informational message using a QDebug stream.
Definition qlogging.cpp:603
QNoDebug noDebug(...) const noexcept
QDebug info(CategoryFunction catFunc) const
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:177
static const char ifCriticalTokenC[]
static bool grabMessageHandler()
void qt_message_output(QtMsgType msgType, const QMessageLogContext &context, const QString &message)
static const char emptyTokenC[]
static Q_NEVER_INLINE void qt_message(QtMsgType msgType, const QMessageLogContext &context, const char *msg, va_list ap)
Definition qlogging.cpp:411
static void preformattedMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &formattedMessage)
static bool systemHasStderr()
Returns true if writing to stderr is supported.
Definition qlogging.cpp:267
static const char endifTokenC[]
static bool isDefaultCategory(const char *category)
Definition qlogging.cpp:957
static const char messageTokenC[]
static bool qt_append_thread_name_to(QString &message)
Definition qlogging.cpp:252
static void qt_maybe_message_fatal(QtMsgType, const QMessageLogContext &context, String &&message)
\inmodule QtCore \title Qt Logging Types
#define HANDLE_IF_TOKEN(LEVEL)
Q_DECLARE_TYPEINFO(QMessagePattern::BacktraceParams, Q_RELOCATABLE_TYPE)
static void qDefaultMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &buf)
static constexpr auto systemMessageSink()
static const char timeTokenC[]
static bool isFatalCountDown(const char *varname, QBasicAtomicInt &n)
Definition qlogging.cpp:157
void qErrnoWarning(int code, const char *msg,...)
static const char qthreadptrTokenC[]
static const char fileTokenC[]
static const char ifDebugTokenC[]
static const char ifFatalTokenC[]
static const char categoryTokenC[]
static void stderr_message_handler(QtMsgType type, const QMessageLogContext &context, const QString &formattedMessage)
static const char lineTokenC[]
static const char typeTokenC[]
static void ungrabMessageHandler()
static void copyInternalContext(QInternalMessageLogContext *self, const QMessageLogContext &logContext) noexcept
static const char ifCategoryTokenC[]
static int checked_var_value(const char *varname)
Definition qlogging.cpp:143
static const char threadnameTokenC[]
static const char pidTokenC[]
Q_TRACE_POINT(qtcore, qt_message_print, int type, const char *category, const char *function, const char *file, int line, const QString &message)
static const char threadidTokenC[]
static QString formatLogMessage(QtMsgType type, const QMessageLogContext &context, const QString &str)
static Q_CONSTINIT bool msgHandlerGrabbed
static const char backtraceTokenC[]
void qErrnoWarning(const char *msg,...)
static const char functionTokenC[]
#define IF_TOKEN(LEVEL)
static const char ifWarningTokenC[]
static const char appnameTokenC[]
static bool isFatal(QtMsgType msgType)
Definition qlogging.cpp:191
static const char ifInfoTokenC[]
QtMessageHandler qInstallMessageHandler(QtMessageHandler h)
static void qt_message_print(QtMsgType, const QMessageLogContext &context, const QString &message)
static bool stderrHasConsoleAttached()
Returns true if writing to stderr will end up in a console/terminal visible to the user.
Definition qlogging.cpp:296
void qSetMessagePattern(const QString &pattern)
Combined button and popup list for selecting options.
bool shouldLogToStderr()
Returns true if logging stderr should be ensured.
Definition qlogging.cpp:343
Definition qcompare.h:111
QByteArray operator+(const QByteArray &a1, const char *a2)
Definition qbytearray.h:748
QByteArray qUncompress(const QByteArray &data)
Definition qbytearray.h:817
QByteArray operator+(char a1, const QByteArray &a2)
Definition qbytearray.h:758
QByteArray operator+(QByteArray &&lhs, char rhs)
Definition qbytearray.h:754
QByteArray operator+(const QByteArray &a1, char a2)
Definition qbytearray.h:752
QByteArray operator+(const char *a1, const QByteArray &a2)
Definition qbytearray.h:756
QByteArray operator+(QByteArray &&lhs, const QByteArray &rhs)
Definition qbytearray.h:746
qsizetype erase_if(QByteArray &ba, Predicate pred)
Definition qbytearray.h:871
QByteArray operator+(const QByteArray &a1, const QByteArray &a2)
Definition qbytearray.h:744
QByteArray qCompress(const QByteArray &data, int compressionLevel=-1)
Definition qbytearray.h:815
#define QT5_NULL_STRINGS
Definition qbytearray.h:26
qsizetype erase(QByteArray &ba, const T &t)
Definition qbytearray.h:865
QByteArray operator+(QByteArray &&lhs, const char *rhs)
Definition qbytearray.h:750
#define __has_include(x)
Q_CORE_EXPORT QDebug operator<<(QDebug debug, QDir::Filters filters)
Definition qdir.cpp:2620
#define QT_MESSAGELOG_FUNC
Definition qlogging.h:162
#define QT_MESSAGELOG_FILE
Definition qlogging.h:160
#define QT_MESSAGE_LOGGER_NORETURN
Definition qlogging.h:70
#define QT_MESSAGELOG_LINE
Definition qlogging.h:161
Q_CORE_EXPORT void qSetMessagePattern(const QString &messagePattern)
#define QT_MESSAGELOGCONTEXT
Definition qlogging.h:155
QtMsgType
Definition qlogging.h:30
@ QtCriticalMsg
Definition qlogging.h:34
@ QtFatalMsg
Definition qlogging.h:35
@ QtDebugMsg
Definition qlogging.h:31
Q_CORE_EXPORT void qt_message_output(QtMsgType, const QMessageLogContext &context, const QString &message)
void(* QtMessageHandler)(QtMsgType, const QMessageLogContext &, const QString &)
Definition qlogging.h:197
QMutex QBasicMutex
Definition qmutex.h:360
void setPattern(const QString &pattern)
std::unique_ptr< std::unique_ptr< const char[]>[]> literals
std::chrono::steady_clock::time_point appStartTime
std::unique_ptr< const char *[]> tokens
QList< QString > timeArgs
static QBasicMutex mutex
void setDefaultPattern()