summaryrefslogtreecommitdiffstats
path: root/common/propertymapper.h
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2017-04-28 11:48:06 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2017-04-28 11:48:06 +0200
commit6b8432a5c0647d8fbe3cda549574ae13e07bb2f4 (patch)
tree12b86a325be07013b3f1a926174d554afc35830a /common/propertymapper.h
parent4db017949e6528867963c5495aa557dcfb6f4765 (diff)
downloadsink-6b8432a5c0647d8fbe3cda549574ae13e07bb2f4.tar.gz
sink-6b8432a5c0647d8fbe3cda549574ae13e07bb2f4.zip
Simplified propertymapper
Diffstat (limited to 'common/propertymapper.h')
-rw-r--r--common/propertymapper.h109
1 files changed, 13 insertions, 96 deletions
diff --git a/common/propertymapper.h b/common/propertymapper.h
index 9ea0b73..bca45aa 100644
--- a/common/propertymapper.h
+++ b/common/propertymapper.h
@@ -65,13 +65,12 @@ 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>
69class ReadPropertyMapper 68class ReadPropertyMapper
70{ 69{
71public: 70public:
72 virtual ~ReadPropertyMapper(){}; 71 virtual ~ReadPropertyMapper(){};
73 72
74 virtual QVariant getProperty(const QByteArray &key, BufferType const *buffer) const 73 virtual QVariant getProperty(const QByteArray &key, void const *buffer) const
75 { 74 {
76 if (mReadAccessors.contains(key)) { 75 if (mReadAccessors.contains(key)) {
77 auto accessor = mReadAccessors.value(key); 76 auto accessor = mReadAccessors.value(key);
@@ -79,69 +78,30 @@ public:
79 } 78 }
80 return QVariant(); 79 return QVariant();
81 } 80 }
81
82 bool hasMapping(const QByteArray &key) const 82 bool hasMapping(const QByteArray &key) const
83 { 83 {
84 return mReadAccessors.contains(key); 84 return mReadAccessors.contains(key);
85 } 85 }
86
86 QList<QByteArray> availableProperties() const 87 QList<QByteArray> availableProperties() const
87 { 88 {
88 return mReadAccessors.keys(); 89 return mReadAccessors.keys();
89 } 90 }
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 91
119 template <typename T, typename Buffer> 92 void addMapping(const QByteArray &property, const std::function<QVariant(void const *)> &mapping)
120 void addMapping(const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *(Buffer::*f)() const)
121 { 93 {
122 addMapping(T::name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant<typename T::Type>((buffer->*f)()); }); 94 mReadAccessors.insert(property, mapping);
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 } 95 }
136 96
137 template <typename T, typename Buffer> 97 template <typename T, typename Buffer, typename FunctionReturnValue>
138 void addMapping(const flatbuffers::Vector<flatbuffers::Offset<Sink::ApplicationDomain::Buffer::ContactEmail>> *(Buffer::*f)() const) 98 void addMapping(FunctionReturnValue (Buffer::*f)() const)
139 { 99 {
140 addMapping(T::name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant<typename T::Type>((buffer->*f)()); }); 100 addMapping(T::name, [f](void const *buffer) -> QVariant { return propertyToVariant<typename T::Type>((static_cast<const Buffer*>(buffer)->*f)()); });
141 } 101 }
142 102
143private: 103private:
144 QHash<QByteArray, std::function<QVariant(BufferType const *)>> mReadAccessors; 104 QHash<QByteArray, std::function<QVariant(void const *)>> mReadAccessors;
145}; 105};
146 106
147template <typename BufferBuilder> 107template <typename BufferBuilder>
@@ -157,10 +117,12 @@ public:
157 builderCalls << accessor(value, fbb); 117 builderCalls << accessor(value, fbb);
158 } 118 }
159 } 119 }
120
160 bool hasMapping(const QByteArray &key) const 121 bool hasMapping(const QByteArray &key) const
161 { 122 {
162 return mWriteAccessors.contains(key); 123 return mWriteAccessors.contains(key);
163 } 124 }
125
164 void addMapping(const QByteArray &property, const std::function<std::function<void(BufferBuilder &)>(const QVariant &, flatbuffers::FlatBufferBuilder &)> &mapping) 126 void addMapping(const QByteArray &property, const std::function<std::function<void(BufferBuilder &)>(const QVariant &, flatbuffers::FlatBufferBuilder &)> &mapping)
165 { 127 {
166 mWriteAccessors.insert(property, mapping); 128 mWriteAccessors.insert(property, mapping);
@@ -182,53 +144,8 @@ public:
182 }); 144 });
183 } 145 }
184 146
185 template <typename T> 147 template <typename T, typename Arg>
186 void addMapping(void (BufferBuilder::*f)(flatbuffers::Offset<flatbuffers::String>)) 148 void addMapping(void (BufferBuilder::*f)(flatbuffers::Offset<Arg>))
187 {
188 addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(BufferBuilder &)> {
189 auto offset = variantToProperty<typename T::Type>(value, fbb);
190 return [offset, f](BufferBuilder &builder) { (builder.*f)(offset); };
191 });
192 }
193
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
203 template <typename T>
204 void addMapping(void (BufferBuilder::*f)(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>>))
205 {
206 addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(BufferBuilder &)> {
207 auto offset = variantToProperty<typename T::Type>(value, fbb);
208 return [offset, f](BufferBuilder &builder) { (builder.*f)(offset); };
209 });
210 }
211
212 template <typename T>
213 void addMapping(void (BufferBuilder::*f)(flatbuffers::Offset<Sink::ApplicationDomain::Buffer::MailContact>))
214 {
215 addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(BufferBuilder &)> {
216 auto offset = variantToProperty<typename T::Type>(value, fbb);
217 return [offset, f](BufferBuilder &builder) { (builder.*f)(offset); };
218 });
219 }
220
221 template <typename T>
222 void addMapping(void (BufferBuilder::*f)(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Sink::ApplicationDomain::Buffer::MailContact>>>))
223 {
224 addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(BufferBuilder &)> {
225 auto offset = variantToProperty<typename T::Type>(value, fbb);
226 return [offset, f](BufferBuilder &builder) { (builder.*f)(offset); };
227 });
228 }
229
230 template <typename T>
231 void addMapping(void (BufferBuilder::*f)(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Sink::ApplicationDomain::Buffer::ContactEmail>>>))
232 { 149 {
233 addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(BufferBuilder &)> { 150 addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(BufferBuilder &)> {
234 auto offset = variantToProperty<typename T::Type>(value, fbb); 151 auto offset = variantToProperty<typename T::Type>(value, fbb);