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