From 795a54ff9688697c033fc5d522f4c50c707d5924 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Thu, 9 Mar 2017 13:54:56 +0100 Subject: QDataStream: add operator<< and >> for std::nullptr_t std::nullptr_t is nullary: it accepts only one value, nullptr. So we don't need to read or write anything. This commit simply adds the two operators that allow generic code to operate on std::nullptr_t if required. This commit also adds the actual use to QMetaType::load/save, even though there's no change in behavior. [ChangeLog][QtCore][QDataStream] Added operator<< and operator>> overloads that take std::nullptr_t, to facilitate generic code. Change-Id: Iae839f6a131a4f0784bffffd14aa37e7f62d2740 Reviewed-by: Marc Mutz Reviewed-by: Lars Knoll --- src/corelib/io/qdatastream.cpp | 20 ++++++++++++++++ src/corelib/io/qdatastream.h | 2 ++ src/corelib/kernel/qmetatype.cpp | 2 ++ .../corelib/io/qdatastream/tst_qdatastream.cpp | 28 ++++++++++++++++++++++ 4 files changed, 52 insertions(+) diff --git a/src/corelib/io/qdatastream.cpp b/src/corelib/io/qdatastream.cpp index 2369fe4726..9a42fb4a37 100644 --- a/src/corelib/io/qdatastream.cpp +++ b/src/corelib/io/qdatastream.cpp @@ -770,6 +770,17 @@ int QDataStream::readBlock(char *data, int len) return readResult; } +/*! + \fn QDataStream &QDataStream::operator>>(std::nullptr &ptr) + \since 5.9 + \overload + + Simulates reading a \c{std::nullptr_t} from the stream into \a ptr and + returns a reference to the stream. This function does not actually read + anything from the stream, as \c{std::nullptr_t} values are stored as 0 + bytes. +*/ + /*! \fn QDataStream &QDataStream::operator>>(quint8 &i) \overload @@ -1084,6 +1095,15 @@ int QDataStream::readRawData(char *s, int len) QDataStream write functions *****************************************************************************/ +/*! + \fn QDataStream &QDataStream::operator<<(std::nullptr ptr) + \since 5.9 + \overload + + Simulates writing a \c{std::nullptr_t}, \a ptr, to the stream and returns a + reference to the stream. This function does not actually write anything to + the stream, as \c{std::nullptr_t} values are stored as 0 bytes. +*/ /*! \fn QDataStream &QDataStream::operator<<(quint8 i) diff --git a/src/corelib/io/qdatastream.h b/src/corelib/io/qdatastream.h index db1bbfbd63..575607e147 100644 --- a/src/corelib/io/qdatastream.h +++ b/src/corelib/io/qdatastream.h @@ -152,6 +152,7 @@ public: QDataStream &operator>>(quint32 &i); QDataStream &operator>>(qint64 &i); QDataStream &operator>>(quint64 &i); + QDataStream &operator>>(std::nullptr_t &ptr) { ptr = nullptr; return *this; } QDataStream &operator>>(bool &i); QDataStream &operator>>(qfloat16 &f); @@ -167,6 +168,7 @@ public: QDataStream &operator<<(quint32 i); QDataStream &operator<<(qint64 i); QDataStream &operator<<(quint64 i); + QDataStream &operator<<(std::nullptr_t) { return *this; } QDataStream &operator<<(bool i); QDataStream &operator<<(qfloat16 f); QDataStream &operator<<(float f); diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp index fc8d7dcfea..b75f2ad9dc 100644 --- a/src/corelib/kernel/qmetatype.cpp +++ b/src/corelib/kernel/qmetatype.cpp @@ -1350,6 +1350,7 @@ bool QMetaType::save(QDataStream &stream, int type, const void *data) case QMetaType::QJsonDocument: return false; case QMetaType::Nullptr: + stream << *static_cast(data); return true; case QMetaType::Long: stream << qlonglong(*static_cast(data)); @@ -1573,6 +1574,7 @@ bool QMetaType::load(QDataStream &stream, int type, void *data) case QMetaType::QJsonDocument: return false; case QMetaType::Nullptr: + stream >> *static_cast(data); return true; case QMetaType::Long: { qlonglong l; diff --git a/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp b/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp index 5b03b35780..0068411b94 100644 --- a/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp +++ b/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp @@ -77,6 +77,9 @@ private slots: void stream_QDateTime_data(); void stream_QDateTime(); + void stream_nullptr_t_data(); + void stream_nullptr_t(); + void stream_QFont_data(); void stream_QFont(); @@ -187,6 +190,7 @@ private: void writeQBrush(QDataStream *s); void writeQColor(QDataStream *s); void writeQByteArray(QDataStream *s); + void writenullptr_t(QDataStream *s); #ifndef QT_NO_CURSOR void writeQCursor(QDataStream *s); #endif @@ -216,6 +220,7 @@ private: void readQBrush(QDataStream *s); void readQColor(QDataStream *s); void readQByteArray(QDataStream *s); + void readnullptr_t(QDataStream *s); #ifndef QT_NO_CURSOR void readQCursor(QDataStream *s); #endif @@ -1008,6 +1013,11 @@ void tst_QDataStream::writeQByteArray(QDataStream *s) *s << d4; } +void tst_QDataStream::writenullptr_t(QDataStream *s) +{ + *s << nullptr; +} + void tst_QDataStream::readQByteArray(QDataStream *s) { QByteArray test(qByteArrayData(dataIndex(QTest::currentDataTag()))); @@ -1016,6 +1026,13 @@ void tst_QDataStream::readQByteArray(QDataStream *s) QCOMPARE(d4, test); } +void tst_QDataStream::readnullptr_t(QDataStream *s) +{ + std::nullptr_t ptr; + *s >> ptr; + QCOMPARE(ptr, nullptr); +} + // ************************************ #ifndef QT_NO_CURSOR static QCursor qCursorData(int index) @@ -1263,6 +1280,17 @@ void tst_QDataStream::stream_QDateTime() STREAM_IMPL(QDateTime); } +void tst_QDataStream::stream_nullptr_t_data() +{ + stream_data(1); // there's only one value possible +} + +void tst_QDataStream::stream_nullptr_t() +{ + using namespace std; + STREAM_IMPL(nullptr_t); +} + void tst_QDataStream::writeQDateTime(QDataStream *s) { QDateTime dt(qDateTimeData(dataIndex(QTest::currentDataTag()))); -- cgit v1.2.3