summaryrefslogtreecommitdiffstats
path: root/common/propertymapper.h
diff options
context:
space:
mode:
Diffstat (limited to 'common/propertymapper.h')
-rw-r--r--common/propertymapper.h164
1 files changed, 38 insertions, 126 deletions
diff --git a/common/propertymapper.h b/common/propertymapper.h
index 9ea0b73..fd24278 100644
--- a/common/propertymapper.h
+++ b/common/propertymapper.h
@@ -65,13 +65,19 @@ 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 */
68template <typename BufferType> 68class PropertyMapper
69class ReadPropertyMapper
70{ 69{
71public: 70public:
72 virtual ~ReadPropertyMapper(){}; 71 virtual ~PropertyMapper(){};
73 72
74 virtual QVariant getProperty(const QByteArray &key, BufferType const *buffer) const 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 }
79
80 virtual QVariant getProperty(const QByteArray &key, void const *buffer) const
75 { 81 {
76 if (mReadAccessors.contains(key)) { 82 if (mReadAccessors.contains(key)) {
77 auto accessor = mReadAccessors.value(key); 83 auto accessor = mReadAccessors.value(key);
@@ -79,163 +85,69 @@ public:
79 } 85 }
80 return QVariant(); 86 return QVariant();
81 } 87 }
82 bool hasMapping(const QByteArray &key) const
83 {
84 return mReadAccessors.contains(key);
85 }
86 QList<QByteArray> availableProperties() const
87 {
88 return mReadAccessors.keys();
89 }
90 void addMapping(const QByteArray &property, const std::function<QVariant(BufferType const *)> &mapping)
91 {
92 mReadAccessors.insert(property, mapping);
93 }
94
95 template <typename T, typename Buffer>
96 void addMapping(const flatbuffers::String *(Buffer::*f)() const)
97 {
98 addMapping(T::name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant<typename T::Type>((buffer->*f)()); });
99 }
100
101 template <typename T, typename Buffer>
102 void addMapping(uint8_t (Buffer::*f)() const)
103 {
104 addMapping(T::name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant<typename T::Type>((buffer->*f)()); });
105 }
106
107 template <typename T, typename Buffer>
108 void addMapping(bool (Buffer::*f)() const)
109 {
110 addMapping(T::name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant<typename T::Type>((buffer->*f)()); });
111 }
112
113 template <typename T, typename Buffer>
114 void addMapping(const flatbuffers::Vector<uint8_t> *(Buffer::*f)() const)
115 {
116 addMapping(T::name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant<typename T::Type>((buffer->*f)()); });
117 }
118
119 template <typename T, typename Buffer>
120 void addMapping(const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *(Buffer::*f)() const)
121 {
122 addMapping(T::name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant<typename T::Type>((buffer->*f)()); });
123 }
124
125 template <typename T, typename Buffer>
126 void addMapping(const Sink::ApplicationDomain::Buffer::MailContact *(Buffer::*f)() const)
127 {
128 addMapping(T::name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant<typename T::Type>((buffer->*f)()); });
129 }
130
131 template <typename T, typename Buffer>
132 void addMapping(const flatbuffers::Vector<flatbuffers::Offset<Sink::ApplicationDomain::Buffer::MailContact>> *(Buffer::*f)() const)
133 {
134 addMapping(T::name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant<typename T::Type>((buffer->*f)()); });
135 }
136 88
137 template <typename T, typename Buffer> 89 virtual void setProperty(const QByteArray &key, const QVariant &value, QList<std::function<void(void *builder)>> &builderCalls, flatbuffers::FlatBufferBuilder &fbb) const
138 void addMapping(const flatbuffers::Vector<flatbuffers::Offset<Sink::ApplicationDomain::Buffer::ContactEmail>> *(Buffer::*f)() const)
139 {
140 addMapping(T::name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant<typename T::Type>((buffer->*f)()); });
141 }
142
143private:
144 QHash<QByteArray, std::function<QVariant(BufferType const *)>> mReadAccessors;
145};
146
147template <typename BufferBuilder>
148class WritePropertyMapper
149{
150public:
151 virtual ~WritePropertyMapper(){};
152
153 virtual void setProperty(const QByteArray &key, const QVariant &value, QList<std::function<void(BufferBuilder &)>> &builderCalls, flatbuffers::FlatBufferBuilder &fbb) const
154 { 90 {
155 if (mWriteAccessors.contains(key)) { 91 if (mWriteAccessors.contains(key)) {
156 auto accessor = mWriteAccessors.value(key); 92 auto accessor = mWriteAccessors.value(key);
157 builderCalls << accessor(value, fbb); 93 builderCalls << accessor(value, fbb);
158 } 94 }
159 } 95 }
96
160 bool hasMapping(const QByteArray &key) const 97 bool hasMapping(const QByteArray &key) const
161 { 98 {
162 return mWriteAccessors.contains(key); 99 return mReadAccessors.contains(key);
163 }
164 void addMapping(const QByteArray &property, const std::function<std::function<void(BufferBuilder &)>(const QVariant &, flatbuffers::FlatBufferBuilder &)> &mapping)
165 {
166 mWriteAccessors.insert(property, mapping);
167 } 100 }
168 101
169 template <typename T> 102 QList<QByteArray> availableProperties() const
170 void addMapping(void (BufferBuilder::*f)(uint8_t))
171 { 103 {
172 addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(BufferBuilder &)> { 104 return mReadAccessors.keys();
173 return [value, f](BufferBuilder &builder) { (builder.*f)(value.value<typename T::Type>()); };
174 });
175 } 105 }
176 106
177 template <typename T> 107private:
178 void addMapping(void (BufferBuilder::*f)(bool)) 108 void addReadMapping(const QByteArray &property, const std::function<QVariant(void const *)> &mapping)
179 { 109 {
180 addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(BufferBuilder &)> { 110 mReadAccessors.insert(property, mapping);
181 return [value, f](BufferBuilder &builder) { (builder.*f)(value.value<typename T::Type>()); };
182 });
183 } 111 }
184 112
185 template <typename T> 113 template <typename T, typename Buffer, typename FunctionReturnValue>
186 void addMapping(void (BufferBuilder::*f)(flatbuffers::Offset<flatbuffers::String>)) 114 void addReadMapping(FunctionReturnValue (Buffer::*f)() const)
187 { 115 {
188 addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(BufferBuilder &)> { 116 addReadMapping(T::name, [f](void const *buffer) -> QVariant { return propertyToVariant<typename T::Type>((static_cast<const Buffer*>(buffer)->*f)()); });
189 auto offset = variantToProperty<typename T::Type>(value, fbb);
190 return [offset, f](BufferBuilder &builder) { (builder.*f)(offset); };
191 });
192 } 117 }
193 118
194 template <typename T>
195 void addMapping(void (BufferBuilder::*f)(flatbuffers::Offset<flatbuffers::Vector<uint8_t>>))
196 {
197 addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(BufferBuilder &)> {
198 auto offset = variantToProperty<typename T::Type>(value, fbb);
199 return [offset, f](BufferBuilder &builder) { (builder.*f)(offset); };
200 });
201 }
202 119
203 template <typename T> 120 void addWriteMapping(const QByteArray &property, const std::function<std::function<void(void *builder)>(const QVariant &, flatbuffers::FlatBufferBuilder &)> &mapping)
204 void addMapping(void (BufferBuilder::*f)(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>>))
205 { 121 {
206 addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(BufferBuilder &)> { 122 mWriteAccessors.insert(property, mapping);
207 auto offset = variantToProperty<typename T::Type>(value, fbb);
208 return [offset, f](BufferBuilder &builder) { (builder.*f)(offset); };
209 });
210 } 123 }
211 124
212 template <typename T> 125 template <typename T, typename BufferBuilder>
213 void addMapping(void (BufferBuilder::*f)(flatbuffers::Offset<Sink::ApplicationDomain::Buffer::MailContact>)) 126 void addWriteMapping(void (BufferBuilder::*f)(uint8_t))
214 { 127 {
215 addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(BufferBuilder &)> { 128 addWriteMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(void *builder)> {
216 auto offset = variantToProperty<typename T::Type>(value, fbb); 129 return [value, f](void *builder) { (static_cast<BufferBuilder*>(builder)->*f)(value.value<typename T::Type>()); };
217 return [offset, f](BufferBuilder &builder) { (builder.*f)(offset); };
218 }); 130 });
219 } 131 }
220 132
221 template <typename T> 133 template <typename T, typename BufferBuilder>
222 void addMapping(void (BufferBuilder::*f)(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Sink::ApplicationDomain::Buffer::MailContact>>>)) 134 void addWriteMapping(void (BufferBuilder::*f)(bool))
223 { 135 {
224 addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(BufferBuilder &)> { 136 addWriteMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(void *builder)> {
225 auto offset = variantToProperty<typename T::Type>(value, fbb); 137 return [value, f](void *builder) { (static_cast<BufferBuilder*>(builder)->*f)(value.value<typename T::Type>()); };
226 return [offset, f](BufferBuilder &builder) { (builder.*f)(offset); };
227 }); 138 });
228 } 139 }
229 140
230 template <typename T> 141 template <typename T, typename BufferBuilder, typename Arg>
231 void addMapping(void (BufferBuilder::*f)(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Sink::ApplicationDomain::Buffer::ContactEmail>>>)) 142 void addWriteMapping(void (BufferBuilder::*f)(flatbuffers::Offset<Arg>))
232 { 143 {
233 addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(BufferBuilder &)> { 144 addWriteMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(void *builder)> {
234 auto offset = variantToProperty<typename T::Type>(value, fbb); 145 auto offset = variantToProperty<typename T::Type>(value, fbb);
235 return [offset, f](BufferBuilder &builder) { (builder.*f)(offset); }; 146 return [offset, f](void *builder) { (static_cast<BufferBuilder*>(builder)->*f)(offset); };
236 }); 147 });
237 } 148 }
238 149
239private: 150 QHash<QByteArray, std::function<QVariant(void const *)>> mReadAccessors;
240 QHash<QByteArray, std::function<std::function<void(BufferBuilder &)>(const QVariant &, flatbuffers::FlatBufferBuilder &)>> mWriteAccessors; 151 QHash<QByteArray, std::function<std::function<void(void *builder)>(const QVariant &, flatbuffers::FlatBufferBuilder &)>> mWriteAccessors;
241}; 152};
153