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) {
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
108 BigEndian = QSysInfo::BigEndian,
109 LittleEndian = QSysInfo::LittleEndian
112 enum Status QT7_ONLY(: quint8) {
120 enum FloatingPointPrecision QT7_ONLY(: quint8) {
126 explicit QDataStream(QIODevice *);
127 QDataStream(QByteArray *, OpenMode flags);
128 QDataStream(
const QByteArray &);
131 QIODevice *device()
const;
132 void setDevice(QIODevice *);
136 QT_CORE_INLINE_SINCE(6, 8)
137 Status status()
const;
138 void setStatus(Status status);
141 QT_CORE_INLINE_SINCE(6, 8)
142 FloatingPointPrecision floatingPointPrecision()
const;
143 void setFloatingPointPrecision(FloatingPointPrecision precision);
145 ByteOrder byteOrder()
const;
146 void setByteOrder(ByteOrder);
149 void setVersion(
int);
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; }
162 QDataStream &operator>>(
bool &i);
163#if QT_CORE_REMOVED_SINCE(6
, 3
)
164 QDataStream &operator>>(qfloat16 &f);
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);
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);
187 template <
typename T,
188 std::enable_if_t<std::is_same_v<T,
bool>,
bool> =
true>
189 QDataStream &operator<<(T i)
191 return (*
this << qint8(i));
194#if QT_CORE_REMOVED_SINCE(6
, 3
)
195 QDataStream &operator<<(qfloat16 f);
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);
203 explicit operator
bool()
const noexcept {
return status() == Ok; }
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);
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);
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);
221 void startTransaction();
222 bool commitTransaction();
223 void rollbackTransaction();
224 void abortTransaction();
226 bool isDeviceTransactionStarted()
const;
228 Q_DISABLE_COPY(QDataStream)
230#if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
)
231 void*
const d =
nullptr;
234 QIODevice *dev =
nullptr;
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;
243 Version ver = Qt_DefaultCompiledVersion;
245 quint16 transactionDepth = 0;
247#if QT_CORE_REMOVED_SINCE(6
, 7
)
248 int readBlock(
char *data,
int len);
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;
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,
298 QDataStream::Status oldStatus;
301template <
typename Container>
307 qint64 size = QDataStream::readQSizeType(s);
308 const auto n = qsizetype(size);
309 if (size != n || size < 0) {
310 s.setStatus(QDataStream::SizeLimitExceeded);
314 for (qsizetype i = 0; i < n; ++i) {
315 typename Container::value_type t;
326template <
typename Container>
332 qint64 size = QDataStream::readQSizeType(s);
333 const auto n = qsizetype(size);
334 if (size != n || size < 0) {
335 s.setStatus(QDataStream::SizeLimitExceeded);
338 for (qsizetype i = 0; i < n; ++i) {
339 typename Container::value_type t;
350template <
typename Container>
356 qint64 size = QDataStream::readQSizeType(s);
357 const auto n = qsizetype(size);
358 if (size != n || size < 0) {
359 s.setStatus(QDataStream::SizeLimitExceeded);
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)) {
375template <
typename Container>
378 if (!QDataStream::writeQSizeType(s, c.size()))
380 for (
const typename Container::value_type &t : c)
386template <
typename Container>
389 if (!QDataStream::writeQSizeType(s, c.size()))
391 auto it = c.constBegin();
392 auto end = c.constEnd();
394 s << it.key() << it.value();
401template <
typename Container>
404 if (!QDataStream::writeQSizeType(s, c.size()))
406 auto it = c.constBegin();
407 auto end = c.constEnd();
409 const auto rangeStart = it++;
410 while (it != end && rangeStart.key() == it.key())
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();
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 &>;
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 &>;
439
440
442inline QIODevice *QDataStream::device()
const
445#if QT_CORE_INLINE_IMPL_SINCE(6
, 8
)
446QDataStream::Status QDataStream::status()
const
448 return Status(q_status);
451QDataStream::FloatingPointPrecision QDataStream::floatingPointPrecision()
const
453 return FloatingPointPrecision(fpPrecision);
457inline QDataStream::ByteOrder QDataStream::byteOrder()
const
459 if constexpr (QSysInfo::ByteOrder == QSysInfo::BigEndian)
460 return noswap ? BigEndian : LittleEndian;
461 return noswap ? LittleEndian : BigEndian;
464inline int QDataStream::version()
const
467inline void QDataStream::setVersion(
int v)
470qint64 QDataStream::readQSizeType(QDataStream &s)
474 if (first == NullCode)
476 if (first < ExtendedSize || s.version() < QDataStream::Qt_6_7)
477 return qint64(first);
483bool QDataStream::writeQSizeType(QDataStream &s, qint64 value)
485 if (value < qint64(ExtendedSize)) {
487 }
else if (s.version() >= QDataStream::Qt_6_7) {
488 s << ExtendedSize << value;
489 }
else if (value == qint64(ExtendedSize)) {
492 s.setStatus(QDataStream::SizeLimitExceeded);
498inline QDataStream &QDataStream::operator>>(
char &i)
499{
return *
this >>
reinterpret_cast<qint8&>(i); }
501inline QDataStream &QDataStream::operator>>(quint8 &i)
502{
return *
this >>
reinterpret_cast<qint8&>(i); }
504inline QDataStream &QDataStream::operator>>(quint16 &i)
505{
return *
this >>
reinterpret_cast<qint16&>(i); }
507inline QDataStream &QDataStream::operator>>(quint32 &i)
508{
return *
this >>
reinterpret_cast<qint32&>(i); }
510inline QDataStream &QDataStream::operator>>(quint64 &i)
511{
return *
this >>
reinterpret_cast<qint64&>(i); }
513inline QDataStream &QDataStream::operator<<(
char i)
514{
return *
this << qint8(i); }
516inline QDataStream &QDataStream::operator<<(quint8 i)
517{
return *
this << qint8(i); }
519inline QDataStream &QDataStream::operator<<(quint16 i)
520{
return *
this << qint16(i); }
522inline QDataStream &QDataStream::operator<<(quint32 i)
523{
return *
this << qint32(i); }
525inline QDataStream &QDataStream::operator<<(quint64 i)
526{
return *
this << qint64(i); }
528template <
typename Enum>
529inline QDataStream &operator<<(QDataStream &s, QFlags<Enum> e)
530{
return s << e.toInt(); }
532template <
typename Enum>
533inline QDataStream &
operator>>(QDataStream &s, QFlags<Enum> &e)
535 typename QFlags<Enum>::Int i;
537 e = QFlags<Enum>::fromInt(i);
542typename std::enable_if_t<std::is_enum<T>::value, QDataStream &>
543operator<<(QDataStream &s,
const T &t)
547 return s <<
typename QIntegerForSizeof<T>::Unsigned(t);
554 typename QIntegerForSizeof<T>::Unsigned i;
560Q_CORE_EXPORT
QDataStream &operator<<(QDataStream &out, QChar chr);
561Q_CORE_EXPORT
QDataStream &operator>>(QDataStream &in, QChar &chr);
568 return QtPrivate::readArrayBasedContainer(s, v);
572inline QDataStreamIfHasOStreamOperatorsContainer<QList<T>, T> operator<<(QDataStream &s,
const QList<T> &v)
574 return QtPrivate::writeSequentialContainer(s, v);
580 return QtPrivate::readListBasedContainer(s, set);
584inline QDataStreamIfHasOStreamOperatorsContainer<QSet<T>, T> operator<<(QDataStream &s,
const QSet<T> &set)
586 return QtPrivate::writeSequentialContainer(s, set);
589template <
class Key,
class T>
592 return QtPrivate::readAssociativeContainer(s, hash);
595template <
class Key,
class T>
597inline QDataStreamIfHasOStreamOperatorsContainer<QHash<Key, T>, Key, T> operator<<(QDataStream &s,
const QHash<Key, T> &hash)
599 return QtPrivate::writeAssociativeContainer(s, hash);
602template <
class Key,
class T>
605 return QtPrivate::readAssociativeContainer(s, hash);
608template <
class Key,
class T>
609inline QDataStreamIfHasOStreamOperatorsContainer<QMultiHash<Key, T>, Key, T> operator<<(QDataStream &s,
const QMultiHash<Key, T> &hash)
611 return QtPrivate::writeAssociativeMultiContainer(s, hash);
614template <
class Key,
class T>
617 return QtPrivate::readAssociativeContainer(s, map);
620template <
class Key,
class T>
621inline QDataStreamIfHasOStreamOperatorsContainer<QMap<Key, T>, Key, T> operator<<(QDataStream &s,
const QMap<Key, T> &map)
623 return QtPrivate::writeAssociativeContainer(s, map);
626template <
class Key,
class T>
629 return QtPrivate::readAssociativeContainer(s, map);
632template <
class Key,
class T>
633inline QDataStreamIfHasOStreamOperatorsContainer<QMultiMap<Key, T>, Key, T> operator<<(QDataStream &s,
const QMultiMap<Key, T> &map)
635 return QtPrivate::writeAssociativeMultiContainer(s, map);
638template <
class T1,
class T2>
641 s >> p.first >> p.second;
645template <
class T1,
class T2>
646inline QDataStreamIfHasOStreamOperators<T1, T2> operator<<(QDataStream& s,
const std::pair<T1, T2> &p)
648 s << p.first << p.second;
655QDataStream &operator>>(QDataStream &s, QList<T> &l);
658QDataStream &operator<<(QDataStream &s,
const QList<T> &l);
661QDataStream &operator>>(QDataStream &s, QSet<T> &set);
664QDataStream &operator<<(QDataStream &s,
const QSet<T> &set);
666template <
class Key,
class T>
667QDataStream &operator>>(QDataStream &s, QHash<Key, T> &hash);
669template <
class Key,
class T>
670QDataStream &operator<<(QDataStream &s,
const QHash<Key, T> &hash);
672template <
class Key,
class T>
673QDataStream &operator>>(QDataStream &s, QMultiHash<Key, T> &hash);
675template <
class Key,
class T>
676QDataStream &operator<<(QDataStream &s,
const QMultiHash<Key, T> &hash);
678template <
class Key,
class T>
679QDataStream &operator>>(QDataStream &s, QMap<Key, T> &map);
681template <
class Key,
class T>
682QDataStream &operator<<(QDataStream &s,
const QMap<Key, T> &map);
684template <
class Key,
class T>
685QDataStream &operator>>(QDataStream &s, QMultiMap<Key, T> &map);
687template <
class Key,
class T>
688QDataStream &operator<<(QDataStream &s,
const QMultiMap<Key, T> &map);
690template <
class T1,
class T2>
691QDataStream &operator>>(QDataStream& s, std::pair<T1, T2> &p);
693template <
class T1,
class T2>
694QDataStream &operator<<(QDataStream& s,
const std::pair<T1, T2> &p);
698inline QDataStream &
operator>>(QDataStream &s, QKeyCombination &combination)
702 combination = QKeyCombination::fromCombined(combined);
706inline QDataStream &operator<<(QDataStream &s, QKeyCombination combination)
708 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