From e297fb92c2c0e344d36e0aef57921f6b9b921a61 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Sun, 31 May 2015 20:16:23 +0200 Subject: Moved default read/write property mapper to TypeImplementation There is always exactly one default buffer that we can centralize in TypeImplementation. --- common/propertymapper.h | 86 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 common/propertymapper.h (limited to 'common/propertymapper.h') diff --git a/common/propertymapper.h b/common/propertymapper.h new file mode 100644 index 0000000..0c6c16f --- /dev/null +++ b/common/propertymapper.h @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2014 Christian Mollekopf + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#pragma once + +#include +#include +#include +#include + +/** + * Defines how to convert qt primitives to flatbuffer ones + */ +template +flatbuffers::uoffset_t variantToProperty(const QVariant &, flatbuffers::FlatBufferBuilder &fbb); + +/** + * Defines how to convert flatbuffer primitives to qt ones + */ +template +QVariant propertyToVariant(const flatbuffers::String *); + + +/** + * The property mapper is a non-typesafe virtual dispatch. + * + * Instead of using an interface and requring each implementation to override + * a virtual method per property, the property mapper can be filled with accessors + * that extract the properties from resource types. + */ +template +class ReadPropertyMapper +{ +public: + virtual QVariant getProperty(const QByteArray &key, BufferType const *buffer) const + { + if (mReadAccessors.contains(key)) { + auto accessor = mReadAccessors.value(key); + return accessor(buffer); + } + return QVariant(); + } + bool hasMapping(const QByteArray &key) const { return mReadAccessors.contains(key); } + QList availableProperties() const { return mReadAccessors.keys(); } + void addMapping(const QByteArray &property, const std::function &mapping) { + mReadAccessors.insert(property, mapping); + } +private: + QHash > mReadAccessors; +}; + +template +class WritePropertyMapper +{ +public: + virtual void setProperty(const QByteArray &key, const QVariant &value, QList > &builderCalls, flatbuffers::FlatBufferBuilder &fbb) const + { + if (mWriteAccessors.contains(key)) { + auto accessor = mWriteAccessors.value(key); + builderCalls << accessor(value, fbb); + } + } + bool hasMapping(const QByteArray &key) const { return mWriteAccessors.contains(key); } + void addMapping(const QByteArray &property, const std::function(const QVariant &, flatbuffers::FlatBufferBuilder &)> &mapping) { + mWriteAccessors.insert(property, mapping); + } +private: + QHash(const QVariant &, flatbuffers::FlatBufferBuilder &)> > mWriteAccessors; +}; + -- cgit v1.2.3