summaryrefslogtreecommitdiffstats
path: root/common/propertymapper.h
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2017-04-28 15:29:18 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2017-04-28 15:30:15 +0200
commitca5020095abfb76e63bd801e9722c07193eb05f5 (patch)
tree34d6344e982adcea4652a3ccb6bfb43b118a5189 /common/propertymapper.h
parenta08984c450b1cd2584272b0d57a2f95ae3d074c3 (diff)
downloadsink-ca5020095abfb76e63bd801e9722c07193eb05f5.tar.gz
sink-ca5020095abfb76e63bd801e9722c07193eb05f5.zip
A single propertymapper for both directions
Diffstat (limited to 'common/propertymapper.h')
-rw-r--r--common/propertymapper.h64
1 files changed, 30 insertions, 34 deletions
diff --git a/common/propertymapper.h b/common/propertymapper.h
index fa4592b..fd24278 100644
--- a/common/propertymapper.h
+++ b/common/propertymapper.h
@@ -65,10 +65,17 @@ QVariant SINK_EXPORT propertyToVariant(const flatbuffers::Vector<flatbuffers::Of
65 * a virtual method per property, the property mapper can be filled with accessors 65 * a virtual method per property, the property mapper can be filled with accessors
66 * that extract the properties from resource types. 66 * that extract the properties from resource types.
67 */ 67 */
68class ReadPropertyMapper 68class PropertyMapper
69{ 69{
70public: 70public:
71 virtual ~ReadPropertyMapper(){}; 71 virtual ~PropertyMapper(){};
72
73 template <typename T, typename Buffer, typename BufferBuilder, typename FunctionReturnValue, typename Arg>
74 void addMapping(FunctionReturnValue (Buffer::*f)() const, void (BufferBuilder::*f2)(Arg))
75 {
76 addReadMapping<T, Buffer, FunctionReturnValue>(f);
77 addWriteMapping<T, BufferBuilder>(f2);
78 }
72 79
73 virtual QVariant getProperty(const QByteArray &key, void const *buffer) const 80 virtual QVariant getProperty(const QByteArray &key, void const *buffer) const
74 { 81 {
@@ -79,6 +86,14 @@ public:
79 return QVariant(); 86 return QVariant();
80 } 87 }
81 88
89 virtual void setProperty(const QByteArray &key, const QVariant &value, QList<std::function<void(void *builder)>> &builderCalls, flatbuffers::FlatBufferBuilder &fbb) const
90 {
91 if (mWriteAccessors.contains(key)) {
92 auto accessor = mWriteAccessors.value(key);
93 builderCalls << accessor(value, fbb);
94 }
95 }
96
82 bool hasMapping(const QByteArray &key) const 97 bool hasMapping(const QByteArray &key) const
83 { 98 {
84 return mReadAccessors.contains(key); 99 return mReadAccessors.contains(key);
@@ -89,69 +104,50 @@ public:
89 return mReadAccessors.keys(); 104 return mReadAccessors.keys();
90 } 105 }
91 106
92 void addMapping(const QByteArray &property, const std::function<QVariant(void const *)> &mapping) 107private:
108 void addReadMapping(const QByteArray &property, const std::function<QVariant(void const *)> &mapping)
93 { 109 {
94 mReadAccessors.insert(property, mapping); 110 mReadAccessors.insert(property, mapping);
95 } 111 }
96 112
97 template <typename T, typename Buffer, typename FunctionReturnValue> 113 template <typename T, typename Buffer, typename FunctionReturnValue>
98 void addMapping(FunctionReturnValue (Buffer::*f)() const) 114 void addReadMapping(FunctionReturnValue (Buffer::*f)() const)
99 { 115 {
100 addMapping(T::name, [f](void const *buffer) -> QVariant { return propertyToVariant<typename T::Type>((static_cast<const Buffer*>(buffer)->*f)()); }); 116 addReadMapping(T::name, [f](void const *buffer) -> QVariant { return propertyToVariant<typename T::Type>((static_cast<const Buffer*>(buffer)->*f)()); });
101 } 117 }
102 118
103private:
104 QHash<QByteArray, std::function<QVariant(void const *)>> mReadAccessors;
105};
106 119
107class WritePropertyMapper 120 void addWriteMapping(const QByteArray &property, const std::function<std::function<void(void *builder)>(const QVariant &, flatbuffers::FlatBufferBuilder &)> &mapping)
108{
109public:
110 virtual ~WritePropertyMapper(){};
111
112 virtual void setProperty(const QByteArray &key, const QVariant &value, QList<std::function<void(void *builder)>> &builderCalls, flatbuffers::FlatBufferBuilder &fbb) const
113 {
114 if (mWriteAccessors.contains(key)) {
115 auto accessor = mWriteAccessors.value(key);
116 builderCalls << accessor(value, fbb);
117 }
118 }
119
120 bool hasMapping(const QByteArray &key) const
121 {
122 return mWriteAccessors.contains(key);
123 }
124
125 void addMapping(const QByteArray &property, const std::function<std::function<void(void *builder)>(const QVariant &, flatbuffers::FlatBufferBuilder &)> &mapping)
126 { 121 {
127 mWriteAccessors.insert(property, mapping); 122 mWriteAccessors.insert(property, mapping);
128 } 123 }
129 124
130 template <typename T, typename BufferBuilder> 125 template <typename T, typename BufferBuilder>
131 void addMapping(void (BufferBuilder::*f)(uint8_t)) 126 void addWriteMapping(void (BufferBuilder::*f)(uint8_t))
132 { 127 {
133 addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(void *builder)> { 128 addWriteMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(void *builder)> {
134 return [value, f](void *builder) { (static_cast<BufferBuilder*>(builder)->*f)(value.value<typename T::Type>()); }; 129 return [value, f](void *builder) { (static_cast<BufferBuilder*>(builder)->*f)(value.value<typename T::Type>()); };
135 }); 130 });
136 } 131 }
137 132
138 template <typename T, typename BufferBuilder> 133 template <typename T, typename BufferBuilder>
139 void addMapping(void (BufferBuilder::*f)(bool)) 134 void addWriteMapping(void (BufferBuilder::*f)(bool))
140 { 135 {
141 addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(void *builder)> { 136 addWriteMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(void *builder)> {
142 return [value, f](void *builder) { (static_cast<BufferBuilder*>(builder)->*f)(value.value<typename T::Type>()); }; 137 return [value, f](void *builder) { (static_cast<BufferBuilder*>(builder)->*f)(value.value<typename T::Type>()); };
143 }); 138 });
144 } 139 }
145 140
146 template <typename T, typename BufferBuilder, typename Arg> 141 template <typename T, typename BufferBuilder, typename Arg>
147 void addMapping(void (BufferBuilder::*f)(flatbuffers::Offset<Arg>)) 142 void addWriteMapping(void (BufferBuilder::*f)(flatbuffers::Offset<Arg>))
148 { 143 {
149 addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(void *builder)> { 144 addWriteMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(void *builder)> {
150 auto offset = variantToProperty<typename T::Type>(value, fbb); 145 auto offset = variantToProperty<typename T::Type>(value, fbb);
151 return [offset, f](void *builder) { (static_cast<BufferBuilder*>(builder)->*f)(offset); }; 146 return [offset, f](void *builder) { (static_cast<BufferBuilder*>(builder)->*f)(offset); };
152 }); 147 });
153 } 148 }
154 149
155private: 150 QHash<QByteArray, std::function<QVariant(void const *)>> mReadAccessors;
156 QHash<QByteArray, std::function<std::function<void(void *builder)>(const QVariant &, flatbuffers::FlatBufferBuilder &)>> mWriteAccessors; 151 QHash<QByteArray, std::function<std::function<void(void *builder)>(const QVariant &, flatbuffers::FlatBufferBuilder &)>> mWriteAccessors;
157}; 152};
153