Working on support for streaming Qt enums/flags.

This commit is contained in:
Andrzej Kapolka 2014-06-02 19:00:48 -07:00
parent 6db385de7a
commit ac7d23bf54
4 changed files with 76 additions and 5 deletions

View file

@ -1203,6 +1203,20 @@ void PropertyReader::readDelta(Bitstream& in, QObject* object, const QObject* re
}
}
PropertyWriter::PropertyWriter(const QMetaProperty& property, const TypeStreamer* streamer) :
_property(property),
_streamer(streamer) {
}
void PropertyWriter::write(Bitstream& out, const QObject* object) const {
_streamer->write(out, _property.read(object));
}
void PropertyWriter::writeDelta(Bitstream& out, const QObject* object, const QObject* reference) const {
_streamer->writeDelta(out, _property.read(object), reference && object->metaObject() == reference->metaObject() ?
_property.read(reference) : QVariant());
}
MetaField::MetaField(const QByteArray& name, const TypeStreamer* streamer) :
_name(name),
_streamer(streamer) {

View file

@ -804,6 +804,21 @@ private:
QMetaProperty _property;
};
/// Contains the information necessary to obtain an object property and write it to the stream.
class PropertyWriter {
public:
PropertyWriter(const QMetaProperty& property = QMetaProperty(), const TypeStreamer* streamer = NULL);
void write(Bitstream& out, const QObject* object) const;
void writeDelta(Bitstream& out, const QObject* object, const QObject* reference) const;
private:
QMetaProperty _property;
const TypeStreamer* _streamer;
};
/// Describes a metatype field.
class MetaField {
public:

View file

@ -51,6 +51,29 @@ static QByteArray createRandomBytes() {
return createRandomBytes(MIN_BYTES, MAX_BYTES);
}
static TestSharedObjectA::TestEnum getRandomTestEnum() {
switch (randIntInRange(0, 2)) {
case 0: return TestSharedObjectA::FIRST_TEST_ENUM;
case 1: return TestSharedObjectA::SECOND_TEST_ENUM;
case 2:
default: return TestSharedObjectA::THIRD_TEST_ENUM;
}
}
static TestSharedObjectA::TestFlags getRandomTestFlags() {
TestSharedObjectA::TestFlags flags = 0;
if (randomBoolean()) {
flags |= TestSharedObjectA::FIRST_TEST_FLAG;
}
if (randomBoolean()) {
flags |= TestSharedObjectA::SECOND_TEST_FLAG;
}
if (randomBoolean()) {
flags |= TestSharedObjectA::THIRD_TEST_FLAG;
}
return flags;
}
static TestMessageC createRandomMessageC() {
TestMessageC message;
message.foo = randomBoolean();
@ -64,7 +87,7 @@ static bool testSerialization(Bitstream::MetadataType metadataType) {
QByteArray array;
QDataStream outStream(&array, QIODevice::WriteOnly);
Bitstream out(outStream, metadataType);
SharedObjectPointer testObjectWrittenA = new TestSharedObjectA(randFloat());
SharedObjectPointer testObjectWrittenA = new TestSharedObjectA(randFloat(), getRandomTestEnum(), getRandomTestFlags());
out << testObjectWrittenA;
SharedObjectPointer testObjectWrittenB = new TestSharedObjectB(randFloat(), createRandomBytes());
out << testObjectWrittenB;
@ -175,7 +198,7 @@ bool MetavoxelTests::run() {
static SharedObjectPointer createRandomSharedObject() {
switch (randIntInRange(0, 2)) {
case 0: return new TestSharedObjectA(randFloat());
case 0: return new TestSharedObjectA(randFloat(), getRandomTestEnum(), getRandomTestFlags());
case 1: return new TestSharedObjectB();
case 2:
default: return SharedObjectPointer();
@ -393,8 +416,10 @@ void Endpoint::readReliableChannel() {
streamedBytesReceived += bytes.size();
}
TestSharedObjectA::TestSharedObjectA(float foo) :
_foo(foo) {
TestSharedObjectA::TestSharedObjectA(float foo, TestEnum baz, TestFlags bong) :
_foo(foo),
_baz(baz),
_bong(bong) {
sharedObjectsCreated++;
}

View file

@ -70,16 +70,31 @@ private:
/// A simple shared object.
class TestSharedObjectA : public SharedObject {
Q_OBJECT
Q_ENUMS(TestEnum)
Q_FLAGS(TestFlag TestFlags)
Q_PROPERTY(float foo READ getFoo WRITE setFoo NOTIFY fooChanged)
Q_PROPERTY(TestEnum baz READ getBaz WRITE setBaz)
Q_PROPERTY(TestFlags bong READ getBong WRITE setBong)
public:
Q_INVOKABLE TestSharedObjectA(float foo = 0.0f);
enum TestEnum { FIRST_TEST_ENUM, SECOND_TEST_ENUM, THIRD_TEST_ENUM };
enum TestFlag { NO_TEST_FLAGS = 0x0, FIRST_TEST_FLAG = 0x01, SECOND_TEST_FLAG = 0x02, THIRD_TEST_FLAG = 0x03 };
Q_DECLARE_FLAGS(TestFlags, TestFlag)
Q_INVOKABLE TestSharedObjectA(float foo = 0.0f, TestEnum baz = FIRST_TEST_ENUM, TestFlags bong = 0);
virtual ~TestSharedObjectA();
void setFoo(float foo);
float getFoo() const { return _foo; }
void setBaz(TestEnum baz) { _baz = baz; }
TestEnum getBaz() const { return _baz; }
void setBong(TestFlags bong) { _bong = bong; }
TestFlags getBong() const { return _bong; }
signals:
void fooChanged(float foo);
@ -87,6 +102,8 @@ signals:
private:
float _foo;
TestEnum _baz;
TestFlags _bong;
};
/// Another simple shared object.