From c14f07a865940de86b229b4eba0d3bbb9b13967c Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Tue, 3 May 2016 20:09:18 +0200 Subject: Support for QByteArrayList --- common/propertymapper.cpp | 30 ++++++++++++++++++++++++++++++ common/propertymapper.h | 18 +++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) (limited to 'common') diff --git a/common/propertymapper.cpp b/common/propertymapper.cpp index ebe5cb3..130ba0b 100644 --- a/common/propertymapper.cpp +++ b/common/propertymapper.cpp @@ -47,6 +47,21 @@ flatbuffers::uoffset_t variantToProperty(const QVariant &property, fl return 0; } +template <> +flatbuffers::uoffset_t variantToProperty(const QVariant &property, flatbuffers::FlatBufferBuilder &fbb) +{ + if (property.isValid()) { + const auto list = property.value(); + std::vector> vector; + for (const auto value : list) { + auto offset = fbb.CreateString(value.toStdString()); + vector.push_back(offset); + } + return fbb.CreateVector(vector).o; + } + return 0; +} + template <> QVariant propertyToVariant(const flatbuffers::String *property) { @@ -77,6 +92,21 @@ QVariant propertyToVariant(const flatbuffers::Vector *prope return QVariant(); } +template <> +QVariant propertyToVariant(const flatbuffers::Vector> *property) +{ + if (property) { + QByteArrayList list; + for (auto it = property->begin(); it != property->end();) { + // We have to copy the memory, otherwise it would become eventually invalid + list << QString::fromStdString((*it)->c_str()).toUtf8(); + it.operator++(); + } + return QVariant::fromValue(list); + } + return QVariant(); +} + template <> QVariant propertyToVariant(uint8_t property) { diff --git a/common/propertymapper.h b/common/propertymapper.h index cf8ce7b..edbc7f1 100644 --- a/common/propertymapper.h +++ b/common/propertymapper.h @@ -40,7 +40,8 @@ template QVariant SINK_EXPORT propertyToVariant(uint8_t); template QVariant SINK_EXPORT propertyToVariant(const flatbuffers::Vector *); - +template +QVariant SINK_EXPORT propertyToVariant(const flatbuffers::Vector> *); /** * The property mapper is a non-typesafe virtual dispatch. @@ -100,6 +101,12 @@ public: addMapping(name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant((buffer->*f)()); }); } + template + void addMapping(const QByteArray &name, const flatbuffers::Vector> *(Buffer::*f)() const) + { + addMapping(name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant((buffer->*f)()); }); + } + private: QHash> mReadAccessors; }; @@ -160,6 +167,15 @@ public: }); } + template + void addMapping(const QByteArray &name, void (BufferBuilder::*f)(flatbuffers::Offset>>)) + { + addMapping(name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function { + auto offset = variantToProperty(value, fbb); + return [offset, f](BufferBuilder &builder) { (builder.*f)(offset); }; + }); + } + private: QHash(const QVariant &, flatbuffers::FlatBufferBuilder &)>> mWriteAccessors; }; -- cgit v1.2.3