SimpleWindow
载入中...
搜索中...
未找到
Macros.h
浏览该文件的文档.
1#pragma once
2
3#include "INotifyPropertyChanged.h"
4#include "Property.h"
5
6/*================================================================================*/
7
29/*================================================================================*/
30
36#define _SW_DEFINE_STATIC_GETTER(field) \
37 template <typename T, typename = void> \
38 struct _HasUserGetter_##field : std::false_type { \
39 }; \
40 template <typename T> \
41 struct _HasUserGetter_##field<T, decltype(void(&T::Get_##field))> : std::true_type { \
42 }; \
43 template <typename T> \
44 static auto _Get_##field(T &self) \
45 -> typename std::enable_if<_HasUserGetter_##field<T>::value, decltype(self.Get_##field())>::type \
46 { \
47 return self.Get_##field(); \
48 } \
49 template <typename T> \
50 static auto _Get_##field(T &self) \
51 -> typename std::enable_if<!_HasUserGetter_##field<T>::value, decltype(T::field) &>::type \
52 { \
53 return self.field; \
54 }
55
61#define _SW_DEFINE_STATIC_SETTER(field) \
62 template <typename T, typename = void> \
63 struct _HasUserSetter_##field : std::false_type { \
64 }; \
65 template <typename T> \
66 struct _HasUserSetter_##field<T, decltype(void(&T::Set_##field))> : std::true_type { \
67 }; \
68 template <typename T, typename U> \
69 static auto _Set_##field(T &self, U &&value) \
70 -> typename std::enable_if<_HasUserSetter_##field<T>::value>::type \
71 { \
72 self.Set_##field(std::forward<U>(value)); \
73 } \
74 template <typename T, typename U> \
75 static auto _Set_##field(T &self, U &&value) \
76 -> typename std::enable_if<!_HasUserSetter_##field<T>::value>::type \
77 { \
78 self.field = std::forward<U>(value); \
79 }
80
81/*================================================================================*/
82
89#define SW_DEFINE_PROPERTY(name, field) \
90 _SW_DEFINE_STATIC_GETTER(field); \
91 _SW_DEFINE_STATIC_SETTER(field); \
92 sw::Property<decltype(field)> name \
93 { \
94 sw::Property<decltype(field)>::Init(this) \
95 .Getter([](auto self) { \
96 return _Get_##field(*self); \
97 }) \
98 .Setter([](auto self, auto value) { \
99 _Set_##field(*self, value); \
100 }) \
101 }
102
109#define SW_DEFINE_READONLY_PROPERTY(name, field) \
110 _SW_DEFINE_STATIC_GETTER(field); \
111 sw::ReadOnlyProperty<decltype(field)> name \
112 { \
113 sw::Property<decltype(field)>::Init(this) \
114 .Getter([](auto self) { \
115 return _Get_##field(*self); \
116 }) \
117 }
118
125#define SW_DEFINE_WRITEONLY_PROPERTY(name, field) \
126 _SW_DEFINE_STATIC_SETTER(field); \
127 sw::WriteOnlyProperty<decltype(field)> name \
128 { \
129 sw::Property<decltype(field)>::Init(this) \
130 .Setter([](auto self, auto value) { \
131 _Set_##field(*self, value); \
132 }) \
133 }
134
144#define SW_DEFINE_NOTIFY_PROPERTY(name, field) \
145 _SW_DEFINE_STATIC_GETTER(field); \
146 template <typename T, typename = void> \
147 struct _HasUserSetter_##field : std::false_type { \
148 }; \
149 template <typename T> \
150 struct _HasUserSetter_##field<T, decltype(void(&T::Set_##field))> : std::true_type { \
151 }; \
152 template <typename T, typename U> \
153 static auto _Set_##field(T &self, U &&value) \
154 -> typename std::enable_if<_HasUserSetter_##field<T>::value>::type \
155 { \
156 self.Set_##field(std::forward<U>(value)); \
157 } \
158 template <typename T, typename U> \
159 static auto _Set_##field(T &self, U &&value) \
160 -> typename std::enable_if< \
161 !_HasUserSetter_##field<T>::value && \
162 sw::_EqOperationHelper<decltype(_Get_##field(std::declval<T &>())), U>::value>::type \
163 { \
164 if (!(_Get_##field(self) == value)) { \
165 self.field = std::forward<U>(value); \
166 if (auto &_d = self.GetPropertyChangedEventDelegate()) { \
167 sw::PropertyChangedEventArgs _a{}; \
168 _a.propertyId = sw::Reflection::GetFieldId(&T::name); \
169 _d(self, _a); \
170 } \
171 } \
172 } \
173 template <typename T, typename U> \
174 static auto _Set_##field(T &self, U &&value) \
175 -> typename std::enable_if< \
176 !_HasUserSetter_##field<T>::value && \
177 !sw::_EqOperationHelper<decltype(_Get_##field(std::declval<T &>())), U>::value>::type \
178 { \
179 self.field = std::forward<U>(value); \
180 if (auto &_d = self.GetPropertyChangedEventDelegate()) { \
181 sw::PropertyChangedEventArgs _a{}; \
182 _a.propertyId = sw::Reflection::GetFieldId(&T::name); \
183 _d(self, _a); \
184 } \
185 } \
186 sw::Property<decltype(field)> name \
187 { \
188 sw::Property<decltype(field)>::Init(this) \
189 .Getter([](auto self) { \
190 return _Get_##field(*self); \
191 }) \
192 .Setter([](auto self, auto value) { \
193 _Set_##field(*self, value); \
194 }) \
195 }
196
197/*================================================================================*/
198
204#define _SW_DEFINE_EXPR_PROPERTY_VALUETYPE_HELPER(propname) \
205 template <typename TExpr, typename = void> \
206 struct _ExprPropertyValueTypeHelper_##propname { \
207 using type = typename std::decay<TExpr>::type; \
208 }; \
209 template <typename TExpr> \
210 struct _ExprPropertyValueTypeHelper_##propname< \
211 TExpr, typename std::enable_if<sw::_IsProperty<TExpr>::value>::type> { \
212 using type = typename TExpr::TValue; \
213 }
214
220#define _SW_EXPR_PROPERTY_VALUETYPE(propname, expr) \
221 typename _ExprPropertyValueTypeHelper_##propname<decltype(expr)>::type
222
229#define _SW_DEFINE_EXPR_STATIC_GETTER(propname, expr) \
230 template <typename T, typename U = decltype(expr)> \
231 static auto _Get_##propname(T &self) \
232 -> typename std::enable_if<sw::_IsProperty<U>::value, typename U::TValue>::type \
233 { \
234 return (self.expr).Get(); \
235 } \
236 template <typename T, typename U = decltype(expr)> \
237 static auto _Get_##propname(T &self) \
238 -> typename std::enable_if<!sw::_IsProperty<U>::value, U>::type \
239 { \
240 return (self.expr); \
241 }
242
249#define _SW_DEFINE_EXPR_STATIC_SETTER(propname, expr) \
250 template <typename T, typename U, typename V = decltype(expr)> \
251 static auto _Set_##propname(T &self, U &&value) \
252 -> typename std::enable_if<sw::_IsProperty<V>::value>::type \
253 { \
254 (self.expr).Set(std::forward<U>(value)); \
255 } \
256 template <typename T, typename U, typename V = decltype(expr)> \
257 static auto _Set_##propname(T &self, U &&value) \
258 -> typename std::enable_if<!sw::_IsProperty<V>::value>::type \
259 { \
260 (self.expr) = std::forward<U>(value); \
261 }
262
263/*================================================================================*/
264
271#define SW_DEFINE_EXPR_PROPERTY(name, expr) \
272 _SW_DEFINE_EXPR_PROPERTY_VALUETYPE_HELPER(name); \
273 _SW_DEFINE_EXPR_STATIC_GETTER(name, expr); \
274 _SW_DEFINE_EXPR_STATIC_SETTER(name, expr); \
275 sw::Property<_SW_EXPR_PROPERTY_VALUETYPE(name, expr)> name \
276 { \
277 sw::Property<_SW_EXPR_PROPERTY_VALUETYPE(name, expr)>::Init(this) \
278 .Getter([](auto self) { \
279 return _Get_##name(*self); \
280 }) \
281 .Setter([](auto self, auto value) { \
282 _Set_##name(*self, value); \
283 }) \
284 }
285
292#define SW_DEFINE_EXPR_READONLY_PROPERTY(name, expr) \
293 _SW_DEFINE_EXPR_PROPERTY_VALUETYPE_HELPER(name); \
294 _SW_DEFINE_EXPR_STATIC_GETTER(name, expr); \
295 sw::ReadOnlyProperty<_SW_EXPR_PROPERTY_VALUETYPE(name, expr)> name \
296 { \
297 sw::Property<_SW_EXPR_PROPERTY_VALUETYPE(name, expr)>::Init(this) \
298 .Getter([](auto self) { \
299 return _Get_##name(*self); \
300 }) \
301 }
302
309#define SW_DEFINE_EXPR_WRITEONLY_PROPERTY(name, expr) \
310 _SW_DEFINE_EXPR_PROPERTY_VALUETYPE_HELPER(name); \
311 _SW_DEFINE_EXPR_STATIC_SETTER(name, expr); \
312 sw::WriteOnlyProperty<_SW_EXPR_PROPERTY_VALUETYPE(name, expr)> name \
313 { \
314 sw::Property<_SW_EXPR_PROPERTY_VALUETYPE(name, expr)>::Init(this) \
315 .Setter([](auto self, auto value) { \
316 _Set_##name(*self, value); \
317 }) \
318 }
319
329#define SW_DEFINE_EXPR_NOTIFY_PROPERTY(name, expr) \
330 _SW_DEFINE_EXPR_PROPERTY_VALUETYPE_HELPER(name); \
331 _SW_DEFINE_EXPR_STATIC_GETTER(name, expr); \
332 template <typename T, typename U, typename V = decltype(expr)> \
333 static auto _Set_##name(T &self, U &&value) \
334 -> typename std::enable_if< \
335 sw::_IsProperty<V>::value && \
336 sw::_EqOperationHelper<typename V::TValue, U>::value>::type \
337 { \
338 if (!((self.expr).Get() == value)) { \
339 (self.expr).Set(std::forward<U>(value)); \
340 if (auto &_d = self.GetPropertyChangedEventDelegate()) { \
341 sw::PropertyChangedEventArgs _a{}; \
342 _a.propertyId = sw::Reflection::GetFieldId(&T::name); \
343 _d(self, _a); \
344 } \
345 } \
346 } \
347 template <typename T, typename U, typename V = decltype(expr)> \
348 static auto _Set_##name(T &self, U &&value) \
349 -> typename std::enable_if< \
350 sw::_IsProperty<V>::value && \
351 !sw::_EqOperationHelper<typename V::TValue, U>::value>::type \
352 { \
353 (self.expr).Set(std::forward<U>(value)); \
354 if (auto &_d = self.GetPropertyChangedEventDelegate()) { \
355 sw::PropertyChangedEventArgs _a{}; \
356 _a.propertyId = sw::Reflection::GetFieldId(&T::name); \
357 _d(self, _a); \
358 } \
359 } \
360 template <typename T, typename U, typename V = decltype(expr)> \
361 static auto _Set_##name(T &self, U &&value) \
362 -> typename std::enable_if< \
363 !sw::_IsProperty<V>::value && \
364 sw::_EqOperationHelper<V, U>::value>::type \
365 { \
366 if (!((self.expr) == value)) { \
367 (self.expr) = std::forward<U>(value); \
368 if (auto &_d = self.GetPropertyChangedEventDelegate()) { \
369 sw::PropertyChangedEventArgs _a{}; \
370 _a.propertyId = sw::Reflection::GetFieldId(&T::name); \
371 _d(self, _a); \
372 } \
373 } \
374 } \
375 template <typename T, typename U, typename V = decltype(expr)> \
376 static auto _Set_##name(T &self, U &&value) \
377 -> typename std::enable_if< \
378 !sw::_IsProperty<V>::value && \
379 !sw::_EqOperationHelper<V, U>::value>::type \
380 { \
381 (self.expr) = std::forward<U>(value); \
382 if (auto &_d = self.GetPropertyChangedEventDelegate()) { \
383 sw::PropertyChangedEventArgs _a{}; \
384 _a.propertyId = sw::Reflection::GetFieldId(&T::name); \
385 _d(self, _a); \
386 } \
387 } \
388 sw::Property<_SW_EXPR_PROPERTY_VALUETYPE(name, expr)> name \
389 { \
390 sw::Property<_SW_EXPR_PROPERTY_VALUETYPE(name, expr)>::Init(this) \
391 .Getter([](auto self) { \
392 return _Get_##name(*self); \
393 }) \
394 .Setter([](auto self, auto value) { \
395 _Set_##name(*self, value); \
396 }) \
397 }
398
399/*================================================================================*/