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>
18#error qdatastream.h must be included before any header file that defines Status
23#if QT_CORE_REMOVED_SINCE(6
, 3
)
31#if !defined(QT_NO_DATASTREAM)
35template <
typename Container>
37template <
typename Container>
39template <
typename Container>
41template <
typename Container>
43template <
typename Container>
45template <
typename Container>
51 enum Version QT7_ONLY(: quint8) {
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
102 BigEndian = QSysInfo::BigEndian,
103 LittleEndian = QSysInfo::LittleEndian
106 enum Status QT7_ONLY(: quint8) {
114 enum FloatingPointPrecision QT7_ONLY(: quint8) {
120 explicit QDataStream(QIODevice *);
121 QDataStream(QByteArray *, OpenMode flags);
122 QDataStream(
const QByteArray &);
125 QIODevice *device()
const;
126 void setDevice(QIODevice *);
130 QT_CORE_INLINE_SINCE(6, 8)
131 Status status()
const;
132 void setStatus(Status status);
135 QT_CORE_INLINE_SINCE(6, 8)
136 FloatingPointPrecision floatingPointPrecision()
const;
137 void setFloatingPointPrecision(FloatingPointPrecision precision);
139 ByteOrder byteOrder()
const;
140 void setByteOrder(ByteOrder);
143 void setVersion(
int);
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; }
156 QDataStream &operator>>(
bool &i);
157#if QT_CORE_REMOVED_SINCE(6
, 3
)
158 QDataStream &operator>>(qfloat16 &f);
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);
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);
181 template <
typename T,
182 std::enable_if_t<std::is_same_v<T,
bool>,
bool> =
true>
183 QDataStream &operator<<(T i)
185 return (*
this << qint8(i));
188#if QT_CORE_REMOVED_SINCE(6
, 3
)
189 QDataStream &operator<<(qfloat16 f);
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);
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);
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);
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);
213 void startTransaction();
214 bool commitTransaction();
215 void rollbackTransaction();
216 void abortTransaction();
218 bool isDeviceTransactionStarted()
const;
220 Q_DISABLE_COPY(QDataStream)
222 std::unique_ptr<QDataStreamPrivate> d;
224 QIODevice *dev =
nullptr;
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;
233 Version ver = Qt_DefaultCompiledVersion;
235 quint16 transactionDepth = 0;
237#if QT_CORE_REMOVED_SINCE(6
, 7
)
238 int readBlock(
char *data,
int len);
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;
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,
287 QDataStream::Status oldStatus;
290template <
typename Container>
296 qint64 size = QDataStream::readQSizeType(s);
298 if (size != n || size < 0) {
299 s.setStatus(QDataStream::SizeLimitExceeded);
303 for (qsizetype i = 0; i < n; ++i) {
304 typename Container::value_type t;
306 if (s.status() != QDataStream::Ok) {
316template <
typename Container>
322 qint64 size = QDataStream::readQSizeType(s);
324 if (size != n || size < 0) {
325 s.setStatus(QDataStream::SizeLimitExceeded);
328 for (qsizetype i = 0; i < n; ++i) {
329 typename Container::value_type t;
331 if (s.status() != QDataStream::Ok) {
341template <
typename Container>
347 qint64 size = QDataStream::readQSizeType(s);
349 if (size != n || size < 0) {
350 s.setStatus(QDataStream::SizeLimitExceeded);
353 for (qsizetype i = 0; i < n; ++i) {
354 typename Container::key_type k;
355 typename Container::mapped_type t;
357 if (s.status() != QDataStream::Ok) {
367template <
typename Container>
370 if (!QDataStream::writeQSizeType(s, c.size()))
372 for (
const typename Container::value_type &t : c)
378template <
typename Container>
381 if (!QDataStream::writeQSizeType(s, c.size()))
383 auto it = c.constBegin();
384 auto end = c.constEnd();
386 s << it.key() << it.value();
393template <
typename Container>
396 if (!QDataStream::writeQSizeType(s, c.size()))
398 auto it = c.constBegin();
399 auto end = c.constEnd();
401 const auto rangeStart = it++;
402 while (it != end && rangeStart.key() == it.key())
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();
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 &>;
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 &>;
431
432
434inline QIODevice *QDataStream::device()
const
437#if QT_CORE_INLINE_IMPL_SINCE(6
, 8
)
438QDataStream::Status QDataStream::status()
const
440 return Status(q_status);
443QDataStream::FloatingPointPrecision QDataStream::floatingPointPrecision()
const
445 return FloatingPointPrecision(fpPrecision);
449inline QDataStream::ByteOrder QDataStream::byteOrder()
const
451 if constexpr (QSysInfo::ByteOrder == QSysInfo::BigEndian)
452 return noswap ? BigEndian : LittleEndian;
453 return noswap ? LittleEndian : BigEndian;
456inline int QDataStream::version()
const
459inline void QDataStream::setVersion(
int v)
462qint64 QDataStream::readQSizeType(QDataStream &s)
466 if (first == NullCode)
468 if (first < ExtendedSize || s.version() < QDataStream::Qt_6_7)
469 return qint64(first);
475bool QDataStream::writeQSizeType(QDataStream &s, qint64 value)
477 if (value < qint64(ExtendedSize)) {
479 }
else if (s.version() >= QDataStream::Qt_6_7) {
480 s << ExtendedSize << value;
481 }
else if (value == qint64(ExtendedSize)) {
484 s.setStatus(QDataStream::SizeLimitExceeded);
490inline QDataStream &QDataStream::operator>>(
char &i)
491{
return *
this >>
reinterpret_cast<qint8&>(i); }
493inline QDataStream &QDataStream::operator>>(quint8 &i)
494{
return *
this >>
reinterpret_cast<qint8&>(i); }
496inline QDataStream &QDataStream::operator>>(quint16 &i)
497{
return *
this >>
reinterpret_cast<qint16&>(i); }
499inline QDataStream &QDataStream::operator>>(quint32 &i)
500{
return *
this >>
reinterpret_cast<qint32&>(i); }
502inline QDataStream &QDataStream::operator>>(quint64 &i)
503{
return *
this >>
reinterpret_cast<qint64&>(i); }
505inline QDataStream &QDataStream::operator<<(
char i)
506{
return *
this << qint8(i); }
508inline QDataStream &QDataStream::operator<<(quint8 i)
509{
return *
this << qint8(i); }
511inline QDataStream &QDataStream::operator<<(quint16 i)
512{
return *
this << qint16(i); }
514inline QDataStream &QDataStream::operator<<(quint32 i)
515{
return *
this << qint32(i); }
517inline QDataStream &QDataStream::operator<<(quint64 i)
518{
return *
this << qint64(i); }
520template <
typename Enum>
521inline QDataStream &operator<<(QDataStream &s, QFlags<Enum> e)
522{
return s << e.toInt(); }
524template <
typename Enum>
525inline QDataStream &
operator>>(QDataStream &s, QFlags<Enum> &e)
527 typename QFlags<Enum>::Int i;
529 e = QFlags<Enum>::fromInt(i);
534typename std::enable_if_t<std::is_enum<T>::value, QDataStream &>
535operator<<(QDataStream &s,
const T &t)
539 return s <<
typename QIntegerForSizeof<T>::Unsigned(t);
546 typename QIntegerForSizeof<T>::Unsigned i;
552Q_CORE_EXPORT
QDataStream &operator<<(QDataStream &out, QChar chr);
553Q_CORE_EXPORT
QDataStream &operator>>(QDataStream &in, QChar &chr);
560 return QtPrivate::readArrayBasedContainer(s, v);
564inline QDataStreamIfHasOStreamOperatorsContainer<QList<T>, T> operator<<(QDataStream &s,
const QList<T> &v)
566 return QtPrivate::writeSequentialContainer(s, v);
572 return QtPrivate::readListBasedContainer(s, set);
576inline QDataStreamIfHasOStreamOperatorsContainer<QSet<T>, T> operator<<(QDataStream &s,
const QSet<T> &set)
578 return QtPrivate::writeSequentialContainer(s, set);
581template <
class Key,
class T>
584 return QtPrivate::readAssociativeContainer(s, hash);
587template <
class Key,
class T>
589inline QDataStreamIfHasOStreamOperatorsContainer<QHash<Key, T>, Key, T> operator<<(QDataStream &s,
const QHash<Key, T> &hash)
591 return QtPrivate::writeAssociativeContainer(s, hash);
594template <
class Key,
class T>
597 return QtPrivate::readAssociativeContainer(s, hash);
600template <
class Key,
class T>
601inline QDataStreamIfHasOStreamOperatorsContainer<QMultiHash<Key, T>, Key, T> operator<<(QDataStream &s,
const QMultiHash<Key, T> &hash)
603 return QtPrivate::writeAssociativeMultiContainer(s, hash);
606template <
class Key,
class T>
609 return QtPrivate::readAssociativeContainer(s, map);
612template <
class Key,
class T>
613inline QDataStreamIfHasOStreamOperatorsContainer<QMap<Key, T>, Key, T> operator<<(QDataStream &s,
const QMap<Key, T> &map)
615 return QtPrivate::writeAssociativeContainer(s, map);
618template <
class Key,
class T>
621 return QtPrivate::readAssociativeContainer(s, map);
624template <
class Key,
class T>
625inline QDataStreamIfHasOStreamOperatorsContainer<QMultiMap<Key, T>, Key, T> operator<<(QDataStream &s,
const QMultiMap<Key, T> &map)
627 return QtPrivate::writeAssociativeMultiContainer(s, map);
630template <
class T1,
class T2>
633 s >> p.first >> p.second;
637template <
class T1,
class T2>
638inline QDataStreamIfHasOStreamOperators<T1, T2> operator<<(QDataStream& s,
const std::pair<T1, T2> &p)
640 s << p.first << p.second;
647QDataStream &operator>>(QDataStream &s, QList<T> &l);
650QDataStream &operator<<(QDataStream &s,
const QList<T> &l);
653QDataStream &operator>>(QDataStream &s, QSet<T> &set);
656QDataStream &operator<<(QDataStream &s,
const QSet<T> &set);
658template <
class Key,
class T>
659QDataStream &operator>>(QDataStream &s, QHash<Key, T> &hash);
661template <
class Key,
class T>
662QDataStream &operator<<(QDataStream &s,
const QHash<Key, T> &hash);
664template <
class Key,
class T>
665QDataStream &operator>>(QDataStream &s, QMultiHash<Key, T> &hash);
667template <
class Key,
class T>
668QDataStream &operator<<(QDataStream &s,
const QMultiHash<Key, T> &hash);
670template <
class Key,
class T>
671QDataStream &operator>>(QDataStream &s, QMap<Key, T> &map);
673template <
class Key,
class T>
674QDataStream &operator<<(QDataStream &s,
const QMap<Key, T> &map);
676template <
class Key,
class T>
677QDataStream &operator>>(QDataStream &s, QMultiMap<Key, T> &map);
679template <
class Key,
class T>
680QDataStream &operator<<(QDataStream &s,
const QMultiMap<Key, T> &map);
682template <
class T1,
class T2>
683QDataStream &operator>>(QDataStream& s, std::pair<T1, T2> &p);
685template <
class T1,
class T2>
686QDataStream &operator<<(QDataStream& s,
const std::pair<T1, T2> &p);
690inline QDataStream &
operator>>(QDataStream &s, QKeyCombination &combination)
694 combination = QKeyCombination::fromCombined(combined);
698inline QDataStream &operator<<(QDataStream &s, QKeyCombination combination)
700 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
QSettings settings("MySoft", "Star Runner")
[0]