summaryrefslogtreecommitdiffstats
path: root/common/domainadaptor.h
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2015-05-31 20:16:23 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2015-05-31 20:16:23 +0200
commite297fb92c2c0e344d36e0aef57921f6b9b921a61 (patch)
treeab36c3a121f3f132235ed3eafb5eb5d767c77b3b /common/domainadaptor.h
parent0815156ef93cb9f48073a777b888ed47b579d695 (diff)
downloadsink-e297fb92c2c0e344d36e0aef57921f6b9b921a61.tar.gz
sink-e297fb92c2c0e344d36e0aef57921f6b9b921a61.zip
Moved default read/write property mapper to TypeImplementation
There is always exactly one default buffer that we can centralize in TypeImplementation.
Diffstat (limited to 'common/domainadaptor.h')
-rw-r--r--common/domainadaptor.h69
1 files changed, 6 insertions, 63 deletions
diff --git a/common/domainadaptor.h b/common/domainadaptor.h
index fd015b5..70c3a42 100644
--- a/common/domainadaptor.h
+++ b/common/domainadaptor.h
@@ -29,65 +29,8 @@
29#include "entity_generated.h" 29#include "entity_generated.h"
30#include "metadata_generated.h" 30#include "metadata_generated.h"
31#include "entitybuffer.h" 31#include "entitybuffer.h"
32 32#include "propertymapper.h"
33/** 33#include "domain/event.h"
34 * The property mapper is a non-typesafe virtual dispatch.
35 *
36 * Instead of using an interface and requring each implementation to override
37 * a virtual method per property, the property mapper can be filled with accessors
38 * that extract the properties from resource types.
39 */
40template<typename BufferType>
41class ReadPropertyMapper
42{
43public:
44 virtual QVariant getProperty(const QByteArray &key, BufferType const *buffer) const
45 {
46 if (mReadAccessors.contains(key)) {
47 auto accessor = mReadAccessors.value(key);
48 return accessor(buffer);
49 }
50 return QVariant();
51 }
52 bool hasMapping(const QByteArray &key) const { return mReadAccessors.contains(key); }
53 QList<QByteArray> availableProperties() const { return mReadAccessors.keys(); }
54 void addMapping(const QByteArray &property, const std::function<QVariant(BufferType const *)> &mapping) {
55 mReadAccessors.insert(property, mapping);
56 }
57private:
58 QHash<QByteArray, std::function<QVariant(BufferType const *)> > mReadAccessors;
59};
60
61template<typename BufferBuilder>
62class WritePropertyMapper
63{
64public:
65 virtual void setProperty(const QByteArray &key, const QVariant &value, QList<std::function<void(BufferBuilder &)> > &builderCalls, flatbuffers::FlatBufferBuilder &fbb) const
66 {
67 if (mWriteAccessors.contains(key)) {
68 auto accessor = mWriteAccessors.value(key);
69 builderCalls << accessor(value, fbb);
70 }
71 }
72 bool hasMapping(const QByteArray &key) const { return mWriteAccessors.contains(key); }
73 void addMapping(const QByteArray &property, const std::function<std::function<void(BufferBuilder &)>(const QVariant &, flatbuffers::FlatBufferBuilder &)> &mapping) {
74 mWriteAccessors.insert(property, mapping);
75 }
76private:
77 QHash<QByteArray, std::function<std::function<void(BufferBuilder &)>(const QVariant &, flatbuffers::FlatBufferBuilder &)> > mWriteAccessors;
78};
79
80/**
81 * Defines how to convert qt primitives to flatbuffer ones
82 */
83template <class T>
84flatbuffers::uoffset_t variantToProperty(const QVariant &, flatbuffers::FlatBufferBuilder &fbb);
85
86/**
87 * Defines how to convert flatbuffer primitives to qt ones
88 */
89template <typename T>
90QVariant propertyToVariant(const flatbuffers::String *);
91 34
92/** 35/**
93 * Create a buffer from a domain object using the provided mappings 36 * Create a buffer from a domain object using the provided mappings
@@ -177,7 +120,7 @@ class DomainTypeAdaptorFactoryInterface
177public: 120public:
178 virtual ~DomainTypeAdaptorFactoryInterface() {}; 121 virtual ~DomainTypeAdaptorFactoryInterface() {};
179 virtual QSharedPointer<Akonadi2::ApplicationDomain::BufferAdaptor> createAdaptor(const Akonadi2::Entity &entity) = 0; 122 virtual QSharedPointer<Akonadi2::ApplicationDomain::BufferAdaptor> createAdaptor(const Akonadi2::Entity &entity) = 0;
180 virtual void createBuffer(const DomainType &event, flatbuffers::FlatBufferBuilder &fbb) = 0; 123 virtual void createBuffer(const DomainType &domainType, flatbuffers::FlatBufferBuilder &fbb) = 0;
181}; 124};
182 125
183/** 126/**
@@ -190,9 +133,9 @@ class DomainTypeAdaptorFactory : public DomainTypeAdaptorFactoryInterface<Domain
190{ 133{
191public: 134public:
192 DomainTypeAdaptorFactory() : 135 DomainTypeAdaptorFactory() :
193 mLocalMapper(initializeReadPropertyMapper<LocalBuffer>()), 136 mLocalMapper(Akonadi2::ApplicationDomain::TypeImplementation<DomainType>::initializeReadPropertyMapper()),
194 mResourceMapper(QSharedPointer<ReadPropertyMapper<ResourceBuffer> >::create()), 137 mResourceMapper(QSharedPointer<ReadPropertyMapper<ResourceBuffer> >::create()),
195 mLocalWriteMapper(initializeWritePropertyMapper<LocalBuilder>()), 138 mLocalWriteMapper(Akonadi2::ApplicationDomain::TypeImplementation<DomainType>::initializeWritePropertyMapper()),
196 mResourceWriteMapper(QSharedPointer<WritePropertyMapper<ResourceBuilder> >::create()) 139 mResourceWriteMapper(QSharedPointer<WritePropertyMapper<ResourceBuilder> >::create())
197 {}; 140 {};
198 virtual ~DomainTypeAdaptorFactory() {}; 141 virtual ~DomainTypeAdaptorFactory() {};
@@ -216,7 +159,7 @@ public:
216 return adaptor; 159 return adaptor;
217 } 160 }
218 161
219 virtual void createBuffer(const Akonadi2::ApplicationDomain::Event &event, flatbuffers::FlatBufferBuilder &fbb) Q_DECL_OVERRIDE {}; 162 virtual void createBuffer(const DomainType &domainType, flatbuffers::FlatBufferBuilder &fbb) Q_DECL_OVERRIDE {};
220 163
221protected: 164protected:
222 QSharedPointer<ReadPropertyMapper<LocalBuffer> > mLocalMapper; 165 QSharedPointer<ReadPropertyMapper<LocalBuffer> > mLocalMapper;