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_DefaultCompiledVersion = Qt_6_12
101#if QT_VERSION >= QT_VERSION_CHECK(6, 13, 0)
102#error Add the datastream version for this Qt version and update Qt_DefaultCompiledVersion
103#endif
104 };
105 Q_ENUM(Version)
106
107 enum ByteOrder {
108 BigEndian = QSysInfo::BigEndian,
109 LittleEndian = QSysInfo::LittleEndian
110 };
111
112 enum Status QT7_ONLY(: quint8) {
113 Ok,
114 ReadPastEnd,
115 ReadCorruptData,
116 WriteFailed,
117 SizeLimitExceeded,
118 };
119
120 enum FloatingPointPrecision QT7_ONLY(: quint8) {
121 SinglePrecision,
122 DoublePrecision
123 };
124
125 QDataStream();
126 explicit QDataStream(QIODevice *);
127 QDataStream(QByteArray *, OpenMode flags);
128 QDataStream(const QByteArray &);
129 ~QDataStream();
130
131 QIODevice *device() const;
132 void setDevice(QIODevice *);
133
134 bool atEnd() const;
135
136 QT_CORE_INLINE_SINCE(6, 8)
137 Status status() const;
138 void setStatus(Status status);
139 void resetStatus();
140
141 QT_CORE_INLINE_SINCE(6, 8)
142 FloatingPointPrecision floatingPointPrecision() const;
143 void setFloatingPointPrecision(FloatingPointPrecision precision);
144
145 ByteOrder byteOrder() const;
146 void setByteOrder(ByteOrder);
147
148 int version() const;
149 void setVersion(int);
150
151 QDataStream &operator>>(char &i);
152 QDataStream &operator>>(qint8 &i);
153 QDataStream &operator>>(quint8 &i);
154 QDataStream &operator>>(qint16 &i);
155 QDataStream &operator>>(quint16 &i);
156 QDataStream &operator>>(qint32 &i);
157 inline QDataStream &operator>>(quint32 &i);
158 QDataStream &operator>>(qint64 &i);
159 QDataStream &operator>>(quint64 &i);
160 QDataStream &operator>>(std::nullptr_t &ptr) { ptr = nullptr; return *this; }
161
162 QDataStream &operator>>(bool &i);
163#if QT_CORE_REMOVED_SINCE(6, 3)
164 QDataStream &operator>>(qfloat16 &f);
165#endif
166 QDataStream &operator>>(float &f);
167 QDataStream &operator>>(double &f);
168 QDataStream &operator>>(char *&str);
169 QDataStream &operator>>(char16_t &c);
170 QDataStream &operator>>(char32_t &c);
171
172 QDataStream &operator<<(char i);
173 QDataStream &operator<<(qint8 i);
174 QDataStream &operator<<(quint8 i);
175 QDataStream &operator<<(qint16 i);
176 QDataStream &operator<<(quint16 i);
177 QDataStream &operator<<(qint32 i);
178 inline QDataStream &operator<<(quint32 i);
179 QDataStream &operator<<(qint64 i);
180 QDataStream &operator<<(quint64 i);
181 QDataStream &operator<<(std::nullptr_t) { return *this; }
182#if QT_CORE_REMOVED_SINCE(6, 8) || defined(Q_QDOC)
183 QDataStream &operator<<(bool i);
184#endif
185#if !defined(Q_QDOC)
186 // Disable implicit conversions to bool (e.g. for pointers)
187 template <typename T,
188 std::enable_if_t<std::is_same_v<T, bool>, bool> = true>
189 QDataStream &operator<<(T i)
190 {
191 return (*this << qint8(i));
192 }
193#endif
194#if QT_CORE_REMOVED_SINCE(6, 3)
195 QDataStream &operator<<(qfloat16 f);
196#endif
197 QDataStream &operator<<(float f);
198 QDataStream &operator<<(double f);
199 QDataStream &operator<<(const char *str);
200 QDataStream &operator<<(char16_t c);
201 QDataStream &operator<<(char32_t c);
202
203 explicit operator bool() const noexcept { return status() == Ok; }
204
205#if QT_DEPRECATED_SINCE(6, 11)
206 QT_DEPRECATED_VERSION_X_6_11("Use an overload that takes qint64 length.")
207 QDataStream &readBytes(char *&, uint &len);
208#endif
209#if QT_CORE_REMOVED_SINCE(6, 7)
210 QDataStream &writeBytes(const char *, uint len);
211 int skipRawData(int len);
212 int readRawData(char *, int len);
213 int writeRawData(const char *, int len);
214#endif
215 QDataStream &readBytes(char *&, qint64 &len);
216 qint64 readRawData(char *, qint64 len);
217 QDataStream &writeBytes(const char *, qint64 len);
218 qint64 writeRawData(const char *, qint64 len);
219 qint64 skipRawData(qint64 len);
220
221 void startTransaction();
222 bool commitTransaction();
223 void rollbackTransaction();
224 void abortTransaction();
225
226 bool isDeviceTransactionStarted() const;
227private:
228 Q_DISABLE_COPY(QDataStream)
229
230#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
231 void* const d = nullptr;
232#endif
233
234 QIODevice *dev = nullptr;
235 bool owndev = false;
236 bool noswap = QSysInfo::ByteOrder == QSysInfo::BigEndian;
237 quint8 fpPrecision = QDataStream::DoublePrecision;
238 quint8 q_status = Ok;
239#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && !defined(QT_BOOTSTRAPPED)
240 ByteOrder byteorder = BigEndian;
241 int ver = Qt_DefaultCompiledVersion;
242#else
243 Version ver = Qt_DefaultCompiledVersion;
244#endif
245 quint16 transactionDepth = 0;
246
247#if QT_CORE_REMOVED_SINCE(6, 7)
248 int readBlock(char *data, int len);
249#endif
250 qint64 readBlock(char *data, qint64 len);
251 static inline qint64 readQSizeType(QDataStream &s);
252 static inline bool writeQSizeType(QDataStream &s, qint64 value);
253 static constexpr quint32 NullCode = 0xffffffffu;
254 static constexpr quint32 ExtendedSize = 0xfffffffeu;
255
256 friend class QtPrivate::StreamStateSaver;
257 Q_CORE_EXPORT friend QDataStream &operator<<(QDataStream &out, const QString &str);
258 Q_CORE_EXPORT friend QDataStream &operator>>(QDataStream &in, QString &str);
259 Q_CORE_EXPORT friend QDataStream &operator<<(QDataStream &out, const QByteArray &ba);
260 Q_CORE_EXPORT friend QDataStream &operator>>(QDataStream &in, QByteArray &ba);
261 template <typename Container>
262 friend QDataStream &QtPrivate::readArrayBasedContainer(QDataStream &s, Container &c);
263 template <typename Container>
264 friend QDataStream &QtPrivate::readListBasedContainer(QDataStream &s, Container &c);
265 template <typename Container>
266 friend QDataStream &QtPrivate::readAssociativeContainer(QDataStream &s, Container &c);
267 template <typename Container>
268 friend QDataStream &QtPrivate::writeSequentialContainer(QDataStream &s, const Container &c);
269 template <typename Container>
270 friend QDataStream &QtPrivate::writeAssociativeContainer(QDataStream &s, const Container &c);
271 template <typename Container>
272 friend QDataStream &QtPrivate::writeAssociativeMultiContainer(QDataStream &s,
273 const Container &c);
274};
275
276namespace QtPrivate {
277
279{
281public:
289 {
290 if (oldStatus != QDataStream::Ok) {
293 }
294 }
295
296private:
298 QDataStream::Status oldStatus;
299};
300
301template <typename Container>
302QDataStream &readArrayBasedContainer(QDataStream &s, Container &c)
303{
304 StreamStateSaver stateSaver(&s);
305
306 c.clear();
307 qint64 size = QDataStream::readQSizeType(s);
308 const auto n = qsizetype(size);
309 if (size != n || size < 0) {
310 s.setStatus(QDataStream::SizeLimitExceeded);
311 return s;
312 }
313 c.reserve(n);
314 for (qsizetype i = 0; i < n; ++i) {
315 typename Container::value_type t;
316 if (!(s >> t)) {
317 c.clear();
318 break;
319 }
320 c.append(t);
321 }
322
323 return s;
324}
325
326template <typename Container>
327QDataStream &readListBasedContainer(QDataStream &s, Container &c)
328{
329 StreamStateSaver stateSaver(&s);
330
331 c.clear();
332 qint64 size = QDataStream::readQSizeType(s);
333 const auto n = qsizetype(size);
334 if (size != n || size < 0) {
335 s.setStatus(QDataStream::SizeLimitExceeded);
336 return s;
337 }
338 for (qsizetype i = 0; i < n; ++i) {
339 typename Container::value_type t;
340 if (!(s >> t)) {
341 c.clear();
342 break;
343 }
344 c << t;
345 }
346
347 return s;
348}
349
350template <typename Container>
351QDataStream &readAssociativeContainer(QDataStream &s, Container &c)
352{
353 StreamStateSaver stateSaver(&s);
354
355 c.clear();
356 qint64 size = QDataStream::readQSizeType(s);
357 const auto n = qsizetype(size);
358 if (size != n || size < 0) {
359 s.setStatus(QDataStream::SizeLimitExceeded);
360 return s;
361 }
362 for (qsizetype i = 0; i < n; ++i) {
363 typename Container::key_type k;
364 typename Container::mapped_type t;
365 if (!(s >> k >> t)) {
366 c.clear();
367 break;
368 }
369 c.insert(k, t);
370 }
371
372 return s;
373}
374
375template <typename Container>
376QDataStream &writeSequentialContainer(QDataStream &s, const Container &c)
377{
378 if (!QDataStream::writeQSizeType(s, c.size()))
379 return s;
380 for (const typename Container::value_type &t : c)
381 s << t;
382
383 return s;
384}
385
386template <typename Container>
387QDataStream &writeAssociativeContainer(QDataStream &s, const Container &c)
388{
389 if (!QDataStream::writeQSizeType(s, c.size()))
390 return s;
391 auto it = c.constBegin();
392 auto end = c.constEnd();
393 while (it != end) {
394 s << it.key() << it.value();
395 ++it;
396 }
397
398 return s;
399}
400
401template <typename Container>
402QDataStream &writeAssociativeMultiContainer(QDataStream &s, const Container &c)
403{
404 if (!QDataStream::writeQSizeType(s, c.size()))
405 return s;
406 auto it = c.constBegin();
407 auto end = c.constEnd();
408 while (it != end) {
409 const auto rangeStart = it++;
410 while (it != end && rangeStart.key() == it.key())
411 ++it;
412 const qint64 last = std::distance(rangeStart, it) - 1;
413 for (qint64 i = last; i >= 0; --i) {
414 auto next = std::next(rangeStart, i);
415 s << next.key() << next.value();
416 }
417 }
418
419 return s;
420}
421
422} // QtPrivate namespace
423
424template<typename ...T>
425using QDataStreamIfHasOStreamOperators =
426 std::enable_if_t<std::conjunction_v<QTypeTraits::has_ostream_operator<QDataStream, T>...>, QDataStream &>;
427template<typename Container, typename ...T>
428using QDataStreamIfHasOStreamOperatorsContainer =
429 std::enable_if_t<std::conjunction_v<QTypeTraits::has_ostream_operator_container<QDataStream, Container, T>...>, QDataStream &>;
430
431template<typename ...T>
432using QDataStreamIfHasIStreamOperators =
433 std::enable_if_t<std::conjunction_v<QTypeTraits::has_istream_operator<QDataStream, T>...>, QDataStream &>;
434template<typename Container, typename ...T>
435using QDataStreamIfHasIStreamOperatorsContainer =
436 std::enable_if_t<std::conjunction_v<QTypeTraits::has_istream_operator_container<QDataStream, Container, T>...>, QDataStream &>;
437
438/*****************************************************************************
439 QDataStream inline functions
440 *****************************************************************************/
441
442inline QIODevice *QDataStream::device() const
443{ return dev; }
444
445#if QT_CORE_INLINE_IMPL_SINCE(6, 8)
446QDataStream::Status QDataStream::status() const
447{
448 return Status(q_status);
449}
450
451QDataStream::FloatingPointPrecision QDataStream::floatingPointPrecision() const
452{
453 return FloatingPointPrecision(fpPrecision);
454}
455#endif // INLINE_SINCE 6.8
456
457inline QDataStream::ByteOrder QDataStream::byteOrder() const
458{
459 if constexpr (QSysInfo::ByteOrder == QSysInfo::BigEndian)
460 return noswap ? BigEndian : LittleEndian;
461 return noswap ? LittleEndian : BigEndian;
462}
463
464inline int QDataStream::version() const
465{ return ver; }
466
467inline void QDataStream::setVersion(int v)
468{ ver = Version(v); }
469
470qint64 QDataStream::readQSizeType(QDataStream &s)
471{
472 quint32 first;
473 s >> first;
474 if (first == NullCode)
475 return -1;
476 if (first < ExtendedSize || s.version() < QDataStream::Qt_6_7)
477 return qint64(first);
478 qint64 extendedLen;
479 s >> extendedLen;
480 return extendedLen;
481}
482
483bool QDataStream::writeQSizeType(QDataStream &s, qint64 value)
484{
485 if (value < qint64(ExtendedSize)) {
486 s << quint32(value);
487 } else if (s.version() >= QDataStream::Qt_6_7) {
488 s << ExtendedSize << value;
489 } else if (value == qint64(ExtendedSize)) {
490 s << ExtendedSize;
491 } else {
492 s.setStatus(QDataStream::SizeLimitExceeded); // value is too big for old format
493 return false;
494 }
495 return true;
496}
497
498inline QDataStream &QDataStream::operator>>(char &i)
499{ return *this >> reinterpret_cast<qint8&>(i); }
500
501inline QDataStream &QDataStream::operator>>(quint8 &i)
502{ return *this >> reinterpret_cast<qint8&>(i); }
503
504inline QDataStream &QDataStream::operator>>(quint16 &i)
505{ return *this >> reinterpret_cast<qint16&>(i); }
506
507inline QDataStream &QDataStream::operator>>(quint32 &i)
508{ return *this >> reinterpret_cast<qint32&>(i); }
509
510inline QDataStream &QDataStream::operator>>(quint64 &i)
511{ return *this >> reinterpret_cast<qint64&>(i); }
512
513inline QDataStream &QDataStream::operator<<(char i)
514{ return *this << qint8(i); }
515
516inline QDataStream &QDataStream::operator<<(quint8 i)
517{ return *this << qint8(i); }
518
519inline QDataStream &QDataStream::operator<<(quint16 i)
520{ return *this << qint16(i); }
521
522inline QDataStream &QDataStream::operator<<(quint32 i)
523{ return *this << qint32(i); }
524
525inline QDataStream &QDataStream::operator<<(quint64 i)
526{ return *this << qint64(i); }
527
528template <typename Enum>
529inline QDataStream &operator<<(QDataStream &s, QFlags<Enum> e)
530{ return s << e.toInt(); }
531
532template <typename Enum>
533inline QDataStream &operator>>(QDataStream &s, QFlags<Enum> &e)
534{
535 typename QFlags<Enum>::Int i;
536 s >> i;
537 e = QFlags<Enum>::fromInt(i);
538 return s;
539}
540
541template <typename T>
542typename std::enable_if_t<std::is_enum<T>::value, QDataStream &>
543operator<<(QDataStream &s, const T &t)
544{
545 // std::underlying_type_t<T> may be long or ulong, for which QDataStream
546 // provides no streaming operators. For those, cast to qint64 or quint64.
547 return s << typename QIntegerForSizeof<T>::Unsigned(t);
548}
549
550template <typename T>
552operator>>(QDataStream &s, T &t)
553{
554 typename QIntegerForSizeof<T>::Unsigned i;
555 s >> i;
556 t = T(i);
557 return s;
558}
559
560Q_CORE_EXPORT QDataStream &operator<<(QDataStream &out, QChar chr);
561Q_CORE_EXPORT QDataStream &operator>>(QDataStream &in, QChar &chr);
562
563#ifndef Q_QDOC
564
565template<typename T>
566inline QDataStreamIfHasIStreamOperatorsContainer<QList<T>, T> operator>>(QDataStream &s, QList<T> &v)
567{
568 return QtPrivate::readArrayBasedContainer(s, v);
569}
570
571template<typename T>
572inline QDataStreamIfHasOStreamOperatorsContainer<QList<T>, T> operator<<(QDataStream &s, const QList<T> &v)
573{
574 return QtPrivate::writeSequentialContainer(s, v);
575}
576
577template <typename T>
578inline QDataStreamIfHasIStreamOperatorsContainer<QSet<T>, T> operator>>(QDataStream &s, QSet<T> &set)
579{
580 return QtPrivate::readListBasedContainer(s, set);
581}
582
583template <typename T>
584inline QDataStreamIfHasOStreamOperatorsContainer<QSet<T>, T> operator<<(QDataStream &s, const QSet<T> &set)
585{
586 return QtPrivate::writeSequentialContainer(s, set);
587}
588
589template <class Key, class T>
590inline QDataStreamIfHasIStreamOperatorsContainer<QHash<Key, T>, Key, T> operator>>(QDataStream &s, QHash<Key, T> &hash)
591{
592 return QtPrivate::readAssociativeContainer(s, hash);
593}
594
595template <class Key, class T>
596
597inline QDataStreamIfHasOStreamOperatorsContainer<QHash<Key, T>, Key, T> operator<<(QDataStream &s, const QHash<Key, T> &hash)
598{
599 return QtPrivate::writeAssociativeContainer(s, hash);
600}
601
602template <class Key, class T>
603inline QDataStreamIfHasIStreamOperatorsContainer<QMultiHash<Key, T>, Key, T> operator>>(QDataStream &s, QMultiHash<Key, T> &hash)
604{
605 return QtPrivate::readAssociativeContainer(s, hash);
606}
607
608template <class Key, class T>
609inline QDataStreamIfHasOStreamOperatorsContainer<QMultiHash<Key, T>, Key, T> operator<<(QDataStream &s, const QMultiHash<Key, T> &hash)
610{
611 return QtPrivate::writeAssociativeMultiContainer(s, hash);
612}
613
614template <class Key, class T>
615inline QDataStreamIfHasIStreamOperatorsContainer<QMap<Key, T>, Key, T> operator>>(QDataStream &s, QMap<Key, T> &map)
616{
617 return QtPrivate::readAssociativeContainer(s, map);
618}
619
620template <class Key, class T>
621inline QDataStreamIfHasOStreamOperatorsContainer<QMap<Key, T>, Key, T> operator<<(QDataStream &s, const QMap<Key, T> &map)
622{
623 return QtPrivate::writeAssociativeContainer(s, map);
624}
625
626template <class Key, class T>
627inline QDataStreamIfHasIStreamOperatorsContainer<QMultiMap<Key, T>, Key, T> operator>>(QDataStream &s, QMultiMap<Key, T> &map)
628{
629 return QtPrivate::readAssociativeContainer(s, map);
630}
631
632template <class Key, class T>
633inline QDataStreamIfHasOStreamOperatorsContainer<QMultiMap<Key, T>, Key, T> operator<<(QDataStream &s, const QMultiMap<Key, T> &map)
634{
635 return QtPrivate::writeAssociativeMultiContainer(s, map);
636}
637
638template <class T1, class T2>
639inline QDataStreamIfHasIStreamOperators<T1, T2> operator>>(QDataStream& s, std::pair<T1, T2> &p)
640{
641 s >> p.first >> p.second;
642 return s;
643}
644
645template <class T1, class T2>
646inline QDataStreamIfHasOStreamOperators<T1, T2> operator<<(QDataStream& s, const std::pair<T1, T2> &p)
647{
648 s << p.first << p.second;
649 return s;
650}
651
652#else
653
654template <class T>
655QDataStream &operator>>(QDataStream &s, QList<T> &l);
656
657template <class T>
658QDataStream &operator<<(QDataStream &s, const QList<T> &l);
659
660template <class T>
661QDataStream &operator>>(QDataStream &s, QSet<T> &set);
662
663template <class T>
664QDataStream &operator<<(QDataStream &s, const QSet<T> &set);
665
666template <class Key, class T>
667QDataStream &operator>>(QDataStream &s, QHash<Key, T> &hash);
668
669template <class Key, class T>
670QDataStream &operator<<(QDataStream &s, const QHash<Key, T> &hash);
671
672template <class Key, class T>
673QDataStream &operator>>(QDataStream &s, QMultiHash<Key, T> &hash);
674
675template <class Key, class T>
676QDataStream &operator<<(QDataStream &s, const QMultiHash<Key, T> &hash);
677
678template <class Key, class T>
679QDataStream &operator>>(QDataStream &s, QMap<Key, T> &map);
680
681template <class Key, class T>
682QDataStream &operator<<(QDataStream &s, const QMap<Key, T> &map);
683
684template <class Key, class T>
685QDataStream &operator>>(QDataStream &s, QMultiMap<Key, T> &map);
686
687template <class Key, class T>
688QDataStream &operator<<(QDataStream &s, const QMultiMap<Key, T> &map);
689
690template <class T1, class T2>
691QDataStream &operator>>(QDataStream& s, std::pair<T1, T2> &p);
692
693template <class T1, class T2>
694QDataStream &operator<<(QDataStream& s, const std::pair<T1, T2> &p);
695
696#endif // Q_QDOC
697
698inline QDataStream &operator>>(QDataStream &s, QKeyCombination &combination)
699{
700 int combined;
701 s >> combined;
702 combination = QKeyCombination::fromCombined(combined);
703 return s;
704}
705
706inline QDataStream &operator<<(QDataStream &s, QKeyCombination combination)
707{
708 return s << combination.toCombined();
709}
710
711#endif // QT_NO_DATASTREAM
712
713QT_END_NAMESPACE
714
715#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
\inmodule QtCore
Definition qfile.h:69
\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