浏览该文件的文档.
3#include "INotifyPropertyChanged.h"
36#define _SW_DEFINE_STATIC_GETTER(field) \
37 template <typename T, typename = void> \
38 struct _HasUserGetter_##field : std::false_type { \
40 template <typename T> \
41 struct _HasUserGetter_##field<T, decltype(void(&T::Get_##field))> : std::true_type { \
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 \
47 return self.Get_##field(); \
49 template <typename T> \
50 static auto _Get_##field(T &self) \
51 -> typename std::enable_if<!_HasUserGetter_##field<T>::value, decltype(T::field) &>::type \
61#define _SW_DEFINE_STATIC_SETTER(field) \
62 template <typename T, typename = void> \
63 struct _HasUserSetter_##field : std::false_type { \
65 template <typename T> \
66 struct _HasUserSetter_##field<T, decltype(void(&T::Set_##field))> : std::true_type { \
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 \
72 self.Set_##field(std::forward<U>(value)); \
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 \
78 self.field = std::forward<U>(value); \
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 \
94 sw::Property<decltype(field)>::Init(this) \
95 .Getter([](auto self) { \
96 return _Get_##field(*self); \
98 .Setter([](auto self, auto value) { \
99 _Set_##field(*self, value); \
109#define SW_DEFINE_READONLY_PROPERTY(name, field) \
110 _SW_DEFINE_STATIC_GETTER(field); \
111 sw::ReadOnlyProperty<decltype(field)> name \
113 sw::Property<decltype(field)>::Init(this) \
114 .Getter([](auto self) { \
115 return _Get_##field(*self); \
125#define SW_DEFINE_WRITEONLY_PROPERTY(name, field) \
126 _SW_DEFINE_STATIC_SETTER(field); \
127 sw::WriteOnlyProperty<decltype(field)> name \
129 sw::Property<decltype(field)>::Init(this) \
130 .Setter([](auto self, auto value) { \
131 _Set_##field(*self, value); \
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 { \
149 template <typename T> \
150 struct _HasUserSetter_##field<T, decltype(void(&T::Set_##field))> : std::true_type { \
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 \
156 self.Set_##field(std::forward<U>(value)); \
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 \
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); \
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 \
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); \
186 sw::Property<decltype(field)> name \
188 sw::Property<decltype(field)>::Init(this) \
189 .Getter([](auto self) { \
190 return _Get_##field(*self); \
192 .Setter([](auto self, auto value) { \
193 _Set_##field(*self, value); \
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; \
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; \
220#define _SW_EXPR_PROPERTY_VALUETYPE(propname, expr) \
221 typename _ExprPropertyValueTypeHelper_##propname<decltype(expr)>::type
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 \
234 return (self.expr).Get(); \
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 \
240 return (self.expr); \
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 \
254 (self.expr).Set(std::forward<U>(value)); \
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 \
260 (self.expr) = std::forward<U>(value); \
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 \
277 sw::Property<_SW_EXPR_PROPERTY_VALUETYPE(name, expr)>::Init(this) \
278 .Getter([](auto self) { \
279 return _Get_##name(*self); \
281 .Setter([](auto self, auto value) { \
282 _Set_##name(*self, value); \
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 \
297 sw::Property<_SW_EXPR_PROPERTY_VALUETYPE(name, expr)>::Init(this) \
298 .Getter([](auto self) { \
299 return _Get_##name(*self); \
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 \
314 sw::Property<_SW_EXPR_PROPERTY_VALUETYPE(name, expr)>::Init(this) \
315 .Setter([](auto self, auto value) { \
316 _Set_##name(*self, value); \
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 \
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); \
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 \
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); \
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 \
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); \
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 \
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); \
388 sw::Property<_SW_EXPR_PROPERTY_VALUETYPE(name, expr)> name \
390 sw::Property<_SW_EXPR_PROPERTY_VALUETYPE(name, expr)>::Init(this) \
391 .Getter([](auto self) { \
392 return _Get_##name(*self); \
394 .Setter([](auto self, auto value) { \
395 _Set_##name(*self, value); \