Qt 6.x
The Qt SDK
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/qscopedpointer.h>
8#include <QtCore/qiodevicebase.h>
9#include <QtCore/qcontainerfwd.h>
10#include <QtCore/qnamespace.h>
11
12#ifdef Status
13#error qdatastream.h must be included before any header file that defines Status
14#endif
15
17
18#if QT_CORE_REMOVED_SINCE(6, 3)
19class qfloat16;
20#endif
21class QByteArray;
22class QIODevice;
23
24#if !defined(QT_NO_DATASTREAM) || defined(QT_BOOTSTRAPPED)
26namespace QtPrivate {
27class StreamStateSaver;
28}
29class Q_CORE_EXPORT QDataStream : public QIODeviceBase
30{
31public:
32 enum Version {
33 Qt_1_0 = 1,
34 Qt_2_0 = 2,
35 Qt_2_1 = 3,
36 Qt_3_0 = 4,
37 Qt_3_1 = 5,
38 Qt_3_3 = 6,
39 Qt_4_0 = 7,
40 Qt_4_1 = Qt_4_0,
41 Qt_4_2 = 8,
42 Qt_4_3 = 9,
43 Qt_4_4 = 10,
44 Qt_4_5 = 11,
45 Qt_4_6 = 12,
46 Qt_4_7 = Qt_4_6,
47 Qt_4_8 = Qt_4_7,
48 Qt_4_9 = Qt_4_8,
49 Qt_5_0 = 13,
50 Qt_5_1 = 14,
51 Qt_5_2 = 15,
52 Qt_5_3 = Qt_5_2,
53 Qt_5_4 = 16,
54 Qt_5_5 = Qt_5_4,
55 Qt_5_6 = 17,
56 Qt_5_7 = Qt_5_6,
57 Qt_5_8 = Qt_5_7,
58 Qt_5_9 = Qt_5_8,
59 Qt_5_10 = Qt_5_9,
60 Qt_5_11 = Qt_5_10,
61 Qt_5_12 = 18,
62 Qt_5_13 = 19,
63 Qt_5_14 = Qt_5_13,
64 Qt_5_15 = Qt_5_14,
65 Qt_6_0 = 20,
66 Qt_6_1 = Qt_6_0,
67 Qt_6_2 = Qt_6_0,
68 Qt_6_3 = Qt_6_0,
69 Qt_6_4 = Qt_6_0,
70 Qt_6_5 = Qt_6_0,
71 Qt_6_6 = 21,
72 Qt_6_7 = Qt_6_6,
73 Qt_DefaultCompiledVersion = Qt_6_7
74#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
75#error Add the datastream version for this Qt version and update Qt_DefaultCompiledVersion
76#endif
77 };
78
79 enum ByteOrder {
81 LittleEndian = QSysInfo::LittleEndian
82 };
83
84 enum Status {
88 WriteFailed
89 };
90
93 DoublePrecision
94 };
95
97 explicit QDataStream(QIODevice *);
98 QDataStream(QByteArray *, OpenMode flags);
99 QDataStream(const QByteArray &);
100 ~QDataStream();
101
102 QIODevice *device() const;
103 void setDevice(QIODevice *);
104
105 bool atEnd() const;
106
107 Status status() const;
108 void setStatus(Status status);
109 void resetStatus();
110
111 FloatingPointPrecision floatingPointPrecision() const;
112 void setFloatingPointPrecision(FloatingPointPrecision precision);
113
114 ByteOrder byteOrder() const;
115 void setByteOrder(ByteOrder);
116
117 int version() const;
118 void setVersion(int);
119
120 QDataStream &operator>>(char &i);
129 QDataStream &operator>>(std::nullptr_t &ptr) { ptr = nullptr; return *this; }
130
131 QDataStream &operator>>(bool &i);
132#if QT_CORE_REMOVED_SINCE(6, 3)
134#endif
135 QDataStream &operator>>(float &f);
136 QDataStream &operator>>(double &f);
137 QDataStream &operator>>(char *&str);
138 QDataStream &operator>>(char16_t &c);
139 QDataStream &operator>>(char32_t &c);
140
141 QDataStream &operator<<(char i);
150 QDataStream &operator<<(std::nullptr_t) { return *this; }
151 QDataStream &operator<<(bool i);
152#if QT_CORE_REMOVED_SINCE(6, 3)
154#endif
155 QDataStream &operator<<(float f);
156 QDataStream &operator<<(double f);
157 QDataStream &operator<<(const char *str);
158 QDataStream &operator<<(char16_t c);
159 QDataStream &operator<<(char32_t c);
160
161
162 QDataStream &readBytes(char *&, uint &len);
163 int readRawData(char *, int len);
164
165 QDataStream &writeBytes(const char *, uint len);
166 int writeRawData(const char *, int len);
167
168 int skipRawData(int len);
169
170 void startTransaction();
171 bool commitTransaction();
172 void rollbackTransaction();
173 void abortTransaction();
174
175 bool isDeviceTransactionStarted() const;
176private:
177 Q_DISABLE_COPY(QDataStream)
178
180
181 QIODevice *dev;
182 bool owndev;
183 bool noswap;
184 ByteOrder byteorder;
185 int ver;
186 Status q_status;
187
188 int readBlock(char *data, int len);
190};
191
192namespace QtPrivate {
193
195{
196public:
197 inline StreamStateSaver(QDataStream *s) : stream(s), oldStatus(s->status())
198 {
199 if (!stream->isDeviceTransactionStarted())
200 stream->resetStatus();
201 }
203 {
204 if (oldStatus != QDataStream::Ok) {
205 stream->resetStatus();
206 stream->setStatus(oldStatus);
207 }
208 }
209
210private:
212 QDataStream::Status oldStatus;
213};
214
215template <typename Container>
217{
218 StreamStateSaver stateSaver(&s);
219
220 c.clear();
221 quint32 n;
222 s >> n;
223 c.reserve(n);
224 for (quint32 i = 0; i < n; ++i) {
225 typename Container::value_type t;
226 s >> t;
227 if (s.status() != QDataStream::Ok) {
228 c.clear();
229 break;
230 }
231 c.append(t);
232 }
233
234 return s;
235}
236
237template <typename Container>
239{
240 StreamStateSaver stateSaver(&s);
241
242 c.clear();
243 quint32 n;
244 s >> n;
245 for (quint32 i = 0; i < n; ++i) {
246 typename Container::value_type t;
247 s >> t;
248 if (s.status() != QDataStream::Ok) {
249 c.clear();
250 break;
251 }
252 c << t;
253 }
254
255 return s;
256}
257
258template <typename Container>
260{
261 StreamStateSaver stateSaver(&s);
262
263 c.clear();
264 quint32 n;
265 s >> n;
266 for (quint32 i = 0; i < n; ++i) {
267 typename Container::key_type k;
268 typename Container::mapped_type t;
269 s >> k >> t;
270 if (s.status() != QDataStream::Ok) {
271 c.clear();
272 break;
273 }
274 c.insert(k, t);
275 }
276
277 return s;
278}
279
280template <typename Container>
282{
283 s << quint32(c.size());
284 for (const typename Container::value_type &t : c)
285 s << t;
286
287 return s;
288}
289
290template <typename Container>
292{
293 s << quint32(c.size());
294 auto it = c.constBegin();
295 auto end = c.constEnd();
296 while (it != end) {
297 s << it.key() << it.value();
298 ++it;
299 }
300
301 return s;
302}
303
304template <typename Container>
306{
307 s << quint32(c.size());
308 auto it = c.constBegin();
309 auto end = c.constEnd();
310 while (it != end) {
311 const auto rangeStart = it++;
312 while (it != end && rangeStart.key() == it.key())
313 ++it;
314 const qint64 last = std::distance(rangeStart, it) - 1;
315 for (qint64 i = last; i >= 0; --i) {
316 auto next = std::next(rangeStart, i);
317 s << next.key() << next.value();
318 }
319 }
320
321 return s;
322}
323
324} // QtPrivate namespace
325
326template<typename ...T>
328 std::enable_if_t<std::conjunction_v<QTypeTraits::has_ostream_operator<QDataStream, T>...>, QDataStream &>;
329template<typename Container, typename ...T>
331 std::enable_if_t<std::conjunction_v<QTypeTraits::has_ostream_operator_container<QDataStream, Container, T>...>, QDataStream &>;
332
333template<typename ...T>
335 std::enable_if_t<std::conjunction_v<QTypeTraits::has_istream_operator<QDataStream, T>...>, QDataStream &>;
336template<typename Container, typename ...T>
338 std::enable_if_t<std::conjunction_v<QTypeTraits::has_istream_operator_container<QDataStream, Container, T>...>, QDataStream &>;
339
340/*****************************************************************************
341 QDataStream inline functions
342 *****************************************************************************/
343
345{ return dev; }
346
348{ return byteorder; }
349
350inline int QDataStream::version() const
351{ return ver; }
352
354{ ver = v; }
355
357{ return *this >> reinterpret_cast<qint8&>(i); }
358
360{ return *this >> reinterpret_cast<qint8&>(i); }
361
363{ return *this >> reinterpret_cast<qint16&>(i); }
364
366{ return *this >> reinterpret_cast<qint32&>(i); }
367
369{ return *this >> reinterpret_cast<qint64&>(i); }
370
372{ return *this << qint8(i); }
373
375{ return *this << qint8(i); }
376
378{ return *this << qint16(i); }
379
381{ return *this << qint32(i); }
382
384{ return *this << qint64(i); }
385
386template <typename Enum>
388{ return s << typename QFlags<Enum>::Int(e); }
389
390template <typename Enum>
392{
393 typename QFlags<Enum>::Int i;
394 s >> i;
395 e = QFlag(i);
396 return s;
397}
398
399template <typename T>
400typename std::enable_if_t<std::is_enum<T>::value, QDataStream &>
401operator<<(QDataStream &s, const T &t)
402{ return s << static_cast<typename std::underlying_type<T>::type>(t); }
403
404template <typename T>
405typename std::enable_if_t<std::is_enum<T>::value, QDataStream &>
407{ return s >> reinterpret_cast<typename std::underlying_type<T>::type &>(t); }
408
409#ifndef Q_QDOC
410
411template<typename T>
413{
415}
416
417template<typename T>
419{
421}
422
423template <typename T>
425{
427}
428
429template <typename T>
431{
433}
434
435template <class Key, class T>
437{
439}
440
441template <class Key, class T>
442
444{
446}
447
448template <class Key, class T>
450{
452}
453
454template <class Key, class T>
456{
458}
459
460template <class Key, class T>
462{
464}
465
466template <class Key, class T>
468{
470}
471
472template <class Key, class T>
474{
476}
477
478template <class Key, class T>
480{
482}
483
484template <class T1, class T2>
486{
487 s >> p.first >> p.second;
488 return s;
489}
490
491template <class T1, class T2>
492inline QDataStreamIfHasOStreamOperators<T1, T2> operator<<(QDataStream& s, const std::pair<T1, T2> &p)
493{
494 s << p.first << p.second;
495 return s;
496}
497
498#else
499
500template <class T>
502
503template <class T>
505
506template <class T>
508
509template <class T>
511
512template <class Key, class T>
514
515template <class Key, class T>
517
518template <class Key, class T>
520
521template <class Key, class T>
523
524template <class Key, class T>
526
527template <class Key, class T>
529
530template <class Key, class T>
532
533template <class Key, class T>
535
536template <class T1, class T2>
537QDataStream &operator>>(QDataStream& s, std::pair<T1, T2> &p);
538
539template <class T1, class T2>
540QDataStream &operator<<(QDataStream& s, const std::pair<T1, T2> &p);
541
542#endif // Q_QDOC
543
545{
546 int combined;
547 s >> combined;
548 combination = QKeyCombination::fromCombined(combined);
549 return s;
550}
551
553{
554 return s << combination.toCombined();
555}
556
557#endif // QT_NO_DATASTREAM
558
560
561#endif // QDATASTREAM_H
IOBluetoothDevice * device
\inmodule QtCore
Definition qbytearray.h:57
\inmodule QtCore\reentrant
Definition qdatastream.h:30
QDataStream & operator>>(char &i)
ByteOrder
The byte order used for reading/writing the data.
Definition qdatastream.h:79
Version
This enum provides symbolic synonyms for the data serialization format version numbers.
Definition qdatastream.h:32
QDataStream & operator>>(std::nullptr_t &ptr)
Status
This enum describes the current status of the data stream.
Definition qdatastream.h:84
QDataStream & operator<<(std::nullptr_t)
ByteOrder byteOrder() const
Returns the current byte order setting – either BigEndian or LittleEndian.
FloatingPointPrecision
The precision of floating point numbers used for reading/writing the data.
Definition qdatastream.h:91
QIODevice * device() const
Returns the I/O device currently set, or \nullptr if no device is currently set.
int version() const
Returns the version number of the data serialization format.
QDataStream & operator<<(char i)
void setVersion(int)
Sets the version number of the data serialization format to v, a value of the \l Version enum.
Definition qflags.h:17
std::conditional< std::is_unsigned< typenamestd::underlying_type< Enum >::type >::value, unsignedint, signedint >::type Int
Definition qflags.h:69
\inmodule QtCore
Definition qhash.h:818
\inheaderfile QIODevice \inmodule QtCore
\inmodule QtCore \reentrant
Definition qiodevice.h:34
static constexpr QKeyCombination fromCombined(int combined)
constexpr int toCombined() const noexcept
Definition qlist.h:74
Definition qmap.h:186
\inmodule QtCore
Definition qhash.h:1348
\inmodule QtCore
Definition qset.h:18
const_iterator constBegin() const noexcept
Definition qset.h:139
@ BigEndian
Definition qsysinfo.h:29
@ LittleEndian
Definition qsysinfo.h:30
StreamStateSaver(QDataStream *s)
\keyword 16-bit Floating Point Support\inmodule QtCore \inheaderfile QFloat16
Definition qfloat16.h:46
format setVersion(3, 2)
QHash< int, QWidget * > hash
[35multi]
QString str
[2]
QMap< QString, QString > map
[6]
double e
QSet< QString >::iterator it
short next
Definition keywords.cpp:445
Combined button and popup list for selecting options.
\macro QT_NAMESPACE
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)
std::enable_if_t< std::conjunction_v< QTypeTraits::has_istream_operator< QDataStream, T >... >, QDataStream & > QDataStreamIfHasIStreamOperators
std::enable_if_t< std::conjunction_v< QTypeTraits::has_ostream_operator_container< QDataStream, Container, T >... >, QDataStream & > QDataStreamIfHasOStreamOperatorsContainer
std::enable_if_t< std::conjunction_v< QTypeTraits::has_ostream_operator< QDataStream, T >... >, QDataStream & > QDataStreamIfHasOStreamOperators
QDataStream & operator>>(QDataStream &s, QFlags< Enum > &e)
QDataStream & operator<<(QDataStream &s, QFlags< Enum > e)
std::enable_if_t< std::conjunction_v< QTypeTraits::has_istream_operator_container< QDataStream, Container, T >... >, QDataStream & > QDataStreamIfHasIStreamOperatorsContainer
EGLStreamKHR stream
static ControlElement< T > * ptr(QWidget *widget)
GLsizei const GLfloat * v
[13]
GLuint GLuint end
GLfloat GLfloat f
GLbitfield flags
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLfloat n
const GLubyte * c
GLenum GLsizei len
GLdouble GLdouble t
Definition qopenglext.h:243
GLdouble s
[6]
Definition qopenglext.h:235
GLfloat GLfloat p
[1]
GLenum GLint GLint * precision
unsigned int quint32
Definition qtypes.h:45
short qint16
Definition qtypes.h:42
unsigned short quint16
Definition qtypes.h:43
int qint32
Definition qtypes.h:44
unsigned long long quint64
Definition qtypes.h:56
unsigned int uint
Definition qtypes.h:29
long long qint64
Definition qtypes.h:55
QT_BEGIN_NAMESPACE typedef signed char qint8
Definition qtypes.h:40
unsigned char quint8
Definition qtypes.h:41
QFuture< QSet< QChar > > set
[10]
QDataStream & operator<<(QDataStream &out, const MyClass &myObj)
[4]
QDataStream & operator>>(QDataStream &in, MyClass &myObj)