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
qdatastream.h
Go to the documentation of this file.
1// Copyright (C) 2021 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:critical reason:data-parser
4
5#ifndef QDATASTREAM_H
6#define QDATASTREAM_H
7
8#include <QtCore/qobjectdefs.h>
9#include <QtCore/qchar.h>
10#include <QtCore/qcontainerfwd.h>
11#include <QtCore/qiodevicebase.h>
12#include <QtCore/qnamespace.h>
13#include <QtCore/qscopedpointer.h>
14#include <QtCore/qttypetraits.h>
15
16#include <iterator> // std::distance(), std::next()
17#include <memory>
18
19#ifdef Status
20#error qdatastream.h must be included before any header file that defines Status
21#endif
22
23QT_BEGIN_NAMESPACE
24
25#if QT_CORE_REMOVED_SINCE(6, 3)
26class qfloat16;
27#endif
28class QByteArray;
29class QDataStream;
30class QIODevice;
31class QString;
32
33#if !defined(QT_NO_DATASTREAM)
34namespace QtPrivate {
36template <typename Container>
37QDataStream &readArrayBasedContainer(QDataStream &s, Container &c);
38template <typename Container>
39QDataStream &readListBasedContainer(QDataStream &s, Container &c);
40template <typename Container>
41QDataStream &readAssociativeContainer(QDataStream &s, Container &c);
42template <typename Container>
43QDataStream &writeSequentialContainer(QDataStream &s, const Container &c);
44template <typename Container>
45QDataStream &writeAssociativeContainer(QDataStream &s, const Container &c);
46template <typename Container>
47QDataStream &writeAssociativeMultiContainer(QDataStream &s, const Container &c);
48}
49class Q_CORE_EXPORT QDataStream : public QIODeviceBase
50{
51 Q_GADGET
52
53public:
54 enum Version QT7_ONLY(: quint8) {
55 Qt_1_0 = 1,
56 Qt_2_0 = 2,
57 Qt_2_1 = 3,
58 Qt_3_0 = 4,
59 Qt_3_1 = 5,
60 Qt_3_3 = 6,
61 Qt_4_0 = 7,
62 Qt_4_1 = Qt_4_0,
63 Qt_4_2 = 8,
64 Qt_4_3 = 9,
65 Qt_4_4 = 10,
66 Qt_4_5 = 11,
67 Qt_4_6 = 12,
68 Qt_4_7 = Qt_4_6,
69 Qt_4_8 = Qt_4_7,
70 Qt_4_9 = Qt_4_8,
71 Qt_5_0 = 13,
72 Qt_5_1 = 14,
73 Qt_5_2 = 15,
74 Qt_5_3 = Qt_5_2,
75 Qt_5_4 = 16,
76 Qt_5_5 = Qt_5_4,
77 Qt_5_6 = 17,
78 Qt_5_7 = Qt_5_6,
79 Qt_5_8 = Qt_5_7,
80 Qt_5_9 = Qt_5_8,
81 Qt_5_10 = Qt_5_9,
82 Qt_5_11 = Qt_5_10,
83 Qt_5_12 = 18,
84 Qt_5_13 = 19,
85 Qt_5_14 = Qt_5_13,
86 Qt_5_15 = Qt_5_14,
87 Qt_6_0 = 20,
88 Qt_6_1 = Qt_6_0,
89 Qt_6_2 = Qt_6_0,
90 Qt_6_3 = Qt_6_0,
91 Qt_6_4 = Qt_6_0,
92 Qt_6_5 = Qt_6_0,
93 Qt_6_6 = 21,
94 Qt_6_7 = 22,
95 Qt_6_8 = Qt_6_7,
96 Qt_6_9 = Qt_6_7,
97 Qt_6_10 = 23,
98 Qt_6_11 = 24,
99 Qt_6_12 = Qt_6_11,
100 Qt_6_13 = Qt_6_11,
101 Qt_DefaultCompiledVersion = Qt_6_13
102#if QT_VERSION >= QT_VERSION_CHECK(6, 14, 0)
103#error Add the datastream version for this Qt version and update Qt_DefaultCompiledVersion
104#endif
105 };
106 Q_ENUM(Version)
107
108 enum ByteOrder {
109 BigEndian = QSysInfo::BigEndian,
110 LittleEndian = QSysInfo::LittleEndian
111 };
112
113 enum Status QT7_ONLY(: quint8) {
114 Ok,
115 ReadPastEnd,
116 ReadCorruptData,
117 WriteFailed,
118 SizeLimitExceeded,
119 };
120
121 enum FloatingPointPrecision QT7_ONLY(: quint8) {
122 SinglePrecision,
123 DoublePrecision
124 };
125
126 QDataStream();
127 explicit QDataStream(QIODevice *);
128 QDataStream(QByteArray *, OpenMode flags);
129 QDataStream(const QByteArray &);
130 ~QDataStream();
131
132 QIODevice *device() const;
133 void setDevice(QIODevice *);
134
135 bool atEnd() const;
136
137 QT_CORE_INLINE_SINCE(6, 8)
138 Status status() const;
139 void setStatus(Status status);
140 void resetStatus();
141
142 QT_CORE_INLINE_SINCE(6, 8)
143 FloatingPointPrecision floatingPointPrecision() const;
144 void setFloatingPointPrecision(FloatingPointPrecision precision);
145
146 ByteOrder byteOrder() const;
147 void setByteOrder(ByteOrder);
148
149 int version() const;
150 void setVersion(int);
151
152 QDataStream &operator>>(char &i);
153 QDataStream &operator>>(qint8 &i);
154 QDataStream &operator>>(quint8 &i);
155 QDataStream &operator>>(qint16 &i);
156 QDataStream &operator>>(quint16 &i);
157 QDataStream &operator>>(qint32 &i);
158 inline QDataStream &operator>>(quint32 &i);
159 QDataStream &operator>>(qint64 &i);
160 QDataStream &operator>>(quint64 &i);
161 QDataStream &operator>>(std::nullptr_t &ptr) { ptr = nullptr; return *this; }
162
163 QDataStream &operator>>(bool &i);
164#if QT_CORE_REMOVED_SINCE(6, 3)
165 QDataStream &operator>>(qfloat16 &f);
166#endif
167 QDataStream &operator>>(float &f);
168 QDataStream &operator>>(double &f);
169 QDataStream &operator>>(char *&str);
170 QDataStream &operator>>(char16_t &c);
171 QDataStream &operator>>(char32_t &c);
172
173 QDataStream &operator<<(char i);
174 QDataStream &operator<<(qint8 i);
175 QDataStream &operator<<(quint8 i);
176 QDataStream &operator<<(qint16 i);
177 QDataStream &operator<<(quint16 i);
178 QDataStream &operator<<(qint32 i);
179 inline QDataStream &operator<<(quint32 i);
180 QDataStream &operator<<(qint64 i);
181 QDataStream &operator<<(quint64 i);
182 QDataStream &operator<<(std::nullptr_t) { return *this; }
183#if QT_CORE_REMOVED_SINCE(6, 8) || defined(Q_QDOC)
184 QDataStream &operator<<(bool i);
185#endif
186#if !defined(Q_QDOC)
187 // Disable implicit conversions to bool (e.g. for pointers)
188 template <typename T,
189 std::enable_if_t<std::is_same_v<T, bool>, bool> = true>
190 QDataStream &operator<<(T i)
191 {
192 return (*this << qint8(i));
193 }
194#endif
195#if QT_CORE_REMOVED_SINCE(6, 3)
196 QDataStream &operator<<(qfloat16 f);
197#endif
198 QDataStream &operator<<(float f);
199 QDataStream &operator<<(double f);
200 QDataStream &operator<<(const char *str);
201 QDataStream &operator<<(char16_t c);
202 QDataStream &operator<<(char32_t c);
203
204 explicit operator bool() const noexcept { return status() == Ok; }
205
206#if QT_DEPRECATED_SINCE(6, 11)
207 QT_DEPRECATED_VERSION_X_6_11("Use an overload that takes qint64 length.")
208 QDataStream &readBytes(char *&, uint &len);
209#endif
210#if QT_CORE_REMOVED_SINCE(6, 7)
211 QDataStream &writeBytes(const char *, uint len);
212 int skipRawData(int len);
213 int readRawData(char *, int len);
214 int writeRawData(const char *, int len);
215#endif
216 QDataStream &readBytes(char *&, qint64 &len);
217 qint64 readRawData(char *, qint64 len);
218 QDataStream &writeBytes(const char *, qint64 len);
219 qint64 writeRawData(const char *, qint64 len);
220 qint64 skipRawData(qint64 len);
221
222 void startTransaction();
223 bool commitTransaction();
224 void rollbackTransaction();
225 void abortTransaction();
226
227 bool isDeviceTransactionStarted() const;
228private:
229 Q_DISABLE_COPY(QDataStream)
230
231#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
232 void* const d = nullptr;
233#endif
234
235 QIODevice *dev = nullptr;
236 bool owndev = false;
237 bool noswap = QSysInfo::ByteOrder == QSysInfo::BigEndian;
238 quint8 fpPrecision = QDataStream::DoublePrecision;
239 quint8 q_status = Ok;
240#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
241 ByteOrder byteorder = BigEndian;
242 int ver = Qt_DefaultCompiledVersion;
243#else
244 Version ver = Qt_DefaultCompiledVersion;
245#endif
246 quint16 transactionDepth = 0;
247
248#if QT_CORE_REMOVED_SINCE(6, 7)
249 int readBlock(char *data, int len);
250#endif
251 qint64 readBlock(char *data, qint64 len);
252 static inline qint64 readQSizeType(QDataStream &s);
253 static inline bool writeQSizeType(QDataStream &s, qint64 value);
254 static constexpr quint32 NullCode = 0xffffffffu;
255 static constexpr quint32 ExtendedSize = 0xfffffffeu;
256
257 friend class QtPrivate::StreamStateSaver;
258 Q_CORE_EXPORT friend QDataStream &operator<<(QDataStream &out, const QString &str);
259 Q_CORE_EXPORT friend QDataStream &operator>>(QDataStream &in, QString &str);
260 Q_CORE_EXPORT friend QDataStream &operator<<(QDataStream &out, const QByteArray &ba);
261 Q_CORE_EXPORT friend QDataStream &operator>>(QDataStream &in, QByteArray &ba);
262 template <typename Container>
263 friend QDataStream &QtPrivate::readArrayBasedContainer(QDataStream &s, Container &c);
264 template <typename Container>
265 friend QDataStream &QtPrivate::readListBasedContainer(QDataStream &s, Container &c);
266 template <typename Container>
267 friend QDataStream &QtPrivate::readAssociativeContainer(QDataStream &s, Container &c);
268 template <typename Container>
269 friend QDataStream &QtPrivate::writeSequentialContainer(QDataStream &s, const Container &c);
270 template <typename Container>
271 friend QDataStream &QtPrivate::writeAssociativeContainer(QDataStream &s, const Container &c);
272 template <typename Container>
273 friend QDataStream &QtPrivate::writeAssociativeMultiContainer(QDataStream &s,
274 const Container &c);
275};
276
277namespace QtPrivate {
278
280{
282public:
290 {
291 if (oldStatus != QDataStream::Ok) {
294 }
295 }
296
297private:
299 QDataStream::Status oldStatus;
300};
301
302template <typename Container>
303QDataStream &readArrayBasedContainer(QDataStream &s, Container &c)
304{
305 StreamStateSaver stateSaver(&s);
306
307 c.clear();
308 qint64 size = QDataStream::readQSizeType(s);
309 const auto n = qsizetype(size);
310 if (size != n || size < 0) {
311 s.setStatus(QDataStream::SizeLimitExceeded);
312 return s;
313 }
314 c.reserve(n);
315 for (qsizetype i = 0; i < n; ++i) {
316 typename Container::value_type t;
317 if (!(s >> t)) {
318 c.clear();
319 break;
320 }
321 c.append(t);
322 }
323
324 return s;
325}
326
327template <typename Container>
328QDataStream &readListBasedContainer(QDataStream &s, Container &c)
329{
330 StreamStateSaver stateSaver(&s);
331
332 c.clear();
333 qint64 size = QDataStream::readQSizeType(s);
334 const auto n = qsizetype(size);
335 if (size != n || size < 0) {
336 s.setStatus(QDataStream::SizeLimitExceeded);
337 return s;
338 }
339 for (qsizetype i = 0; i < n; ++i) {
340 typename Container::value_type t;
341 if (!(s >> t)) {
342 c.clear();
343 break;
344 }
345 c << t;
346 }
347
348 return s;
349}
350
351template <typename Container>
352QDataStream &readAssociativeContainer(QDataStream &s, Container &c)
353{
354 StreamStateSaver stateSaver(&s);
355
356 c.clear();
357 qint64 size = QDataStream::readQSizeType(s);
358 const auto n = qsizetype(size);
359 if (size != n || size < 0) {
360 s.setStatus(QDataStream::SizeLimitExceeded);
361 return s;
362 }
363 for (qsizetype i = 0; i < n; ++i) {
364 typename Container::key_type k;
365 typename Container::mapped_type t;
366 if (!(s >> k >> t)) {
367 c.clear();
368 break;
369 }
370 c.insert(k, t);
371 }
372
373 return s;
374}
375
376template <typename Container>
377QDataStream &writeSequentialContainer(QDataStream &s, const Container &c)
378{
379 if (!QDataStream::writeQSizeType(s, c.size()))
380 return s;
381 for (const typename Container::value_type &t : c)
382 s << t;
383
384 return s;
385}
386
387template <typename Container>
388QDataStream &writeAssociativeContainer(QDataStream &s, const Container &c)
389{
390 if (!QDataStream::writeQSizeType(s, c.size()))
391 return s;
392 auto it = c.constBegin();
393 auto end = c.constEnd();
394 while (it != end) {
395 s << it.key() << it.value();
396 ++it;
397 }
398
399 return s;
400}
401
402template <typename Container>
403QDataStream &writeAssociativeMultiContainer(QDataStream &s, const Container &c)
404{
405 if (!QDataStream::writeQSizeType(s, c.size()))
406 return s;
407 auto it = c.constBegin();
408 auto end = c.constEnd();
409 while (it != end) {
410 const auto rangeStart = it++;
411 while (it != end && rangeStart.key() == it.key())
412 ++it;
413 const qint64 last = std::distance(rangeStart, it) - 1;
414 for (qint64 i = last; i >= 0; --i) {
415 auto next = std::next(rangeStart, i);
416 s << next.key() << next.value();
417 }
418 }
419
420 return s;
421}
422
423} // QtPrivate namespace
424
425template<typename ...T>
426using QDataStreamIfHasOStreamOperators =
427 std::enable_if_t<std::conjunction_v<QTypeTraits::has_ostream_operator<QDataStream, T>...>, QDataStream &>;
428template<typename Container, typename ...T>
429using QDataStreamIfHasOStreamOperatorsContainer =
430 std::enable_if_t<std::conjunction_v<QTypeTraits::has_ostream_operator_container<QDataStream, Container, T>...>, QDataStream &>;
431
432template<typename ...T>
433using QDataStreamIfHasIStreamOperators =
434 std::enable_if_t<std::conjunction_v<QTypeTraits::has_istream_operator<QDataStream, T>...>, QDataStream &>;
435template<typename Container, typename ...T>
436using QDataStreamIfHasIStreamOperatorsContainer =
437 std::enable_if_t<std::conjunction_v<QTypeTraits::has_istream_operator_container<QDataStream, Container, T>...>, QDataStream &>;
438
439/*****************************************************************************
440 QDataStream inline functions
441 *****************************************************************************/
442
443inline QIODevice *QDataStream::device() const
444{ return dev; }
445
446#if QT_CORE_INLINE_IMPL_SINCE(6, 8)
447QDataStream::Status QDataStream::status() const
448{
449 return Status(q_status);
450}
451
452QDataStream::FloatingPointPrecision QDataStream::floatingPointPrecision() const
453{
454 return FloatingPointPrecision(fpPrecision);
455}
456#endif // INLINE_SINCE 6.8
457
458inline QDataStream::ByteOrder QDataStream::byteOrder() const
459{
460 if constexpr (QSysInfo::ByteOrder == QSysInfo::BigEndian)
461 return noswap ? BigEndian : LittleEndian;
462 return noswap ? LittleEndian : BigEndian;
463}
464
465inline int QDataStream::version() const
466{ return ver; }
467
468inline void QDataStream::setVersion(int v)
469{ ver = Version(v); }
470
471qint64 QDataStream::readQSizeType(QDataStream &s)
472{
473 quint32 first;
474 s >> first;
475 if (first == NullCode)
476 return -1;
477 if (first < ExtendedSize || s.version() < QDataStream::Qt_6_7)
478 return qint64(first);
479 qint64 extendedLen;
480 s >> extendedLen;
481 return extendedLen;
482}
483
484bool QDataStream::writeQSizeType(QDataStream &s, qint64 value)
485{
486 if (value < qint64(ExtendedSize)) {
487 s << quint32(value);
488 } else if (s.version() >= QDataStream::Qt_6_7) {
489 s << ExtendedSize << value;
490 } else if (value == qint64(ExtendedSize)) {
491 s << ExtendedSize;
492 } else {
493 s.setStatus(QDataStream::SizeLimitExceeded); // value is too big for old format
494 return false;
495 }
496 return true;
497}
498
499inline QDataStream &QDataStream::operator>>(char &i)
500{ return *this >> reinterpret_cast<qint8&>(i); }
501
502inline QDataStream &QDataStream::operator>>(quint8 &i)
503{ return *this >> reinterpret_cast<qint8&>(i); }
504
505inline QDataStream &QDataStream::operator>>(quint16 &i)
506{ return *this >> reinterpret_cast<qint16&>(i); }
507
508inline QDataStream &QDataStream::operator>>(quint32 &i)
509{ return *this >> reinterpret_cast<qint32&>(i); }
510
511inline QDataStream &QDataStream::operator>>(quint64 &i)
512{ return *this >> reinterpret_cast<qint64&>(i); }
513
514inline QDataStream &QDataStream::operator<<(char i)
515{ return *this << qint8(i); }
516
517inline QDataStream &QDataStream::operator<<(quint8 i)
518{ return *this << qint8(i); }
519
520inline QDataStream &QDataStream::operator<<(quint16 i)
521{ return *this << qint16(i); }
522
523inline QDataStream &QDataStream::operator<<(quint32 i)
524{ return *this << qint32(i); }
525
526inline QDataStream &QDataStream::operator<<(quint64 i)
527{ return *this << qint64(i); }
528
529template <typename Enum>
530inline QDataStream &operator<<(QDataStream &s, QFlags<Enum> e)
531{ return s << e.toInt(); }
532
533template <typename Enum>
534inline QDataStream &operator>>(QDataStream &s, QFlags<Enum> &e)
535{
536 typename QFlags<Enum>::Int i;
537 s >> i;
538 e = QFlags<Enum>::fromInt(i);
539 return s;
540}
541
542template <typename T>
543typename std::enable_if_t<std::is_enum<T>::value, QDataStream &>
544operator<<(QDataStream &s, const T &t)
545{
546 // std::underlying_type_t<T> may be long or ulong, for which QDataStream
547 // provides no streaming operators. For those, cast to qint64 or quint64.
548 return s << typename QIntegerForSizeof<T>::Unsigned(t);
549}
550
551template <typename T>
553operator>>(QDataStream &s, T &t)
554{
555 typename QIntegerForSizeof<T>::Unsigned i;
556 s >> i;
557 t = T(i);
558 return s;
559}
560
561Q_CORE_EXPORT QDataStream &operator<<(QDataStream &out, QChar chr);
562Q_CORE_EXPORT QDataStream &operator>>(QDataStream &in, QChar &chr);
563
564#ifndef Q_QDOC
565
566template<typename T>
567inline QDataStreamIfHasIStreamOperatorsContainer<QList<T>, T> operator>>(QDataStream &s, QList<T> &v)
568{
569 return QtPrivate::readArrayBasedContainer(s, v);
570}
571
572template<typename T>
573inline QDataStreamIfHasOStreamOperatorsContainer<QList<T>, T> operator<<(QDataStream &s, const QList<T> &v)
574{
575 return QtPrivate::writeSequentialContainer(s, v);
576}
577
578template <typename T>
579inline QDataStreamIfHasIStreamOperatorsContainer<QSet<T>, T> operator>>(QDataStream &s, QSet<T> &set)
580{
581 return QtPrivate::readListBasedContainer(s, set);
582}
583
584template <typename T>
585inline QDataStreamIfHasOStreamOperatorsContainer<QSet<T>, T> operator<<(QDataStream &s, const QSet<T> &set)
586{
587 return QtPrivate::writeSequentialContainer(s, set);
588}
589
590template <class Key, class T>
591inline QDataStreamIfHasIStreamOperatorsContainer<QHash<Key, T>, Key, T> operator>>(QDataStream &s, QHash<Key, T> &hash)
592{
593 return QtPrivate::readAssociativeContainer(s, hash);
594}
595
596template <class Key, class T>
597
598inline QDataStreamIfHasOStreamOperatorsContainer<QHash<Key, T>, Key, T> operator<<(QDataStream &s, const QHash<Key, T> &hash)
599{
600 return QtPrivate::writeAssociativeContainer(s, hash);
601}
602
603template <class Key, class T>
604inline QDataStreamIfHasIStreamOperatorsContainer<QMultiHash<Key, T>, Key, T> operator>>(QDataStream &s, QMultiHash<Key, T> &hash)
605{
606 return QtPrivate::readAssociativeContainer(s, hash);
607}
608
609template <class Key, class T>
610inline QDataStreamIfHasOStreamOperatorsContainer<QMultiHash<Key, T>, Key, T> operator<<(QDataStream &s, const QMultiHash<Key, T> &hash)
611{
612 return QtPrivate::writeAssociativeMultiContainer(s, hash);
613}
614
615template <class Key, class T>
616inline QDataStreamIfHasIStreamOperatorsContainer<QMap<Key, T>, Key, T> operator>>(QDataStream &s, QMap<Key, T> &map)
617{
618 return QtPrivate::readAssociativeContainer(s, map);
619}
620
621template <class Key, class T>
622inline QDataStreamIfHasOStreamOperatorsContainer<QMap<Key, T>, Key, T> operator<<(QDataStream &s, const QMap<Key, T> &map)
623{
624 return QtPrivate::writeAssociativeContainer(s, map);
625}
626
627template <class Key, class T>
628inline QDataStreamIfHasIStreamOperatorsContainer<QMultiMap<Key, T>, Key, T> operator>>(QDataStream &s, QMultiMap<Key, T> &map)
629{
630 return QtPrivate::readAssociativeContainer(s, map);
631}
632
633template <class Key, class T>
634inline QDataStreamIfHasOStreamOperatorsContainer<QMultiMap<Key, T>, Key, T> operator<<(QDataStream &s, const QMultiMap<Key, T> &map)
635{
636 return QtPrivate::writeAssociativeMultiContainer(s, map);
637}
638
639template <class T1, class T2>
640inline QDataStreamIfHasIStreamOperators<T1, T2> operator>>(QDataStream& s, std::pair<T1, T2> &p)
641{
642 s >> p.first >> p.second;
643 return s;
644}
645
646template <class T1, class T2>
647inline QDataStreamIfHasOStreamOperators<T1, T2> operator<<(QDataStream& s, const std::pair<T1, T2> &p)
648{
649 s << p.first << p.second;
650 return s;
651}
652
653#else
654
655template <class T>
656QDataStream &operator>>(QDataStream &s, QList<T> &l);
657
658template <class T>
659QDataStream &operator<<(QDataStream &s, const QList<T> &l);
660
661template <class T>
662QDataStream &operator>>(QDataStream &s, QSet<T> &set);
663
664template <class T>
665QDataStream &operator<<(QDataStream &s, const QSet<T> &set);
666
667template <class Key, class T>
668QDataStream &operator>>(QDataStream &s, QHash<Key, T> &hash);
669
670template <class Key, class T>
671QDataStream &operator<<(QDataStream &s, const QHash<Key, T> &hash);
672
673template <class Key, class T>
674QDataStream &operator>>(QDataStream &s, QMultiHash<Key, T> &hash);
675
676template <class Key, class T>
677QDataStream &operator<<(QDataStream &s, const QMultiHash<Key, T> &hash);
678
679template <class Key, class T>
680QDataStream &operator>>(QDataStream &s, QMap<Key, T> &map);
681
682template <class Key, class T>
683QDataStream &operator<<(QDataStream &s, const QMap<Key, T> &map);
684
685template <class Key, class T>
686QDataStream &operator>>(QDataStream &s, QMultiMap<Key, T> &map);
687
688template <class Key, class T>
689QDataStream &operator<<(QDataStream &s, const QMultiMap<Key, T> &map);
690
691template <class T1, class T2>
692QDataStream &operator>>(QDataStream& s, std::pair<T1, T2> &p);
693
694template <class T1, class T2>
695QDataStream &operator<<(QDataStream& s, const std::pair<T1, T2> &p);
696
697#endif // Q_QDOC
698
699inline QDataStream &operator>>(QDataStream &s, QKeyCombination &combination)
700{
701 int combined;
702 s >> combined;
703 combination = QKeyCombination::fromCombined(combined);
704 return s;
705}
706
707inline QDataStream &operator<<(QDataStream &s, QKeyCombination combination)
708{
709 return s << combination.toCombined();
710}
711
712#endif // QT_NO_DATASTREAM
713
714QT_END_NAMESPACE
715
716#endif // QDATASTREAM_H
static bool readIniSection(const QSettingsKey &section, QByteArrayView data, ParsedSettingsMap *settingsMap)
void set(const QString &key, const QVariant &value) override
QStringList children(const QString &prefix, ChildSpec spec) const override
virtual void initAccess()
bool readIniFile(QByteArrayView data, UnparsedSettingsMap *unparsedIniSections)
bool isWritable() const override
QString fileName() const override
QConfFileSettingsPrivate(QSettings::Format format, QSettings::Scope scope, const QString &organization, const QString &application)
void remove(const QString &key) override
QConfFileSettingsPrivate(const QString &fileName, QSettings::Format format)
const QList< QConfFile * > & getConfFiles() const
static bool readIniLine(QByteArrayView data, qsizetype &dataPos, qsizetype &lineStart, qsizetype &lineLen, qsizetype &equalsPos)
std::optional< QVariant > get(const QString &key) const override
QString name
QAtomicInt ref
UnparsedSettingsMap unparsedIniSections
ParsedSettingsMap originalKeys
qint64 size
bool userPerms
static Q_AUTOTEST_EXPORT void clearCache()
QDateTime timeStamp
QMutex mutex
ParsedSettingsMap removedKeys
ParsedSettingsMap mergedKeyMap() const
static QConfFile * fromName(const QString &name, bool _userPerms)
bool isWritable() const
ParsedSettingsMap addedKeys
\inmodule QtCore\reentrant
Definition qdatastream.h:50
Definition qfile.h:71
\inmodule QtCore
Definition qlockfile.h:19
QSettingsGroup(const QString &s, bool guessArraySize)
Definition qsettings_p.h:88
qsizetype num
Definition qsettings_p.h:99
QString toString() const
QString name() const
Definition qsettings_p.h:91
bool isArray() const
Definition qsettings_p.h:93
qsizetype arraySizeGuess() const
Definition qsettings_p.h:94
qsizetype maxNum
QSettingsGroup(const QString &s)
Definition qsettings_p.h:86
void setArrayIndex(qsizetype i)
Definition qsettings_p.h:95
qsizetype position
QSettingsIniKey(const QString &str, qsizetype pos=-1)
QSettingsKey(const QString &key, Qt::CaseSensitivity cs, qsizetype=-1)
Definition qsettings_p.h:48
QString originalCaseKey() const
Definition qsettings_p.h:51
qsizetype originalKeyPosition() const
Definition qsettings_p.h:52
\inmodule QtCore
Definition qsettings.h:31
Combined button and popup list for selecting options.
QDataStream & readListBasedContainer(QDataStream &s, Container &c)
QDataStream & readAssociativeContainer(QDataStream &s, Container &c)
QDataStream & writeAssociativeContainer(QDataStream &s, const Container &c)
QDataStream & writeAssociativeMultiContainer(QDataStream &s, const Container &c)
QDataStream & writeSequentialContainer(QDataStream &s, const Container &c)
QDataStream & readArrayBasedContainer(QDataStream &s, Container &c)
static const char charTraits[256]
std::enable_if_t< std::is_enum< T >::value, QDataStream & > operator>>(QDataStream &s, T &t)
QDataStream & operator>>(QDataStream &s, QFlags< Enum > &e)
QDataStreamIfHasIStreamOperators< T1, T2 > operator>>(QDataStream &s, std::pair< T1, T2 > &p)
QDataStream & operator>>(QDataStream &s, QKeyCombination &combination)
QDataStreamIfHasIStreamOperatorsContainer< QHash< Key, T >, Key, T > operator>>(QDataStream &s, QHash< Key, T > &hash)
QDataStreamIfHasIStreamOperatorsContainer< QList< T >, T > operator>>(QDataStream &s, QList< T > &v)
QMap< QString, QSettingsIniSection > IniMap
QList< QConfFileCustomFormat > CustomFormatVector
Definition qsettings.cpp:89
static bool operator<(const QSettingsIniKey &k1, const QSettingsIniKey &k2)
static constexpr QChar sep
static Path getPath(QSettings::Format format, QSettings::Scope scope)
QMap< QSettingsIniKey, QVariant > IniKeyMap
static int pathHashKey(QSettings::Format format, QSettings::Scope scope)
static QString make_user_path()
static std::unique_lock< QBasicMutex > initDefaultPaths(std::unique_lock< QBasicMutex > locker)
static QString make_user_path_without_qstandard_paths()
QHash< QString, QConfFile * > ConfFileHash
Definition qsettings.cpp:75
QHash< int, Path > PathHash
Definition qsettings.cpp:88
Q_DECLARE_TYPEINFO(QSettingsIniSection, Q_RELOCATABLE_TYPE)
Q_DECLARE_TYPEINFO(QConfFileCustomFormat, Q_RELOCATABLE_TYPE)
Q_DECLARE_TYPEINFO(QSettingsIniKey, Q_RELOCATABLE_TYPE)
QCache< QString, QConfFile > ConfFileCache
Definition qsettings.cpp:76
#define FLUSH_CURRENT_SECTION()
static void iniChopTrailingSpaces(QString &str, qsizetype limit)
Q_DECLARE_TYPEINFO(QSettingsGroup, Q_RELOCATABLE_TYPE)
static const Qt::CaseSensitivity IniCaseSensitivity
Definition qsettings_p.h:43
Q_DECLARE_TYPEINFO(QSettingsKey, Q_RELOCATABLE_TYPE)
QMap< QSettingsKey, QByteArray > UnparsedSettingsMap
Definition qsettings_p.h:78
QMap< QSettingsKey, QVariant > ParsedSettingsMap
Definition qsettings_p.h:79
#define QT_QSETTINGS_ALWAYS_CASE_SENSITIVE_AND_FORGET_ORIGINAL_KEY_ORDER
Definition qsettings_p.h:36
QSettings settings("MyCompany", "MyApp")
[11]
Qt::CaseSensitivity caseSensitivity
Definition qsettings.cpp:71