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>
20#error qdatastream.h must be included before any header file that defines Status
25#if QT_CORE_REMOVED_SINCE(6
, 3
)
33#if !defined(QT_NO_DATASTREAM)
36template <
typename Container>
38template <
typename Container>
40template <
typename Container>
42template <
typename Container>
44template <
typename Container>
46template <
typename Container>
54 enum Version QT7_ONLY(: quint8) {
99 Qt_DefaultCompiledVersion = Qt_6_11
100#if QT_VERSION >= QT_VERSION_CHECK(6
, 12
, 0
)
101#error Add the datastream version for this Qt version and update Qt_DefaultCompiledVersion
107 BigEndian = QSysInfo::BigEndian,
108 LittleEndian = QSysInfo::LittleEndian
111 enum Status QT7_ONLY(: quint8) {
119 enum FloatingPointPrecision QT7_ONLY(: quint8) {
125 explicit QDataStream(QIODevice *);
126 QDataStream(QByteArray *, OpenMode flags);
127 QDataStream(
const QByteArray &);
130 QIODevice *device()
const;
131 void setDevice(QIODevice *);
135 QT_CORE_INLINE_SINCE(6, 8)
136 Status status()
const;
137 void setStatus(Status status);
140 QT_CORE_INLINE_SINCE(6, 8)
141 FloatingPointPrecision floatingPointPrecision()
const;
142 void setFloatingPointPrecision(FloatingPointPrecision precision);
144 ByteOrder byteOrder()
const;
145 void setByteOrder(ByteOrder);
148 void setVersion(
int);
150 QDataStream &operator>>(
char &i);
151 QDataStream &operator>>(qint8 &i);
152 QDataStream &operator>>(quint8 &i);
153 QDataStream &operator>>(qint16 &i);
154 QDataStream &operator>>(quint16 &i);
155 QDataStream &operator>>(qint32 &i);
156 inline QDataStream &operator>>(quint32 &i);
157 QDataStream &operator>>(qint64 &i);
158 QDataStream &operator>>(quint64 &i);
159 QDataStream &operator>>(std::nullptr_t &ptr) { ptr =
nullptr;
return *
this; }
161 QDataStream &operator>>(
bool &i);
162#if QT_CORE_REMOVED_SINCE(6
, 3
)
163 QDataStream &operator>>(qfloat16 &f);
165 QDataStream &operator>>(
float &f);
166 QDataStream &operator>>(
double &f);
167 QDataStream &operator>>(
char *&str);
168 QDataStream &operator>>(
char16_t &c);
169 QDataStream &operator>>(
char32_t &c);
171 QDataStream &operator<<(
char i);
172 QDataStream &operator<<(qint8 i);
173 QDataStream &operator<<(quint8 i);
174 QDataStream &operator<<(qint16 i);
175 QDataStream &operator<<(quint16 i);
176 QDataStream &operator<<(qint32 i);
177 inline QDataStream &operator<<(quint32 i);
178 QDataStream &operator<<(qint64 i);
179 QDataStream &operator<<(quint64 i);
180 QDataStream &operator<<(std::nullptr_t) {
return *
this; }
181#if QT_CORE_REMOVED_SINCE(6
, 8
) || defined(Q_QDOC)
182 QDataStream &operator<<(
bool i);
186 template <
typename T,
187 std::enable_if_t<std::is_same_v<T,
bool>,
bool> =
true>
188 QDataStream &operator<<(T i)
190 return (*
this << qint8(i));
193#if QT_CORE_REMOVED_SINCE(6
, 3
)
194 QDataStream &operator<<(qfloat16 f);
196 QDataStream &operator<<(
float f);
197 QDataStream &operator<<(
double f);
198 QDataStream &operator<<(
const char *str);
199 QDataStream &operator<<(
char16_t c);
200 QDataStream &operator<<(
char32_t c);
202 explicit operator
bool()
const noexcept {
return status() == Ok; }
204#if QT_DEPRECATED_SINCE(6
, 11
)
205 QT_DEPRECATED_VERSION_X_6_11(
"Use an overload that takes qint64 length.")
206 QDataStream &readBytes(
char *&, uint &len);
208#if QT_CORE_REMOVED_SINCE(6
, 7
)
209 QDataStream &writeBytes(
const char *, uint len);
210 int skipRawData(
int len);
211 int readRawData(
char *,
int len);
212 int writeRawData(
const char *,
int len);
214 QDataStream &readBytes(
char *&, qint64 &len);
215 qint64 readRawData(
char *, qint64 len);
216 QDataStream &writeBytes(
const char *, qint64 len);
217 qint64 writeRawData(
const char *, qint64 len);
218 qint64 skipRawData(qint64 len);
220 void startTransaction();
221 bool commitTransaction();
222 void rollbackTransaction();
223 void abortTransaction();
225 bool isDeviceTransactionStarted()
const;
227 Q_DISABLE_COPY(QDataStream)
229#if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
)
230 void*
const d =
nullptr;
233 QIODevice *dev =
nullptr;
235 bool noswap = QSysInfo::ByteOrder == QSysInfo::BigEndian;
236 quint8 fpPrecision = QDataStream::DoublePrecision;
237 quint8 q_status = Ok;
238#if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
) && !defined(QT_BOOTSTRAPPED)
239 ByteOrder byteorder = BigEndian;
240 int ver = Qt_DefaultCompiledVersion;
242 Version ver = Qt_DefaultCompiledVersion;
244 quint16 transactionDepth = 0;
246#if QT_CORE_REMOVED_SINCE(6
, 7
)
247 int readBlock(
char *data,
int len);
249 qint64 readBlock(
char *data, qint64 len);
250 static inline qint64 readQSizeType(QDataStream &s);
251 static inline bool writeQSizeType(QDataStream &s, qint64 value);
252 static constexpr quint32 NullCode = 0xffffffffu;
253 static constexpr quint32 ExtendedSize = 0xfffffffeu;
255 friend class QtPrivate::StreamStateSaver;
256 Q_CORE_EXPORT
friend QDataStream &operator<<(QDataStream &out,
const QString &str);
257 Q_CORE_EXPORT
friend QDataStream &operator>>(QDataStream &in, QString &str);
258 Q_CORE_EXPORT
friend QDataStream &operator<<(QDataStream &out,
const QByteArray &ba);
259 Q_CORE_EXPORT
friend QDataStream &operator>>(QDataStream &in, QByteArray &ba);
260 template <
typename Container>
261 friend QDataStream &QtPrivate::readArrayBasedContainer(QDataStream &s, Container &c);
262 template <
typename Container>
263 friend QDataStream &QtPrivate::readListBasedContainer(QDataStream &s, Container &c);
264 template <
typename Container>
265 friend QDataStream &QtPrivate::readAssociativeContainer(QDataStream &s, Container &c);
266 template <
typename Container>
267 friend QDataStream &QtPrivate::writeSequentialContainer(QDataStream &s,
const Container &c);
268 template <
typename Container>
269 friend QDataStream &QtPrivate::writeAssociativeContainer(QDataStream &s,
const Container &c);
270 template <
typename Container>
271 friend QDataStream &QtPrivate::writeAssociativeMultiContainer(QDataStream &s,
297 QDataStream::Status oldStatus;
300template <
typename Container>
306 qint64 size = QDataStream::readQSizeType(s);
307 const auto n = qsizetype(size);
308 if (size != n || size < 0) {
309 s.setStatus(QDataStream::SizeLimitExceeded);
313 for (qsizetype i = 0; i < n; ++i) {
314 typename Container::value_type t;
325template <
typename Container>
331 qint64 size = QDataStream::readQSizeType(s);
332 const auto n = qsizetype(size);
333 if (size != n || size < 0) {
334 s.setStatus(QDataStream::SizeLimitExceeded);
337 for (qsizetype i = 0; i < n; ++i) {
338 typename Container::value_type t;
349template <
typename Container>
355 qint64 size = QDataStream::readQSizeType(s);
356 const auto n = qsizetype(size);
357 if (size != n || size < 0) {
358 s.setStatus(QDataStream::SizeLimitExceeded);
361 for (qsizetype i = 0; i < n; ++i) {
362 typename Container::key_type k;
363 typename Container::mapped_type t;
364 if (!(s >> k >> t)) {
374template <
typename Container>
377 if (!QDataStream::writeQSizeType(s, c.size()))
379 for (
const typename Container::value_type &t : c)
385template <
typename Container>
388 if (!QDataStream::writeQSizeType(s, c.size()))
390 auto it = c.constBegin();
391 auto end = c.constEnd();
393 s << it.key() << it.value();
400template <
typename Container>
403 if (!QDataStream::writeQSizeType(s, c.size()))
405 auto it = c.constBegin();
406 auto end = c.constEnd();
408 const auto rangeStart = it++;
409 while (it != end && rangeStart.key() == it.key())
411 const qint64 last =
std::distance(rangeStart, it) - 1;
412 for (qint64 i = last; i >= 0; --i) {
413 auto next =
std::next(rangeStart, i);
414 s << next.key() << next.value();
423template<
typename ...T>
424using QDataStreamIfHasOStreamOperators =
425 std::enable_if_t<std::conjunction_v<QTypeTraits::has_ostream_operator<QDataStream, T>...>, QDataStream &>;
426template<
typename Container,
typename ...T>
427using QDataStreamIfHasOStreamOperatorsContainer =
428 std::enable_if_t<std::conjunction_v<QTypeTraits::has_ostream_operator_container<QDataStream, Container, T>...>, QDataStream &>;
430template<
typename ...T>
431using QDataStreamIfHasIStreamOperators =
432 std::enable_if_t<std::conjunction_v<QTypeTraits::has_istream_operator<QDataStream, T>...>, QDataStream &>;
433template<
typename Container,
typename ...T>
434using QDataStreamIfHasIStreamOperatorsContainer =
435 std::enable_if_t<std::conjunction_v<QTypeTraits::has_istream_operator_container<QDataStream, Container, T>...>, QDataStream &>;
438
439
441inline QIODevice *QDataStream::device()
const
444#if QT_CORE_INLINE_IMPL_SINCE(6
, 8
)
445QDataStream::Status QDataStream::status()
const
447 return Status(q_status);
450QDataStream::FloatingPointPrecision QDataStream::floatingPointPrecision()
const
452 return FloatingPointPrecision(fpPrecision);
456inline QDataStream::ByteOrder QDataStream::byteOrder()
const
458 if constexpr (QSysInfo::ByteOrder == QSysInfo::BigEndian)
459 return noswap ? BigEndian : LittleEndian;
460 return noswap ? LittleEndian : BigEndian;
463inline int QDataStream::version()
const
466inline void QDataStream::setVersion(
int v)
469qint64 QDataStream::readQSizeType(QDataStream &s)
473 if (first == NullCode)
475 if (first < ExtendedSize || s.version() < QDataStream::Qt_6_7)
476 return qint64(first);
482bool QDataStream::writeQSizeType(QDataStream &s, qint64 value)
484 if (value < qint64(ExtendedSize)) {
486 }
else if (s.version() >= QDataStream::Qt_6_7) {
487 s << ExtendedSize << value;
488 }
else if (value == qint64(ExtendedSize)) {
491 s.setStatus(QDataStream::SizeLimitExceeded);
497inline QDataStream &QDataStream::operator>>(
char &i)
498{
return *
this >>
reinterpret_cast<qint8&>(i); }
500inline QDataStream &QDataStream::operator>>(quint8 &i)
501{
return *
this >>
reinterpret_cast<qint8&>(i); }
503inline QDataStream &QDataStream::operator>>(quint16 &i)
504{
return *
this >>
reinterpret_cast<qint16&>(i); }
506inline QDataStream &QDataStream::operator>>(quint32 &i)
507{
return *
this >>
reinterpret_cast<qint32&>(i); }
509inline QDataStream &QDataStream::operator>>(quint64 &i)
510{
return *
this >>
reinterpret_cast<qint64&>(i); }
512inline QDataStream &QDataStream::operator<<(
char i)
513{
return *
this << qint8(i); }
515inline QDataStream &QDataStream::operator<<(quint8 i)
516{
return *
this << qint8(i); }
518inline QDataStream &QDataStream::operator<<(quint16 i)
519{
return *
this << qint16(i); }
521inline QDataStream &QDataStream::operator<<(quint32 i)
522{
return *
this << qint32(i); }
524inline QDataStream &QDataStream::operator<<(quint64 i)
525{
return *
this << qint64(i); }
527template <
typename Enum>
528inline QDataStream &operator<<(QDataStream &s, QFlags<Enum> e)
529{
return s << e.toInt(); }
531template <
typename Enum>
532inline QDataStream &
operator>>(QDataStream &s, QFlags<Enum> &e)
534 typename QFlags<Enum>::Int i;
536 e = QFlags<Enum>::fromInt(i);
541typename std::enable_if_t<std::is_enum<T>::value, QDataStream &>
542operator<<(QDataStream &s,
const T &t)
546 return s <<
typename QIntegerForSizeof<T>::Unsigned(t);
553 typename QIntegerForSizeof<T>::Unsigned i;
559Q_CORE_EXPORT
QDataStream &operator<<(QDataStream &out, QChar chr);
560Q_CORE_EXPORT
QDataStream &operator>>(QDataStream &in, QChar &chr);
567 return QtPrivate::readArrayBasedContainer(s, v);
571inline QDataStreamIfHasOStreamOperatorsContainer<QList<T>, T> operator<<(QDataStream &s,
const QList<T> &v)
573 return QtPrivate::writeSequentialContainer(s, v);
579 return QtPrivate::readListBasedContainer(s, set);
583inline QDataStreamIfHasOStreamOperatorsContainer<QSet<T>, T> operator<<(QDataStream &s,
const QSet<T> &set)
585 return QtPrivate::writeSequentialContainer(s, set);
588template <
class Key,
class T>
591 return QtPrivate::readAssociativeContainer(s, hash);
594template <
class Key,
class T>
596inline QDataStreamIfHasOStreamOperatorsContainer<QHash<Key, T>, Key, T> operator<<(QDataStream &s,
const QHash<Key, T> &hash)
598 return QtPrivate::writeAssociativeContainer(s, hash);
601template <
class Key,
class T>
604 return QtPrivate::readAssociativeContainer(s, hash);
607template <
class Key,
class T>
608inline QDataStreamIfHasOStreamOperatorsContainer<QMultiHash<Key, T>, Key, T> operator<<(QDataStream &s,
const QMultiHash<Key, T> &hash)
610 return QtPrivate::writeAssociativeMultiContainer(s, hash);
613template <
class Key,
class T>
616 return QtPrivate::readAssociativeContainer(s, map);
619template <
class Key,
class T>
620inline QDataStreamIfHasOStreamOperatorsContainer<QMap<Key, T>, Key, T> operator<<(QDataStream &s,
const QMap<Key, T> &map)
622 return QtPrivate::writeAssociativeContainer(s, map);
625template <
class Key,
class T>
628 return QtPrivate::readAssociativeContainer(s, map);
631template <
class Key,
class T>
632inline QDataStreamIfHasOStreamOperatorsContainer<QMultiMap<Key, T>, Key, T> operator<<(QDataStream &s,
const QMultiMap<Key, T> &map)
634 return QtPrivate::writeAssociativeMultiContainer(s, map);
637template <
class T1,
class T2>
640 s >> p.first >> p.second;
644template <
class T1,
class T2>
645inline QDataStreamIfHasOStreamOperators<T1, T2> operator<<(QDataStream& s,
const std::pair<T1, T2> &p)
647 s << p.first << p.second;
654QDataStream &operator>>(QDataStream &s, QList<T> &l);
657QDataStream &operator<<(QDataStream &s,
const QList<T> &l);
660QDataStream &operator>>(QDataStream &s, QSet<T> &set);
663QDataStream &operator<<(QDataStream &s,
const QSet<T> &set);
665template <
class Key,
class T>
666QDataStream &operator>>(QDataStream &s, QHash<Key, T> &hash);
668template <
class Key,
class T>
669QDataStream &operator<<(QDataStream &s,
const QHash<Key, T> &hash);
671template <
class Key,
class T>
672QDataStream &operator>>(QDataStream &s, QMultiHash<Key, T> &hash);
674template <
class Key,
class T>
675QDataStream &operator<<(QDataStream &s,
const QMultiHash<Key, T> &hash);
677template <
class Key,
class T>
678QDataStream &operator>>(QDataStream &s, QMap<Key, T> &map);
680template <
class Key,
class T>
681QDataStream &operator<<(QDataStream &s,
const QMap<Key, T> &map);
683template <
class Key,
class T>
684QDataStream &operator>>(QDataStream &s, QMultiMap<Key, T> &map);
686template <
class Key,
class T>
687QDataStream &operator<<(QDataStream &s,
const QMultiMap<Key, T> &map);
689template <
class T1,
class T2>
690QDataStream &operator>>(QDataStream& s, std::pair<T1, T2> &p);
692template <
class T1,
class T2>
693QDataStream &operator<<(QDataStream& s,
const std::pair<T1, T2> &p);
697inline QDataStream &
operator>>(QDataStream &s, QKeyCombination &combination)
701 combination = QKeyCombination::fromCombined(combined);
705inline QDataStream &operator<<(QDataStream &s, QKeyCombination combination)
707 return s << combination.toCombined();
static bool readIniSection(const QSettingsKey §ion, QByteArrayView data, ParsedSettingsMap *settingsMap)
void set(const QString &key, const QVariant &value) override
QStringList children(const QString &prefix, ChildSpec spec) const override
~QConfFileSettingsPrivate()
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
UnparsedSettingsMap unparsedIniSections
ParsedSettingsMap originalKeys
static Q_AUTOTEST_EXPORT void clearCache()
ParsedSettingsMap removedKeys
ParsedSettingsMap mergedKeyMap() const
static QConfFile * fromName(const QString &name, bool _userPerms)
ParsedSettingsMap addedKeys
\inmodule QtCore\reentrant
QSettingsGroup(const QString &s, bool guessArraySize)
qsizetype arraySizeGuess() const
QSettingsGroup(const QString &s)
void setArrayIndex(qsizetype i)
QSettingsIniKey(const QString &str, qsizetype pos=-1)
QSettingsKey(const QString &key, Qt::CaseSensitivity cs, qsizetype=-1)
QString originalCaseKey() const
qsizetype originalKeyPosition() const
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
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
QHash< int, Path > PathHash
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
#define FLUSH_CURRENT_SECTION()
static void iniChopTrailingSpaces(QString &str, qsizetype limit)
Q_DECLARE_TYPEINFO(QSettingsGroup, Q_RELOCATABLE_TYPE)
static const Qt::CaseSensitivity IniCaseSensitivity
Q_DECLARE_TYPEINFO(QSettingsKey, Q_RELOCATABLE_TYPE)
QMap< QSettingsKey, QByteArray > UnparsedSettingsMap
QMap< QSettingsKey, QVariant > ParsedSettingsMap
#define QT_QSETTINGS_ALWAYS_CASE_SENSITIVE_AND_FORGET_ORIGINAL_KEY_ORDER