From 9fc84d6358abe2942cf8808faba84a56feda0588 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 13 Jun 2014 12:00:42 -0700 Subject: [PATCH] Generics up and running. --- libraries/metavoxels/src/Bitstream.cpp | 33 ++++++++++++++++++------- libraries/metavoxels/src/Bitstream.h | 6 ++++- libraries/metavoxels/src/SharedObject.h | 2 ++ tests/metavoxels/src/MetavoxelTests.cpp | 29 ++++++++++++++++++++++ 4 files changed, 60 insertions(+), 10 deletions(-) diff --git a/libraries/metavoxels/src/Bitstream.cpp b/libraries/metavoxels/src/Bitstream.cpp index 760b1fc646..80aa07b026 100644 --- a/libraries/metavoxels/src/Bitstream.cpp +++ b/libraries/metavoxels/src/Bitstream.cpp @@ -760,8 +760,7 @@ Bitstream& Bitstream::operator<<(const QVariant& value) { } const TypeStreamer* streamer = getTypeStreamers().value(value.userType()); if (streamer) { - _typeStreamerStreamer << streamer->getStreamerToWrite(value); - streamer->write(*this, value); + streamer->writeVariant(*this, value); } else { qWarning() << "Non-streamable type: " << value.typeName() << "\n"; } @@ -774,7 +773,7 @@ Bitstream& Bitstream::operator>>(QVariant& value) { if (!streamer) { value = QVariant(); } else { - value = streamer->read(*this); + value = streamer->readVariant(*this); } return *this; } @@ -1889,6 +1888,15 @@ QVariant TypeStreamer::read(Bitstream& in) const { return QVariant(); } +void TypeStreamer::writeVariant(Bitstream& out, const QVariant& value) const { + out << this; + write(out, value); +} + +QVariant TypeStreamer::readVariant(Bitstream& in) const { + return read(in); +} + void TypeStreamer::writeDelta(Bitstream& out, const QVariant& value, const QVariant& reference) const { if (value == reference) { out << false; @@ -2151,6 +2159,10 @@ const char* GenericTypeStreamer::getName() const { return _name.constData(); } +QVariant GenericTypeStreamer::readVariant(Bitstream& in) const { + return QVariant::fromValue(GenericValue(_weakSelf, read(in))); +} + GenericEnumTypeStreamer::GenericEnumTypeStreamer(const QByteArray& name, const QVector& values, int bits, const QByteArray& hash) : GenericTypeStreamer(name), @@ -2190,7 +2202,7 @@ void GenericEnumTypeStreamer::write(Bitstream& out, const QVariant& value) const QVariant GenericEnumTypeStreamer::read(Bitstream& in) const { int intValue = 0; in.read(&intValue, _bits); - return QVariant::fromValue(GenericValue(_weakSelf, intValue)); + return intValue; } TypeStreamer::Category GenericEnumTypeStreamer::getCategory() const { @@ -2270,7 +2282,7 @@ QVariant GenericStreamableTypeStreamer::read(Bitstream& in) const { foreach (const StreamerNamePair& field, _fields) { values.append(field.first->read(in)); } - return QVariant::fromValue(GenericValue(_weakSelf, values)); + return values; } TypeStreamer::Category GenericStreamableTypeStreamer::getCategory() const { @@ -2337,7 +2349,7 @@ QVariant GenericListTypeStreamer::read(Bitstream& in) const { for (int i = 0; i < size; i++) { values.append(_valueStreamer->read(in)); } - return QVariant::fromValue(GenericValue(_weakSelf, values)); + return values; } TypeStreamer::Category GenericListTypeStreamer::getCategory() const { @@ -2443,13 +2455,16 @@ QVariant GenericMapTypeStreamer::read(Bitstream& in) const { QVariant value = _valueStreamer->read(in); values.append(QVariantPair(key, value)); } - return QVariant::fromValue(GenericValue(_weakSelf, QVariant::fromValue(values))); + return QVariant::fromValue(values); } TypeStreamer::Category GenericMapTypeStreamer::getCategory() const { return MAP_CATEGORY; } -const TypeStreamer* GenericValueStreamer::getStreamerToWrite(const QVariant& value) const { - return value.value().getStreamer().data(); +void GenericValueStreamer::writeVariant(Bitstream& out, const QVariant& value) const { + GenericValue genericValue = value.value(); + out << genericValue.getStreamer().data(); + genericValue.getStreamer()->write(out, genericValue.getValue()); } + diff --git a/libraries/metavoxels/src/Bitstream.h b/libraries/metavoxels/src/Bitstream.h index 10c28b9821..1589473b0e 100644 --- a/libraries/metavoxels/src/Bitstream.h +++ b/libraries/metavoxels/src/Bitstream.h @@ -918,6 +918,9 @@ public: virtual void write(Bitstream& out, const QVariant& value) const; virtual QVariant read(Bitstream& in) const; + virtual void writeVariant(Bitstream& out, const QVariant& value) const; + virtual QVariant readVariant(Bitstream& in) const; + virtual void writeDelta(Bitstream& out, const QVariant& value, const QVariant& reference) const; virtual void readDelta(Bitstream& in, QVariant& value, const QVariant& reference) const; @@ -1031,6 +1034,7 @@ public: GenericTypeStreamer(const QByteArray& name); virtual const char* getName() const; + virtual QVariant readVariant(Bitstream& in) const; protected: @@ -1260,7 +1264,7 @@ private: class GenericValueStreamer : public SimpleTypeStreamer { public: - virtual const TypeStreamer* getStreamerToWrite(const QVariant& value) const; + virtual void writeVariant(Bitstream& out, const QVariant& value) const; }; /// Macro for registering simple type streamers. diff --git a/libraries/metavoxels/src/SharedObject.h b/libraries/metavoxels/src/SharedObject.h index 41c3c01ffe..15cd5eb0a1 100644 --- a/libraries/metavoxels/src/SharedObject.h +++ b/libraries/metavoxels/src/SharedObject.h @@ -41,6 +41,8 @@ public: /// Returns the unique local ID for this object. int getID() const { return _id; } + void setID(int id) { _weakHash.insert(_id = id, this); } + /// Returns the local origin ID for this object. int getOriginID() const { return _originID; } diff --git a/tests/metavoxels/src/MetavoxelTests.cpp b/tests/metavoxels/src/MetavoxelTests.cpp index 6ec2331b14..6bd99a6c82 100644 --- a/tests/metavoxels/src/MetavoxelTests.cpp +++ b/tests/metavoxels/src/MetavoxelTests.cpp @@ -214,6 +214,35 @@ static bool testSerialization(Bitstream::MetadataType metadataType) { return true; } + // go back to the beginning and read everything as generics + inStream.device()->seek(0); + Bitstream genericIn(inStream, metadataType, Bitstream::ALL_GENERICS); + genericIn >> testObjectReadA; + genericIn >> testObjectReadB; + genericIn >> messageRead; + genericIn >> endRead; + + // reassign the ids + testObjectReadA->setID(testObjectWrittenA->getID()); + testObjectReadA->setOriginID(testObjectWrittenA->getOriginID()); + testObjectReadB->setID(testObjectWrittenB->getID()); + testObjectReadB->setOriginID(testObjectWrittenB->getOriginID()); + + // write it back out and compare + QByteArray compareArray; + QDataStream compareOutStream(&compareArray, QIODevice::WriteOnly); + Bitstream compareOut(compareOutStream, metadataType); + compareOut << testObjectReadA; + compareOut << testObjectReadB; + compareOut << messageRead; + compareOut << endRead; + compareOut.flush(); + + if (array != compareArray) { + qDebug() << "Mismatch between written/generic written streams."; + return true; + } + return false; }