diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-04-28 15:29:18 +0200 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-04-28 15:30:15 +0200 |
commit | ca5020095abfb76e63bd801e9722c07193eb05f5 (patch) | |
tree | 34d6344e982adcea4652a3ccb6bfb43b118a5189 /common/propertymapper.h | |
parent | a08984c450b1cd2584272b0d57a2f95ae3d074c3 (diff) | |
download | sink-ca5020095abfb76e63bd801e9722c07193eb05f5.tar.gz sink-ca5020095abfb76e63bd801e9722c07193eb05f5.zip |
A single propertymapper for both directions
Diffstat (limited to 'common/propertymapper.h')
-rw-r--r-- | common/propertymapper.h | 64 |
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 | */ |
68 | class ReadPropertyMapper | 68 | class PropertyMapper |
69 | { | 69 | { |
70 | public: | 70 | public: |
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) | 107 | private: |
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 | ||
103 | private: | ||
104 | QHash<QByteArray, std::function<QVariant(void const *)>> mReadAccessors; | ||
105 | }; | ||
106 | 119 | ||
107 | class WritePropertyMapper | 120 | void addWriteMapping(const QByteArray &property, const std::function<std::function<void(void *builder)>(const QVariant &, flatbuffers::FlatBufferBuilder &)> &mapping) |
108 | { | ||
109 | public: | ||
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 | ||
155 | private: | 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 | |||