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) {
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
109 BigEndian = QSysInfo::BigEndian,
110 LittleEndian = QSysInfo::LittleEndian
113 enum Status QT7_ONLY(: quint8) {
121 enum FloatingPointPrecision QT7_ONLY(: quint8) {
127 explicit QDataStream(QIODevice *);
128 QDataStream(QByteArray *, OpenMode flags);
129 QDataStream(
const QByteArray &);
132 QIODevice *device()
const;
133 void setDevice(QIODevice *);
137 QT_CORE_INLINE_SINCE(6, 8)
138 Status status()
const;
139 void setStatus(Status status);
142 QT_CORE_INLINE_SINCE(6, 8)
143 FloatingPointPrecision floatingPointPrecision()
const;
144 void setFloatingPointPrecision(FloatingPointPrecision precision);
146 ByteOrder byteOrder()
const;
147 void setByteOrder(ByteOrder);
150 void setVersion(
int);
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; }
163 QDataStream &operator>>(
bool &i);
164#if QT_CORE_REMOVED_SINCE(6
, 3
)
165 QDataStream &operator>>(qfloat16 &f);
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);
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);
188 template <
typename T,
189 std::enable_if_t<std::is_same_v<T,
bool>,
bool> =
true>
190 QDataStream &operator<<(T i)
192 return (*
this << qint8(i));
195#if QT_CORE_REMOVED_SINCE(6
, 3
)
196 QDataStream &operator<<(qfloat16 f);
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);
204 explicit operator
bool()
const noexcept {
return status() == Ok; }
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);
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);
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);
222 void startTransaction();
223 bool commitTransaction();
224 void rollbackTransaction();
225 void abortTransaction();
227 bool isDeviceTransactionStarted()
const;
229 Q_DISABLE_COPY(QDataStream)
231#if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
)
232 void*
const d =
nullptr;
235 QIODevice *dev =
nullptr;
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;
244 Version ver = Qt_DefaultCompiledVersion;
246 quint16 transactionDepth = 0;
248#if QT_CORE_REMOVED_SINCE(6
, 7
)
249 int readBlock(
char *data,
int len);
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;
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,
299 QDataStream::Status oldStatus;
302template <
typename Container>
308 qint64 size = QDataStream::readQSizeType(s);
309 const auto n = qsizetype(size);
310 if (size != n || size < 0) {
311 s.setStatus(QDataStream::SizeLimitExceeded);
315 for (qsizetype i = 0; i < n; ++i) {
316 typename Container::value_type t;
327template <
typename Container>
333 qint64 size = QDataStream::readQSizeType(s);
334 const auto n = qsizetype(size);
335 if (size != n || size < 0) {
336 s.setStatus(QDataStream::SizeLimitExceeded);
339 for (qsizetype i = 0; i < n; ++i) {
340 typename Container::value_type t;
351template <
typename Container>
357 qint64 size = QDataStream::readQSizeType(s);
358 const auto n = qsizetype(size);
359 if (size != n || size < 0) {
360 s.setStatus(QDataStream::SizeLimitExceeded);
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)) {
376template <
typename Container>
379 if (!QDataStream::writeQSizeType(s, c.size()))
381 for (
const typename Container::value_type &t : c)
387template <
typename Container>
390 if (!QDataStream::writeQSizeType(s, c.size()))
392 auto it = c.constBegin();
393 auto end = c.constEnd();
395 s << it.key() << it.value();
402template <
typename Container>
405 if (!QDataStream::writeQSizeType(s, c.size()))
407 auto it = c.constBegin();
408 auto end = c.constEnd();
410 const auto rangeStart = it++;
411 while (it != end && rangeStart.key() == it.key())
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();
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 &>;
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 &>;
440
441
443inline QIODevice *QDataStream::device()
const
446#if QT_CORE_INLINE_IMPL_SINCE(6
, 8
)
447QDataStream::Status QDataStream::status()
const
449 return Status(q_status);
452QDataStream::FloatingPointPrecision QDataStream::floatingPointPrecision()
const
454 return FloatingPointPrecision(fpPrecision);
458inline QDataStream::ByteOrder QDataStream::byteOrder()
const
460 if constexpr (QSysInfo::ByteOrder == QSysInfo::BigEndian)
461 return noswap ? BigEndian : LittleEndian;
462 return noswap ? LittleEndian : BigEndian;
465inline int QDataStream::version()
const
468inline void QDataStream::setVersion(
int v)
471qint64 QDataStream::readQSizeType(QDataStream &s)
475 if (first == NullCode)
477 if (first < ExtendedSize || s.version() < QDataStream::Qt_6_7)
478 return qint64(first);
484bool QDataStream::writeQSizeType(QDataStream &s, qint64 value)
486 if (value < qint64(ExtendedSize)) {
488 }
else if (s.version() >= QDataStream::Qt_6_7) {
489 s << ExtendedSize << value;
490 }
else if (value == qint64(ExtendedSize)) {
493 s.setStatus(QDataStream::SizeLimitExceeded);
499inline QDataStream &QDataStream::operator>>(
char &i)
500{
return *
this >>
reinterpret_cast<qint8&>(i); }
502inline QDataStream &QDataStream::operator>>(quint8 &i)
503{
return *
this >>
reinterpret_cast<qint8&>(i); }
505inline QDataStream &QDataStream::operator>>(quint16 &i)
506{
return *
this >>
reinterpret_cast<qint16&>(i); }
508inline QDataStream &QDataStream::operator>>(quint32 &i)
509{
return *
this >>
reinterpret_cast<qint32&>(i); }
511inline QDataStream &QDataStream::operator>>(quint64 &i)
512{
return *
this >>
reinterpret_cast<qint64&>(i); }
514inline QDataStream &QDataStream::operator<<(
char i)
515{
return *
this << qint8(i); }
517inline QDataStream &QDataStream::operator<<(quint8 i)
518{
return *
this << qint8(i); }
520inline QDataStream &QDataStream::operator<<(quint16 i)
521{
return *
this << qint16(i); }
523inline QDataStream &QDataStream::operator<<(quint32 i)
524{
return *
this << qint32(i); }
526inline QDataStream &QDataStream::operator<<(quint64 i)
527{
return *
this << qint64(i); }
529template <
typename Enum>
530inline QDataStream &operator<<(QDataStream &s, QFlags<Enum> e)
531{
return s << e.toInt(); }
533template <
typename Enum>
534inline QDataStream &
operator>>(QDataStream &s, QFlags<Enum> &e)
536 typename QFlags<Enum>::Int i;
538 e = QFlags<Enum>::fromInt(i);
543typename std::enable_if_t<std::is_enum<T>::value, QDataStream &>
544operator<<(QDataStream &s,
const T &t)
548 return s <<
typename QIntegerForSizeof<T>::Unsigned(t);
555 typename QIntegerForSizeof<T>::Unsigned i;
561Q_CORE_EXPORT
QDataStream &operator<<(QDataStream &out, QChar chr);
562Q_CORE_EXPORT
QDataStream &operator>>(QDataStream &in, QChar &chr);
569 return QtPrivate::readArrayBasedContainer(s, v);
573inline QDataStreamIfHasOStreamOperatorsContainer<QList<T>, T> operator<<(QDataStream &s,
const QList<T> &v)
575 return QtPrivate::writeSequentialContainer(s, v);
581 return QtPrivate::readListBasedContainer(s, set);
585inline QDataStreamIfHasOStreamOperatorsContainer<QSet<T>, T> operator<<(QDataStream &s,
const QSet<T> &set)
587 return QtPrivate::writeSequentialContainer(s, set);
590template <
class Key,
class T>
593 return QtPrivate::readAssociativeContainer(s, hash);
596template <
class Key,
class T>
598inline QDataStreamIfHasOStreamOperatorsContainer<QHash<Key, T>, Key, T> operator<<(QDataStream &s,
const QHash<Key, T> &hash)
600 return QtPrivate::writeAssociativeContainer(s, hash);
603template <
class Key,
class T>
606 return QtPrivate::readAssociativeContainer(s, hash);
609template <
class Key,
class T>
610inline QDataStreamIfHasOStreamOperatorsContainer<QMultiHash<Key, T>, Key, T> operator<<(QDataStream &s,
const QMultiHash<Key, T> &hash)
612 return QtPrivate::writeAssociativeMultiContainer(s, hash);
615template <
class Key,
class T>
618 return QtPrivate::readAssociativeContainer(s, map);
621template <
class Key,
class T>
622inline QDataStreamIfHasOStreamOperatorsContainer<QMap<Key, T>, Key, T> operator<<(QDataStream &s,
const QMap<Key, T> &map)
624 return QtPrivate::writeAssociativeContainer(s, map);
627template <
class Key,
class T>
630 return QtPrivate::readAssociativeContainer(s, map);
633template <
class Key,
class T>
634inline QDataStreamIfHasOStreamOperatorsContainer<QMultiMap<Key, T>, Key, T> operator<<(QDataStream &s,
const QMultiMap<Key, T> &map)
636 return QtPrivate::writeAssociativeMultiContainer(s, map);
639template <
class T1,
class T2>
642 s >> p.first >> p.second;
646template <
class T1,
class T2>
647inline QDataStreamIfHasOStreamOperators<T1, T2> operator<<(QDataStream& s,
const std::pair<T1, T2> &p)
649 s << p.first << p.second;
656QDataStream &operator>>(QDataStream &s, QList<T> &l);
659QDataStream &operator<<(QDataStream &s,
const QList<T> &l);
662QDataStream &operator>>(QDataStream &s, QSet<T> &set);
665QDataStream &operator<<(QDataStream &s,
const QSet<T> &set);
667template <
class Key,
class T>
668QDataStream &operator>>(QDataStream &s, QHash<Key, T> &hash);
670template <
class Key,
class T>
671QDataStream &operator<<(QDataStream &s,
const QHash<Key, T> &hash);
673template <
class Key,
class T>
674QDataStream &operator>>(QDataStream &s, QMultiHash<Key, T> &hash);
676template <
class Key,
class T>
677QDataStream &operator<<(QDataStream &s,
const QMultiHash<Key, T> &hash);
679template <
class Key,
class T>
680QDataStream &operator>>(QDataStream &s, QMap<Key, T> &map);
682template <
class Key,
class T>
683QDataStream &operator<<(QDataStream &s,
const QMap<Key, T> &map);
685template <
class Key,
class T>
686QDataStream &operator>>(QDataStream &s, QMultiMap<Key, T> &map);
688template <
class Key,
class T>
689QDataStream &operator<<(QDataStream &s,
const QMultiMap<Key, T> &map);
691template <
class T1,
class T2>
692QDataStream &operator>>(QDataStream& s, std::pair<T1, T2> &p);
694template <
class T1,
class T2>
695QDataStream &operator<<(QDataStream& s,
const std::pair<T1, T2> &p);
699inline QDataStream &
operator>>(QDataStream &s, QKeyCombination &combination)
703 combination = QKeyCombination::fromCombined(combined);
707inline QDataStream &operator<<(QDataStream &s, QKeyCombination combination)
709 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
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
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