From a38239b3d8fe0714a0b62c2ad3330d90893db1cd Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Tue, 18 Mar 2014 10:11:25 -0700 Subject: [PATCH] Working on collection streaming. --- libraries/metavoxels/src/Bitstream.cpp | 16 +++++++++ libraries/metavoxels/src/Bitstream.h | 46 ++++++++++++++++++++++++-- 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/libraries/metavoxels/src/Bitstream.cpp b/libraries/metavoxels/src/Bitstream.cpp index 68f1e19dc4..f6e988a5f2 100644 --- a/libraries/metavoxels/src/Bitstream.cpp +++ b/libraries/metavoxels/src/Bitstream.cpp @@ -865,3 +865,19 @@ int TypeStreamer::getFieldIndex(const QByteArray& name) const { void TypeStreamer::setField(int index, QVariant& object, const QVariant& value) const { // nothing by default } + +const TypeStreamer* TypeStreamer::getKeyStreamer() const { + return NULL; +} + +const TypeStreamer* TypeStreamer::getValueStreamer() const { + return NULL; +} + +void TypeStreamer::append(QVariant& object, const QVariant& element) const { + // nothing by default +} + +void TypeStreamer::insert(QVariant& object, const QVariant& key, const QVariant& value) const { + // nothing by default +} diff --git a/libraries/metavoxels/src/Bitstream.h b/libraries/metavoxels/src/Bitstream.h index 2ed265b6ed..5d5c75857d 100644 --- a/libraries/metavoxels/src/Bitstream.h +++ b/libraries/metavoxels/src/Bitstream.h @@ -552,6 +552,8 @@ Q_DECLARE_METATYPE(const QMetaObject*) class TypeStreamer { public: + enum Category { SIMPLE_CATEGORY, STREAMABLE_CATEGORY }; + virtual ~TypeStreamer(); void setType(int type) { _type = type; } @@ -564,6 +566,12 @@ public: virtual int getFieldIndex(const QByteArray& name) const; virtual void setField(int index, QVariant& object, const QVariant& value) const; + virtual const TypeStreamer* getKeyStreamer() const; + virtual const TypeStreamer* getValueStreamer() const; + + virtual void append(QVariant& object, const QVariant& element) const; + virtual void insert(QVariant& object, const QVariant& key, const QVariant& value) const; + private: int _type; @@ -577,8 +585,8 @@ public: virtual QVariant read(Bitstream& in) const { T value; in >> value; return QVariant::fromValue(value); } }; -/// A streamer that works with Bitstream's operators. -template class CompoundTypeStreamer : public SimpleTypeStreamer { +/// A streamer for types compiled by mtc. +template class StreamableTypeStreamer : public SimpleTypeStreamer { public: virtual const QVector& getMetaFields() const { return T::getMetaFields(); } @@ -587,10 +595,42 @@ public: static_cast(object.data())->setField(index, value); } }; +/// Base template for collection streamers. +template class CollectionTypeStreamer : public SimpleTypeStreamer { +}; + +/// A streamer for list types. +template class CollectionTypeStreamer > : public SimpleTypeStreamer > { +public: + + virtual void append(QVariant& object, const QVariant& element) const { + static_cast*>(object.data())->append(element.value()); } +}; + +/// A streamer for set types. +template class CollectionTypeStreamer > : public SimpleTypeStreamer > { +public: + + virtual void append(QVariant& object, const QVariant& element) const { + static_cast*>(object.data())->insert(element.value()); } +}; + +/// A streamer for hash types. +template class CollectionTypeStreamer > : public SimpleTypeStreamer > { +public: + + virtual void insert(QVariant& object, const QVariant& key, const QVariant& value) const { + static_cast*>(object.data())->insert(key.value(), value.value()); } +}; + /// Macro for registering simple type streamers. #define REGISTER_SIMPLE_TYPE_STREAMER(x) static int x##Streamer = \ Bitstream::registerTypeStreamer(qMetaTypeId(), new SimpleTypeStreamer()); +/// Macro for registering collection type streamers. +#define REGISTER_COLLECTION_TYPE_STREAMER(x) static int x##Streamer = \ + Bitstream::registerTypeStreamer(qMetaTypeId(), new CollectionTypeStreamer()); + /// Declares the metatype and the streaming operators. The last lines /// ensure that the generated file will be included in the link phase. #ifdef _WIN32 @@ -621,7 +661,7 @@ public: /// Registers a streamable type and its streamer. template int registerStreamableMetaType() { int type = qRegisterMetaType(); - Bitstream::registerTypeStreamer(type, new CompoundTypeStreamer()); + Bitstream::registerTypeStreamer(type, new StreamableTypeStreamer()); return type; }