summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2017-03-09 13:54:56 +0100
committerThiago Macieira <thiago.macieira@intel.com>2017-04-07 17:41:06 +0000
commit795a54ff9688697c033fc5d522f4c50c707d5924 (patch)
tree20468045310d1cc5e65a1faeb2508c96f41eff33
parent25d1bbb84939b6960f16e82254fc844839ddfa54 (diff)
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 <marc.mutz@kdab.com> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
-rw-r--r--src/corelib/io/qdatastream.cpp20
-rw-r--r--src/corelib/io/qdatastream.h2
-rw-r--r--src/corelib/kernel/qmetatype.cpp2
-rw-r--r--tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp28
4 files changed, 52 insertions, 0 deletions
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
@@ -771,6 +771,17 @@ int QDataStream::readBlock(char *data, int len)
}
/*!
+ \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<const std::nullptr_t *>(data);
return true;
case QMetaType::Long:
stream << qlonglong(*static_cast<const long *>(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<std::nullptr_t *>(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())));