9#pragma qt_class(QtDebug)
12#include <QtCore/qcompare.h>
13#include <QtCore/qcontainerfwd.h>
14#include <QtCore/qfloat16.h>
15#include <QtCore/qtextstream.h>
16#include <QtCore/qttypetraits.h>
17#include <QtCore/qtypes.h>
18#include <QtCore/qstring.h>
19#include <QtCore/qcontiguouscache.h>
20#include <QtCore/qsharedpointer.h>
34#include <QtCore/q20type_traits.h>
35#include <unordered_map>
36#include <unordered_set>
38#include <unordered_map>
39#include <unordered_set>
42#if !defined(QT_LEAN_HEADERS) || QT_LEAN_HEADERS < 1
43# include <QtCore/qlist.h>
44# include <QtCore/qmap.h>
45# include <QtCore/qset.h>
46# include <QtCore/qvarlengtharray.h>
51class QT6_ONLY(Q_CORE_EXPORT) QDebug :
public QIODeviceBase
53 friend class QMessageLogger;
54 friend class QDebugStateSaver;
55 friend class QDebugStateSaverPrivate;
57 enum { VerbosityShift = 29, VerbosityMask = 0x7 };
59 explicit Stream(QIODevice *device)
62 explicit Stream(QString *string)
63 : ts(string, WriteOnly)
65 explicit Stream(QByteArray *ba)
68 explicit Stream(QtMsgType t)
69 : ts(&buffer, WriteOnly),
76 QtMsgType type = QtDebugMsg;
78 bool noQuotes =
false;
79 bool message_output =
false;
80 int verbosity = DefaultVerbosity;
81 QMessageLogContext context;
84 enum Latin1Content { ContainsBinary = 0, ContainsLatin1 };
86 QT7_ONLY(Q_CORE_EXPORT)
void putUcs4(uint ucs4);
87 QT7_ONLY(Q_CORE_EXPORT)
void putString(
const QChar *begin, size_t length);
88 QT7_ONLY(Q_CORE_EXPORT)
void putByteArray(
const char *begin, size_t length, Latin1Content content);
89 QT7_ONLY(Q_CORE_EXPORT)
void putTimeUnit(qint64 num, qint64 den);
90 QT7_ONLY(Q_CORE_EXPORT)
void putInt128(
const void *i);
91 QT7_ONLY(Q_CORE_EXPORT)
void putUInt128(
const void *i);
92 QT7_ONLY(Q_CORE_EXPORT)
void putQtOrdering(QtOrderingPrivate::QtOrderingTypeFlag flags,
93 Qt::partial_ordering order);
95 template <
typename...Ts>
96 using if_streamable = std::enable_if_t<
97 std::conjunction_v<QTypeTraits::has_ostream_operator<QDebug, Ts>...>
100 explicit QDebug(QIODevice *device) : stream(
new Stream(device)) {}
101 explicit QDebug(QString *string) : stream(
new Stream(string)) {}
102 explicit QDebug(QByteArray *bytes) : stream(
new Stream(bytes)) {}
103 explicit QDebug(QtMsgType t) : stream(
new Stream(t)) {}
104 QDebug(
const QDebug &o) : stream(o.stream) { ++stream->ref; }
105 QDebug(QDebug &&other)
noexcept : stream{std::exchange(other.stream,
nullptr)} {}
106 inline QDebug &operator=(
const QDebug &other);
107 QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QDebug)
109 void swap(QDebug &other)
noexcept { qt_ptr_swap(stream, other.stream); }
111 QT7_ONLY(Q_CORE_EXPORT) QDebug &resetFormat();
113 inline QDebug &space() { stream->space =
true; stream->ts <<
' ';
return *
this; }
114 inline QDebug &nospace() { stream->space =
false;
return *
this; }
115 inline QDebug &maybeSpace() {
if (stream->space) stream->ts <<
' ';
return *
this; }
116 inline QDebug &verbosity(
int verbosityLevel) { stream->verbosity = verbosityLevel;
return *
this; }
117 int verbosity()
const {
return stream->verbosity; }
118 void setVerbosity(
int verbosityLevel) { stream->verbosity = verbosityLevel; }
119 enum VerbosityLevel { MinimumVerbosity = 0, DefaultVerbosity = 2, MaximumVerbosity = 7 };
121 bool autoInsertSpaces()
const {
return stream->space; }
122 void setAutoInsertSpaces(
bool b) { stream->space = b; }
124 [[nodiscard]]
bool quoteStrings()
const noexcept {
return !stream->noQuotes; }
125 void setQuoteStrings(
bool b) { stream->noQuotes = !b; }
127 inline QDebug "e() { stream->noQuotes =
false;
return *
this; }
128 inline QDebug &noquote() { stream->noQuotes =
true;
return *
this; }
129 inline QDebug &maybeQuote(
char c =
'"') {
if (!stream->noQuotes) stream->ts << c;
return *
this; }
131 inline QDebug &operator<<(QChar t) { putUcs4(t.unicode());
return maybeSpace(); }
132 inline QDebug &operator<<(
bool t) { stream->ts << (t ?
"true" :
"false");
return maybeSpace(); }
133 inline QDebug &operator<<(
char t) { stream->ts << t;
return maybeSpace(); }
134 inline QDebug &operator<<(
signed short t) { stream->ts << t;
return maybeSpace(); }
135 inline QDebug &operator<<(
unsigned short t) { stream->ts << t;
return maybeSpace(); }
136 inline QDebug &operator<<(
char16_t t) {
return *
this << QChar(t); }
137 inline QDebug &operator<<(
char32_t t) { putUcs4(t);
return maybeSpace(); }
138 inline QDebug &operator<<(
signed int t) { stream->ts << t;
return maybeSpace(); }
139 inline QDebug &operator<<(
unsigned int t) { stream->ts << t;
return maybeSpace(); }
140 inline QDebug &operator<<(
signed long t) { stream->ts << t;
return maybeSpace(); }
141 inline QDebug &operator<<(
unsigned long t) { stream->ts << t;
return maybeSpace(); }
142 inline QDebug &operator<<(qint64 t) { stream->ts << t;
return maybeSpace(); }
143 inline QDebug &operator<<(quint64 t) { stream->ts << t;
return maybeSpace(); }
144 inline QDebug &operator<<(qfloat16 t) { stream->ts << t;
return maybeSpace(); }
145 inline QDebug &operator<<(
float t) { stream->ts << t;
return maybeSpace(); }
146 inline QDebug &operator<<(
double t) { stream->ts << t;
return maybeSpace(); }
147 inline QDebug &operator<<(
const char* t) { stream->ts << QString::fromUtf8(t);
return maybeSpace(); }
148 inline QDebug &operator<<(
const char16_t *t) { stream->ts << QStringView(t);
return maybeSpace(); }
149 inline QDebug &operator<<(
const QString & t) { putString(t.constData(), size_t(t.size()));
return maybeSpace(); }
150 inline QDebug &operator<<(QStringView s) { putString(s.data(), size_t(s.size()));
return maybeSpace(); }
151 inline QDebug &operator<<(QUtf8StringView s) { putByteArray(
reinterpret_cast<
const char*>(s.data()), s.size(), ContainsBinary);
return maybeSpace(); }
152 inline QDebug &operator<<(QLatin1StringView t) { putByteArray(t.latin1(), t.size(), ContainsLatin1);
return maybeSpace(); }
153 inline QDebug &operator<<(
const QByteArray & t) { putByteArray(t.constData(), t.size(), ContainsBinary);
return maybeSpace(); }
154 inline QDebug &operator<<(QByteArrayView t) { putByteArray(t.constData(), t.size(), ContainsBinary);
return maybeSpace(); }
155 inline QDebug &operator<<(
const void * t) { stream->ts << t;
return maybeSpace(); }
156 inline QDebug &operator<<(std::nullptr_t) { stream->ts <<
"(nullptr)";
return maybeSpace(); }
157 inline QDebug &operator<<(std::nullopt_t) { stream->ts <<
"nullopt";
return maybeSpace(); }
158 inline QDebug &operator<<(QTextStreamFunction f) {
163 inline QDebug &operator<<(QTextStreamManipulator m)
164 { stream->ts << m;
return *
this; }
167 template <
typename Char,
typename...Args>
168 QDebug &operator<<(
const std::basic_string<Char, Args...> &s);
170 template <
typename Char,
typename...Args>
171 QDebug &operator<<(std::basic_string_view<Char, Args...> s);
173 template <
typename...Args>
174 QDebug &operator<<(
const std::basic_string<
char, Args...> &s)
175 {
return *
this << QUtf8StringView(s); }
177 template <
typename...Args>
178 QDebug &operator<<(std::basic_string_view<
char, Args...> s)
179 {
return *
this << QUtf8StringView(s); }
182 template <
typename...Args>
183 QDebug &operator<<(
const std::basic_string<char8_t, Args...> &s)
184 {
return *
this << QUtf8StringView(s); }
186 template <
typename...Args>
187 QDebug &operator<<(std::basic_string_view<char8_t, Args...> s)
188 {
return *
this << QUtf8StringView(s); }
191 template <
typename...Args>
192 QDebug &operator<<(
const std::basic_string<
char16_t, Args...> &s)
193 {
return *
this << QStringView(s); }
195 template <
typename...Args>
196 QDebug &operator<<(std::basic_string_view<
char16_t, Args...> s)
197 {
return *
this << QStringView(s); }
199 template <
typename...Args>
200 QDebug &operator<<(
const std::basic_string<
wchar_t, Args...> &s)
202 if constexpr (
sizeof(
wchar_t) == 2)
203 return *
this << QStringView(s);
205 return *
this << QString::fromWCharArray(s.data(), s.size());
208 template <
typename...Args>
209 QDebug &operator<<(std::basic_string_view<
wchar_t, Args...> s)
211 if constexpr (
sizeof(
wchar_t) == 2)
212 return *
this << QStringView(s);
214 return *
this << QString::fromWCharArray(s.data(), s.size());
217 template <
typename...Args>
218 QDebug &operator<<(
const std::basic_string<
char32_t, Args...> &s)
219 {
return *
this << QString::fromUcs4(s.data(), s.size()); }
221 template <
typename...Args>
222 QDebug &operator<<(std::basic_string_view<
char32_t, Args...> s)
223 {
return *
this << QString::fromUcs4(s.data(), s.size()); }
226 template <
typename Rep,
typename Period>
227 QDebug &operator<<(std::chrono::duration<Rep, Period> duration)
229 stream->ts << duration.count();
230 putTimeUnit(Period::num, Period::den);
234#ifdef QT_SUPPORTS_INT128
238 template <
typename T>
239 using if_qint128 = std::enable_if_t<std::is_same_v<T, qint128>,
bool>;
240 template <
typename T>
241 using if_quint128 = std::enable_if_t<std::is_same_v<T, quint128>,
bool>;
243 template <
typename T, if_qint128<T> =
true>
244 QDebug &operator<<(T i128) { putInt128(&i128);
return maybeSpace(); }
245 template <
typename T, if_quint128<T> =
true>
246 QDebug &operator<<(T u128) { putUInt128(&u128);
return maybeSpace(); }
250 template <
typename T>
251 static void streamTypeErased(QDebug &d,
const void *obj)
253 d << *
static_cast<
const T*>(obj);
255 using StreamTypeErased =
void(*)(QDebug&,
const void*);
256 QT7_ONLY(Q_CORE_EXPORT)
static QString toStringImpl(StreamTypeErased s,
const void *obj);
257 QT7_ONLY(Q_CORE_EXPORT)
static QByteArray toBytesImpl(StreamTypeErased s,
const void *obj);
258 QT7_ONLY(Q_CORE_EXPORT) QDebug &putTupleLikeImplImpl(
const char *ns,
const char *what, size_t n,
259 StreamTypeErased *ops,
const void **data);
261 template <
typename TupleLike, size_t...Is>
262 QDebug &putTupleLikeImpl(
const char *ns,
const char *what,
const TupleLike &t,
263 std::index_sequence<Is...>)
265 if constexpr (
sizeof...(Is)) {
266 StreamTypeErased ops[] = {
267 &streamTypeErased<q20::remove_cvref_t<std::tuple_element_t<Is, TupleLike>>>...
269 const void *data[] = {
270 std::addressof(std::get<Is>(t))...
272 return putTupleLikeImplImpl(ns, what,
sizeof...(Is), ops, data);
274 return putTupleLikeImplImpl(ns, what, 0,
nullptr,
nullptr);
278 template <
typename TupleLike>
279 QDebug &putTupleLike(
const char *ns,
const char *what,
const TupleLike &t)
281 using Indexes = std::make_index_sequence<std::tuple_size_v<TupleLike>>;
282 return putTupleLikeImpl(ns, what, t, Indexes{});
285 template <
typename T>
286 static QString toString(
const T &object)
288 return toStringImpl(&streamTypeErased<T>, std::addressof(object));
291 template <
typename T>
292 static QByteArray toBytes(
const T &object)
294 return toBytesImpl(&streamTypeErased<T>, std::addressof(object));
297 template <
typename...Ts, if_streamable<Ts...> =
true>
298 QDebug &operator<<(
const std::tuple<Ts...> &t)
300 return putTupleLike(
"std",
"tuple", t);
303 template <
typename T, if_streamable<T> =
true>
304 QDebug &operator<<(
const std::optional<T> &o)
307 return *
this << std::nullopt;
308 StreamTypeErased s = &streamTypeErased<std::remove_cv_t<T>>;
309 const void *d = std::addressof(*o);
310 return putTupleLikeImplImpl(
"std",
"optional", 1, &s, &d);
314 template <
typename T>
315 using if_ordering_type = std::enable_if_t<QtOrderingPrivate::is_ordering_type_v<T>,
bool>;
317 template <
typename T, if_ordering_type<T> =
true>
318 friend QDebug operator<<(QDebug debug, T t)
320 debug.putQtOrdering(QtOrderingPrivate::orderingFlagsFor(t), Qt::partial_ordering(t));
328class QDebugStateSaver
331 Q_NODISCARD_CTOR Q_CORE_EXPORT
332 QDebugStateSaver(QDebug &dbg);
336 Q_DISABLE_COPY(QDebugStateSaver)
337 std::unique_ptr<QDebugStateSaverPrivate> d;
343 inline QNoDebug &operator<<(QTextStreamFunction) {
return *
this; }
344 inline QNoDebug &operator<<(QTextStreamManipulator) {
return *
this; }
345 inline QNoDebug &space() {
return *
this; }
346 inline QNoDebug &nospace() {
return *
this; }
347 inline QNoDebug &maybeSpace() {
return *
this; }
348 inline QNoDebug "e() {
return *
this; }
349 inline QNoDebug &noquote() {
return *
this; }
350 inline QNoDebug &maybeQuote(
const char =
'"') {
return *
this; }
351 inline QNoDebug &verbosity(
int) {
return *
this; }
354 inline QNoDebug &operator<<(
const T &) {
return *
this; }
356inline QNoDebug QMessageLogger::noDebug(...)
const noexcept
359inline QDebug &QDebug::operator=(
const QDebug &other)
361 QDebug{other}.swap(*
this);
367template <
typename SequentialContainer>
370 const QDebugStateSaver saver(debug);
371 debug.nospace() << which <<
'(';
372 typename SequentialContainer::const_iterator it = c.begin(), end = c.end();
378 debug <<
", " << *it;
385template <
typename AssociativeContainer>
388 const QDebugStateSaver saver(debug);
389 debug.nospace() << which <<
"(";
390 for (
typename AssociativeContainer::const_iterator it = c.constBegin();
391 it != c.constEnd(); ++it) {
392 debug <<
'(' << it.key() <<
", " << it.value() <<
')';
400template<
typename ...T>
401using QDebugIfHasDebugStream =
402 std::enable_if_t<std::conjunction_v<QTypeTraits::has_ostream_operator<QDebug, T>...>, QDebug>;
404template<
typename Container,
typename ...T>
405using QDebugIfHasDebugStreamContainer =
406 std::enable_if_t<std::conjunction_v<QTypeTraits::has_ostream_operator_container<QDebug, Container, T>...>, QDebug>;
411inline QDebugIfHasDebugStreamContainer<QList<T>, T> operator<<(QDebug debug,
const QList<T> &vec)
413 return QtPrivate::printSequentialContainer(
std::move(debug),
"QList", vec);
416template<
typename T, qsizetype P>
417inline QDebugIfHasDebugStream<T> operator<<(QDebug debug,
const QVarLengthArray<T, P> &vec)
419 return QtPrivate::printSequentialContainer(
std::move(debug),
"QVarLengthArray", vec);
422template <
typename T,
typename Alloc>
423inline QDebugIfHasDebugStream<T> operator<<(QDebug debug,
const std::vector<T, Alloc> &vec)
425 return QtPrivate::printSequentialContainer(
std::move(debug),
"std::vector", vec);
428template <
typename T,
std::size_t N>
429inline QDebugIfHasDebugStream<T> operator<<(QDebug debug,
const std::array<T, N> &array)
431 return QtPrivate::printSequentialContainer(
std::move(debug),
"std::array", array);
434template <
typename T,
typename Alloc>
435inline QDebugIfHasDebugStream<T> operator<<(QDebug debug,
const std::list<T, Alloc> &vec)
437 return QtPrivate::printSequentialContainer(
std::move(debug),
"std::list", vec);
441inline QDebugIfHasDebugStream<T> operator<<(QDebug debug,
std::initializer_list<T> list)
443 return QtPrivate::printSequentialContainer(
std::move(debug),
"std::initializer_list", list);
446template <
typename Key,
typename T,
typename Compare,
typename Alloc>
447inline QDebugIfHasDebugStream<Key, T> operator<<(QDebug debug,
const std::map<Key, T, Compare, Alloc> &map)
449 return QtPrivate::printSequentialContainer(
std::move(debug),
"std::map", map);
452template <
typename Key,
typename T,
typename Compare,
typename Alloc>
453inline QDebugIfHasDebugStream<Key, T> operator<<(QDebug debug,
const std::multimap<Key, T, Compare, Alloc> &map)
455 return QtPrivate::printSequentialContainer(
std::move(debug),
"std::multimap", map);
458template <
typename Key,
typename Compare,
typename Alloc>
459inline QDebugIfHasDebugStream<Key> operator<<(QDebug debug,
const std::multiset<Key, Compare, Alloc> &multiset)
461 return QtPrivate::printSequentialContainer(
std::move(debug),
"std::multiset", multiset);
464template <
typename Key,
typename Compare,
typename Alloc>
465inline QDebugIfHasDebugStream<Key> operator<<(QDebug debug,
const std::set<Key, Compare, Alloc> &set)
467 return QtPrivate::printSequentialContainer(
std::move(debug),
"std::set", set);
470template <
typename Key,
typename T,
typename Hash,
typename KeyEqual,
typename Alloc>
471inline QDebugIfHasDebugStream<Key, T> operator<<(QDebug debug,
const std::unordered_map<Key, T, Hash, KeyEqual, Alloc> &unordered_map)
473 return QtPrivate::printSequentialContainer(
std::move(debug),
"std::unordered_map", unordered_map);
476template <
typename Key,
typename Hash,
typename KeyEqual,
typename Alloc>
477inline QDebugIfHasDebugStream<Key> operator<<(QDebug debug,
const std::unordered_set<Key, Hash, KeyEqual, Alloc> &unordered_set)
479 return QtPrivate::printSequentialContainer(
std::move(debug),
"std::unordered_set", unordered_set);
482template <
class Key,
class T>
483inline QDebugIfHasDebugStreamContainer<QMap<Key, T>, Key, T> operator<<(QDebug debug,
const QMap<Key, T> &map)
485 return QtPrivate::printAssociativeContainer(
std::move(debug),
"QMap", map);
488template <
class Key,
class T>
489inline QDebugIfHasDebugStreamContainer<QMultiMap<Key, T>, Key, T> operator<<(QDebug debug,
const QMultiMap<Key, T> &map)
491 return QtPrivate::printAssociativeContainer(
std::move(debug),
"QMultiMap", map);
494template <
class Key,
class T>
495inline QDebugIfHasDebugStreamContainer<QHash<Key, T>, Key, T> operator<<(QDebug debug,
const QHash<Key, T> &hash)
497 return QtPrivate::printAssociativeContainer(
std::move(debug),
"QHash", hash);
500template <
class Key,
class T>
501inline QDebugIfHasDebugStreamContainer<QMultiHash<Key, T>, Key, T> operator<<(QDebug debug,
const QMultiHash<Key, T> &hash)
503 return QtPrivate::printAssociativeContainer(
std::move(debug),
"QMultiHash", hash);
506template <
class T1,
class T2>
507inline QDebugIfHasDebugStream<T1, T2> operator<<(QDebug debug,
const std::pair<T1, T2> &pair)
509 const QDebugStateSaver saver(debug);
510 debug.nospace() <<
"std::pair(" << pair.first <<
", " << pair.second <<
')';
515inline QDebugIfHasDebugStreamContainer<QSet<T>, T> operator<<(QDebug debug,
const QSet<T> &set)
517 return QtPrivate::printSequentialContainer(
std::move(debug),
"QSet", set);
521inline QDebugIfHasDebugStream<T> operator<<(QDebug debug,
const QContiguousCache<T> &cache)
523 const QDebugStateSaver saver(debug);
524 debug.nospace() <<
"QContiguousCache(";
525 for (qsizetype i = cache.firstIndex(); i <= cache.lastIndex(); ++i) {
527 if (i != cache.lastIndex())
536QDebug operator<<(QDebug debug,
const QList<T> &list);
538template <
class T, qsizetype P>
539QDebug operator<<(QDebug debug,
const QVarLengthArray<T, P> &array);
541template <
typename T,
typename Alloc>
542QDebug operator<<(QDebug debug,
const std::vector<T, Alloc> &vec);
544template <
typename T, std::size_t N>
545QDebug operator<<(QDebug debug,
const std::array<T, N> &array);
547template <
typename T,
typename Alloc>
548QDebug operator<<(QDebug debug,
const std::list<T, Alloc> &vec);
550template <
typename Key,
typename T,
typename Compare,
typename Alloc>
551QDebug operator<<(QDebug debug,
const std::map<Key, T, Compare, Alloc> &map);
553template <
typename Key,
typename T,
typename Compare,
typename Alloc>
554QDebug operator<<(QDebug debug,
const std::multimap<Key, T, Compare, Alloc> &map);
556template <
class Key,
class T>
557QDebug operator<<(QDebug debug,
const QMap<Key, T> &map);
559template <
class Key,
class T>
560QDebug operator<<(QDebug debug,
const QMultiMap<Key, T> &map);
562template <
class Key,
class T>
563QDebug operator<<(QDebug debug,
const QHash<Key, T> &hash);
565template <
class Key,
class T>
566QDebug operator<<(QDebug debug,
const QMultiHash<Key, T> &hash);
569QDebug operator<<(QDebug debug,
const QSet<T> &set);
571template <
class T1,
class T2>
572QDebug operator<<(QDebug debug,
const std::pair<T1, T2> &pair);
575QDebug operator<<(QDebug debug,
const QContiguousCache<T> &cache);
577template <
typename Key,
typename Compare,
typename Alloc>
578QDebug operator<<(QDebug debug,
const std::multiset<Key, Compare, Alloc> &multiset);
580template <
typename Key,
typename Compare,
typename Alloc>
581QDebug operator<<(QDebug debug,
const std::set<Key, Compare, Alloc> &set);
583template <
typename Key,
typename T,
typename Hash,
typename KeyEqual,
typename Alloc>
584QDebug operator<<(QDebug debug,
const std::unordered_map<Key, T, Hash, KeyEqual, Alloc> &unordered_map);
586template <
typename Key,
typename Hash,
typename KeyEqual,
typename Alloc>
587QDebug operator<<(QDebug debug,
const std::unordered_set<Key, Hash, KeyEqual, Alloc> &unordered_set);
592inline QDebug operator<<(QDebug debug,
const QSharedPointer<T> &ptr)
594 QDebugStateSaver saver(debug);
595 debug.nospace() <<
"QSharedPointer(" << ptr.data() <<
")";
601template <
typename T,
typename Tag>
604 QDebugStateSaver saver(debug);
605 debug.nospace() <<
"QTaggedPointer(" << ptr.pointer() <<
", " << ptr.tag() <<
")";
609Q_CORE_EXPORT
QDebug qt_QMetaEnum_debugOperator(QDebug&, qint64 value,
const QMetaObject *meta,
const char *name);
610Q_CORE_EXPORT
QDebug qt_QMetaEnum_flagDebugOperator(QDebug &dbg, quint64 value,
const QMetaObject *meta,
const char *name);
614template <
typename Int>
617 static_assert(
std::is_unsigned_v<Int>,
618 "Cast value to an unsigned type before calling this function");
619 const QDebugStateSaver saver(debug);
621 debug.nospace() <<
"QFlags(" << Qt::hex << Qt::showbase;
622 bool needSeparator =
false;
623 for (size_t i = 0; i < sizeofT * 8; ++i) {
624 if (value & (Int(1) << i)) {
628 needSeparator =
true;
629 debug << (Int(1) << i);
635template <
class Flags,
636 std::enable_if_t<QtPrivate::IsQFlags<Flags>::value,
bool> =
true>
637inline QDebug operator<<(QDebug debug, Flags flags)
639 using T =
typename Flags::enum_type;
640 using UInt =
typename QIntegerForSizeof<T>::Unsigned;
641#if !defined(QT_NO_QOBJECT)
642 if constexpr (QtPrivate::IsQEnumHelper<T>::Value || QtPrivate::IsQEnumHelper<Flags>::Value) {
645 using Int = std::conditional_t<QtPrivate::IsQEnumHelper<Flags>::Value, UInt,
646 std::underlying_type_t<T>>;
647 const QMetaObject *obj = qt_getEnumMetaObject(T());
648 const char *name = qt_getEnumName(T());
649 return qt_QMetaEnum_flagDebugOperator(debug, Int(flags.toInt()), obj, name);
653 qt_QMetaEnum_flagDebugOperator(debug,
sizeof(T), UInt(flags.toInt()));
660QDebug operator<<(QDebug debug,
const QFlags<T> &flags);
663#if !defined(QT_NO_QOBJECT) && !defined(Q_QDOC)
685std::enable_if_t<QtPrivate::EnumHasQFlag<T>::Value, QDebug>
686operator<<(QDebug debug, T flag)
688 return debug << QFlags(flag);
692std::enable_if_t<QtPrivate::EnumHasQEnum<T>::Value, QDebug>
693operator<<(QDebug dbg, T value)
695 const QMetaObject *obj = qt_getEnumMetaObject(value);
696 const char *name = qt_getEnumName(value);
697 return qt_QMetaEnum_debugOperator(dbg,
static_cast<
typename std::underlying_type<T>::type>(value), obj, name);
701inline QDebug operator<<(QDebug debug, QKeyCombination combination)
703 QDebugStateSaver saver(debug);
704 debug.nospace() <<
"QKeyCombination("
705 << combination.keyboardModifiers()
718#define QT_FOR_EACH_CORE_FOUNDATION_TYPE(F)
729#define QT_FOR_EACH_MUTABLE_CORE_FOUNDATION_TYPE(F)
733#define QT_FOR_EACH_CORE_GRAPHICS_TYPE(F)
736#define QT_FOR_EACH_MUTABLE_CORE_GRAPHICS_TYPE(F)
742#define QT_FORWARD_DECLARE_CF_TYPE(type) Q_FORWARD_DECLARE_CF_TYPE(type);
743#define QT_FORWARD_DECLARE_MUTABLE_CF_TYPE(type) Q_FORWARD_DECLARE_MUTABLE_CF_TYPE(type);
744#define QT_FORWARD_DECLARE_CG_TYPE(type) Q_FORWARD_DECLARE_CG_TYPE(type);
745#define QT_FORWARD_DECLARE_MUTABLE_CG_TYPE(type) Q_FORWARD_DECLARE_MUTABLE_CG_TYPE(type);
748Q_FORWARD_DECLARE_CF_TYPE(CFString);
750Q_FORWARD_DECLARE_OBJC_CLASS(NSObject);
751QT_FOR_EACH_CORE_FOUNDATION_TYPE(QT_FORWARD_DECLARE_CF_TYPE)
752QT_FOR_EACH_MUTABLE_CORE_FOUNDATION_TYPE(QT_FORWARD_DECLARE_MUTABLE_CF_TYPE)
753QT_FOR_EACH_CORE_GRAPHICS_TYPE(QT_FORWARD_DECLARE_CG_TYPE)
754QT_FOR_EACH_MUTABLE_CORE_GRAPHICS_TYPE(QT_FORWARD_DECLARE_MUTABLE_CG_TYPE)
757#define QT_FORWARD_DECLARE_QDEBUG_OPERATOR_FOR_CF_TYPE(CFType)
758 Q_CORE_EXPORT QDebug operator
<<(QDebug, CFType##Ref);
760#define Q_DECLARE_QDEBUG_OPERATOR_FOR_CF_TYPE(CFType)
761 QDebug operator
<<(QDebug debug, CFType##Ref ref)
764 return debug << QT_STRINGIFY(CFType) "Ref(0x0)";
765 if (CFStringRef description = CFCopyDescription(ref)) {
766 QDebugStateSaver saver(debug);
767 debug.noquote() << description;
768 CFRelease(description);
775Q_CORE_EXPORT QDebug operator<<(QDebug, id);
777Q_CORE_EXPORT QDebug operator<<(QDebug, objc_object *);
778Q_CORE_EXPORT QDebug operator<<(QDebug,
const NSObject *);
779Q_CORE_EXPORT QDebug operator<<(QDebug, CFStringRef);
781QT_FOR_EACH_CORE_FOUNDATION_TYPE(QT_FORWARD_DECLARE_QDEBUG_OPERATOR_FOR_CF_TYPE)
782QT_FOR_EACH_MUTABLE_CORE_FOUNDATION_TYPE(QT_FORWARD_DECLARE_QDEBUG_OPERATOR_FOR_CF_TYPE)
783QT_FOR_EACH_CORE_GRAPHICS_TYPE(QT_FORWARD_DECLARE_QDEBUG_OPERATOR_FOR_CF_TYPE)
784QT_FOR_EACH_MUTABLE_CORE_GRAPHICS_TYPE(QT_FORWARD_DECLARE_QDEBUG_OPERATOR_FOR_CF_TYPE)
786#undef QT_FORWARD_DECLARE_CF_TYPE
787#undef QT_FORWARD_DECLARE_MUTABLE_CF_TYPE
788#undef QT_FORWARD_DECLARE_CG_TYPE
789#undef QT_FORWARD_DECLARE_MUTABLE_CG_TYPE
QByteArray & operator*() noexcept
QByteArray::Base64DecodingStatus decodingStatus
friend bool operator==(const QByteArray::FromBase64Result &lhs, const QByteArray::FromBase64Result &rhs) noexcept
Returns true if lhs and rhs are equal, otherwise returns false.
void swap(QByteArray::FromBase64Result &other) noexcept
operator bool() const noexcept
\variable QByteArray::FromBase64Result::decoded
const QByteArray & operator*() const noexcept
Returns the decoded byte array.
friend bool operator!=(const QByteArray::FromBase64Result &lhs, const QByteArray::FromBase64Result &rhs) noexcept
Returns true if lhs and rhs are different, otherwise returns false.
\inmodule QtCore\reentrant
int initFrom(const QMessageLogContext &logContext)
void populateBacktrace(int frameCount)
QInternalMessageLogContext(const QMessageLogContext &logContext, const QLoggingCategory &categoryOverride)
std::optional< BacktraceStorage > backtrace
static constexpr int DefaultBacktraceDepth
constexpr QMessageLogContext(const char *fileName, int lineNumber, const char *functionName, const char *categoryName) noexcept
constexpr QMessageLogContext() noexcept=default
QDebug debug(CategoryFunction catFunc) const
QDebug debug(const QLoggingCategory &cat) const
Logs a debug message into category cat using a QDebug stream.
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.
QDebug info(const QLoggingCategory &cat) const
Logs an informational message into the category cat using a QDebug stream.
QDebug info() const
Logs an informational message using a QDebug stream.
QNoDebug noDebug(...) const noexcept
QDebug info(CategoryFunction catFunc) const
static Q_CONSTINIT thread_local bool msgHandlerGrabbed
static const char ifCriticalTokenC[]
static const char emptyTokenC[]
static Q_NEVER_INLINE void qt_message(QtMsgType msgType, const QMessageLogContext &context, const char *msg, va_list ap)
static void preformattedMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &formattedMessage)
static bool systemHasStderr()
Returns true if writing to stderr is supported.
static const char endifTokenC[]
static bool isDefaultCategory(const char *category)
static const char messageTokenC[]
static constexpr SystemMessageSink systemMessageSink
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 const char timeTokenC[]
static bool is_fatal_count_down(QAtomicInt &n)
static const char qthreadptrTokenC[]
static const char fileTokenC[]
static const char ifDebugTokenC[]
static const char ifFatalTokenC[]
static const char categoryTokenC[]
static const char lineTokenC[]
static const char typeTokenC[]
static const char ifCategoryTokenC[]
static int checked_var_value(const char *varname)
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 const char backtraceTokenC[]
static const char functionTokenC[]
static const char ifWarningTokenC[]
static const char appnameTokenC[]
static bool isFatal(QtMsgType msgType)
static const char ifInfoTokenC[]
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.
Combined button and popup list for selecting options.
QDebug printAssociativeContainer(QDebug debug, const char *which, const AssociativeContainer &c)
bool shouldLogToStderr()
Returns true if logging stderr should be ensured.
QDebug printSequentialContainer(QDebug debug, const char *which, const SequentialContainer &c)
QByteArray operator""_ba(const char *str, size_t size) noexcept
QByteArray operator+(const QByteArray &a1, const char *a2)
QByteArray qUncompress(const QByteArray &data)
QByteArray operator+(char a1, const QByteArray &a2)
QByteArray operator+(QByteArray &&lhs, char rhs)
QByteArray operator+(const QByteArray &a1, char a2)
QByteArray operator+(const char *a1, const QByteArray &a2)
QByteArray operator+(QByteArray &&lhs, const QByteArray &rhs)
qsizetype erase_if(QByteArray &ba, Predicate pred)
QByteArray operator+(const QByteArray &a1, const QByteArray &a2)
QByteArray qCompress(const QByteArray &data, int compressionLevel=-1)
qsizetype erase(QByteArray &ba, const T &t)
QByteArray operator+(QByteArray &&lhs, const char *rhs)
#define __has_cpp_attribute(x)
void qt_QMetaEnum_flagDebugOperator(QDebug &debug, size_t sizeofT, Int value)
Q_CORE_EXPORT void qt_QMetaEnum_flagDebugOperator(QDebug &debug, size_t sizeofT, quint64 value)
Q_CORE_EXPORT void qt_QMetaEnum_flagDebugOperator(QDebug &debug, size_t sizeofT, uint value)
Q_CORE_EXPORT QDebug operator<<(QDebug debug, QDir::Filters filters)
#define QT_MESSAGELOG_FUNC
Q_CORE_EXPORT Q_DECL_COLD_FUNCTION void qErrnoWarning(int code, const char *msg,...)
Q_CORE_EXPORT Q_DECL_COLD_FUNCTION void qErrnoWarning(const char *msg,...)
#define QT_MESSAGELOG_FILE
#define QT_MESSAGE_LOGGER_NORETURN
#define QT_MESSAGELOG_LINE
Q_CORE_EXPORT void qSetMessagePattern(const QString &messagePattern)
#define QT_MESSAGELOGCONTEXT
Q_CORE_EXPORT void qt_message_output(QtMsgType, const QMessageLogContext &context, const QString &message)
void(* QtMessageHandler)(QtMsgType, const QMessageLogContext &, const QString &)
QString backtraceSeparator
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 constexpr bool Value
static constexpr bool Value