SimpleWindow
载入中...
搜索中...
未找到
Property.h
1#pragma once
2
3#include "Internal.h"
4#include <cassert>
5#include <cstddef>
6#include <cstdint>
7#include <limits>
8#include <type_traits>
9#include <utility>
10
11#define _SW_DEFINE_OPERATION_HELPER(NAME, OP) \
12 template <typename T, typename U, typename = void> \
13 struct NAME : std::false_type { \
14 }; \
15 template <typename T, typename U> \
16 struct NAME<T, U, decltype(void(std::declval<T>() OP std::declval<U>()))> : std::true_type { \
17 using type = decltype(std::declval<T>() OP std::declval<U>()); \
18 }
19
20#define _SW_DEFINE_UNARY_OPERATION_HELPER(NAME, OP) \
21 template <typename T, typename = void> \
22 struct NAME : std::false_type { \
23 }; \
24 template <typename T> \
25 struct NAME<T, decltype(void(OP std::declval<T>()))> : std::true_type { \
26 using type = decltype(OP std::declval<T>()); \
27 }
28
29namespace sw
30{
35 template <typename T, typename TDerived>
36 class PropertyBase;
37
38 template <typename T>
39 class Property;
40
41 template <typename T>
42 class ReadOnlyProperty;
43
44 template <typename T>
45 class WriteOnlyProperty;
46
47 /*================================================================================*/
48
49 // SFINAE templates
50 _SW_DEFINE_OPERATION_HELPER(_AddOperationHelper, +);
51 _SW_DEFINE_OPERATION_HELPER(_SubOperationHelper, -);
52 _SW_DEFINE_OPERATION_HELPER(_MulOperationHelper, *);
53 _SW_DEFINE_OPERATION_HELPER(_DivOperationHelper, /);
54 _SW_DEFINE_OPERATION_HELPER(_ModOperationHelper, %);
55 _SW_DEFINE_OPERATION_HELPER(_EqOperationHelper, ==);
56 _SW_DEFINE_OPERATION_HELPER(_NeOperationHelper, !=);
57 _SW_DEFINE_OPERATION_HELPER(_LtOperationHelper, <);
58 _SW_DEFINE_OPERATION_HELPER(_LeOperationHelper, <=);
59 _SW_DEFINE_OPERATION_HELPER(_GtOperationHelper, >);
60 _SW_DEFINE_OPERATION_HELPER(_GeOperationHelper, >=);
61 _SW_DEFINE_OPERATION_HELPER(_BitAndOperationHelper, &);
62 _SW_DEFINE_OPERATION_HELPER(_BitOrOperationHelper, |);
63 _SW_DEFINE_OPERATION_HELPER(_BitXorOperationHelper, ^);
64 _SW_DEFINE_OPERATION_HELPER(_ShlOperationHelper, <<);
65 _SW_DEFINE_OPERATION_HELPER(_ShrOperationHelper, >>);
66 _SW_DEFINE_OPERATION_HELPER(_LogicAndOperationHelper, &&);
67 _SW_DEFINE_OPERATION_HELPER(_LogicOrOperationHelper, ||);
68 _SW_DEFINE_UNARY_OPERATION_HELPER(_LogicNotOperationHelper, !);
69 _SW_DEFINE_UNARY_OPERATION_HELPER(_BitNotOperationHelper, ~);
70 _SW_DEFINE_UNARY_OPERATION_HELPER(_DerefOperationHelper, *);
71 // _SW_DEFINE_UNARY_OPERATION_HELPER(_AddrOperationHelper, &);
72 _SW_DEFINE_UNARY_OPERATION_HELPER(_UnaryPlusOperationHelper, +);
73 _SW_DEFINE_UNARY_OPERATION_HELPER(_UnaryMinusOperationHelper, -);
74 // _SW_DEFINE_UNARY_OPERATION_HELPER(_PreIncOperationHelper, ++);
75 // _SW_DEFINE_UNARY_OPERATION_HELPER(_PreDecOperationHelper, --);
76
80 template <typename T>
82 private:
83 template <typename U, typename V>
84 static std::true_type test(const PropertyBase<U, V> *);
85 static std::false_type test(...);
86
87 public:
88 using type = decltype(test(std::declval<T *>()));
89 };
90
94 template <typename T>
95 struct _IsProperty : _IsPropertyImpl<typename std::decay<T>::type>::type {
96 };
97
101 template <typename, typename = void>
102 struct _HasGetterImpl : std::false_type {
103 };
104
108 template <typename T>
110 T, decltype(void(&T::GetterImpl))> : std::true_type {
111 };
112
116 template <typename, typename = void>
117 struct _HasSetterImpl : std::false_type {
118 };
119
123 template <typename T>
125 T, decltype(void(&T::SetterImpl))> : std::true_type {
126 };
127
131 template <typename T>
133 : std::integral_constant<bool, _IsProperty<T>::value && _HasGetterImpl<T>::value> {
134 };
135
139 template <typename T>
141 : std::integral_constant<bool, _IsProperty<T>::value && _HasSetterImpl<T>::value> {
142 };
143
147 template <typename T, typename U, typename = void>
148 struct _BracketOperationHelper : std::false_type {
149 };
150
154 template <typename T, typename U>
156 T, U, decltype(void(std::declval<T>()[std::declval<U>()]))> : std::true_type {
157 using type = decltype(std::declval<T>()[std::declval<U>()]);
158 };
159
163 template <typename T, typename = void>
164 struct _HasArrowOperator : std::false_type {
165 };
166
170 template <typename T>
172 T, decltype(void(std::declval<T>().operator->()))> : std::true_type {
173 using type = decltype(std::declval<T>().operator->());
174 };
175
179 template <typename T>
181
182 /*================================================================================*/
183
187 template <typename T>
193
197 template <typename... Args>
199 : value(std::forward<Args>(args)...)
200 {
201 }
202
206 template <typename U = T>
208 -> typename std::enable_if<std::is_pointer<U>::value, U>::type
209 {
210 return this->value;
211 }
212
216 template <typename U = T>
218 -> typename std::enable_if<!std::is_pointer<U>::value && !_HasArrowOperator<U>::value, U *>::type
219 {
220 return &this->value;
221 }
222
226 template <typename U = T>
228 -> typename std::enable_if<!std::is_pointer<U>::value && _HasArrowOperator<U>::value, typename _HasArrowOperator<U>::type>::type
229 {
230 return this->value.operator->();
231 }
232 };
233
237 template <typename TOwner, typename TValue>
239 {
240 friend class Property<TValue>;
241 friend class ReadOnlyProperty<TValue>;
242 friend class WriteOnlyProperty<TValue>;
243
244 private:
248 TOwner *_owner;
249
253 TValue (*_getter)(TOwner *);
254
259
260 public:
265 : _owner(owner), _getter(nullptr), _setter(nullptr)
266 {
267 }
268
273 {
274 this->_getter = getter;
275 return *this;
276 }
277
282 {
283 this->_setter = setter;
284 return *this;
285 }
286
290 template <TValue (TOwner::*getter)()>
292 {
293 return this->Getter(
294 [](TOwner *owner) -> TValue {
295 return (owner->*getter)();
296 });
297 }
298
302 template <TValue (TOwner::*getter)() const>
304 {
305 return this->Getter(
306 [](TOwner *owner) -> TValue {
307 return (owner->*getter)();
308 });
309 }
310
314 template <void (TOwner::*setter)(_PropertySetterParamType<TValue>)>
316 {
317 return this->Setter(
319 (owner->*setter)(value);
320 });
321 }
322
326 template <void (TOwner::*setter)(_PropertySetterParamType<TValue>) const>
328 {
329 return this->Setter(
331 (owner->*setter)(value);
332 });
333 }
334
338 template <TValue TOwner::*field>
340 {
341 return this->Getter(
342 [](TOwner *owner) -> TValue {
343 return owner->*field;
344 });
345 }
346
350 template <TValue TOwner::*field>
352 {
353 return this->Setter(
355 owner->*field = value;
356 });
357 }
358 };
359
363 template <typename TValue>
365 {
366 friend class Property<TValue>;
367 friend class ReadOnlyProperty<TValue>;
368 friend class WriteOnlyProperty<TValue>;
369
370 private:
374 TValue (*_getter)();
375
380
381 public:
386 : _getter(nullptr), _setter(nullptr)
387 {
388 }
389
394 {
395 this->_getter = getter;
396 return *this;
397 }
398
403 {
404 this->_setter = setter;
405 return *this;
406 }
407 };
408
409 /*================================================================================*/
410
414 template <typename T, typename TDerived>
416 {
417 public:
418 // 属性值类型别名
419 using TValue = T;
420
421 // setter参数类型别名
423
424 // /**
425 // * @brief 获取属性值,由子类实现
426 // */
427 // T GetterImpl() const;
428
429 // /**
430 // * @brief 设置属性值,由子类实现
431 // */
432 // void SetterImpl(TSetterParam value) const;
433
438 {
439 return FieldsAccessor<T>(this->Get());
440 }
441
445 T Get() const
446 {
447 return static_cast<const TDerived *>(this)->GetterImpl();
448 }
449
453 void Set(TSetterParam value) const
454 {
455 static_cast<const TDerived *>(this)->SetterImpl(value);
456 }
457
461 auto operator->() const
462 {
463 return static_cast<const TDerived *>(this)->AccessFields();
464 }
465
469 operator T() const
470 {
471 return this->Get();
472 }
473
477 template <
478 typename U = T,
479 typename = typename std::enable_if<!std::is_arithmetic<T>::value && std::is_convertible<T, U>::value, U>::type>
480 operator U() const
481 {
482 return static_cast<U>(this->Get());
483 }
484
488 template <
489 typename U = T,
490 typename = typename std::enable_if<!std::is_arithmetic<T>::value && !std::is_convertible<T, U>::value, U>::type,
491 typename = typename std::enable_if<!std::is_arithmetic<T>::value && _IsExplicitlyConvertable<T, U>::value, U>::type>
492 explicit operator U() const
493 {
494 return static_cast<U>(this->Get());
495 }
496
501 {
502 this->Set(value);
503 return *static_cast<TDerived *>(this);
504 }
505
509 const TDerived &operator=(TSetterParam value) const
510 {
511 this->Set(value);
512 return *static_cast<const TDerived *>(this);
513 }
514
519 {
520 this->Set(prop.Get());
521 return *static_cast<TDerived *>(this);
522 }
523
527 const TDerived &operator=(const PropertyBase &prop) const
528 {
529 this->Set(prop.Get());
530 return *static_cast<const TDerived *>(this);
531 }
532
536 template <typename U>
537 auto operator+=(U &&value)
538 -> typename std::enable_if<_AddOperationHelper<T, U>::value, TDerived &>::type
539 {
540 this->Set(this->Get() + std::forward<U>(value));
541 return *static_cast<TDerived *>(this);
542 }
543
547 template <typename U>
548 auto operator+=(U &&value) const
549 -> typename std::enable_if<_AddOperationHelper<T, U>::value, const TDerived &>::type
550 {
551 this->Set(this->Get() + std::forward<U>(value));
552 return *static_cast<const TDerived *>(this);
553 }
554
558 template <typename D, typename U>
560 -> typename std::enable_if<_AddOperationHelper<T, U>::value, TDerived &>::type
561 {
562 this->Set(this->Get() + prop.Get());
563 return *static_cast<TDerived *>(this);
564 }
565
569 template <typename D, typename U>
571 -> typename std::enable_if<_AddOperationHelper<T, U>::value, const TDerived &>::type
572 {
573 this->Set(this->Get() + prop.Get());
574 return *static_cast<const TDerived *>(this);
575 }
576
580 template <typename U>
581 auto operator-=(U &&value)
582 -> typename std::enable_if<_SubOperationHelper<T, U>::value, TDerived &>::type
583 {
584 this->Set(this->Get() - std::forward<U>(value));
585 return *static_cast<TDerived *>(this);
586 }
587
591 template <typename U>
592 auto operator-=(U &&value) const
593 -> typename std::enable_if<_SubOperationHelper<T, U>::value, const TDerived &>::type
594 {
595 this->Set(this->Get() - std::forward<U>(value));
596 return *static_cast<const TDerived *>(this);
597 }
598
602 template <typename D, typename U>
604 -> typename std::enable_if<_SubOperationHelper<T, U>::value, TDerived &>::type
605 {
606 this->Set(this->Get() - prop.Get());
607 return *static_cast<TDerived *>(this);
608 }
609
613 template <typename D, typename U>
615 -> typename std::enable_if<_SubOperationHelper<T, U>::value, const TDerived &>::type
616 {
617 this->Set(this->Get() - prop.Get());
618 return *static_cast<const TDerived *>(this);
619 }
620
624 template <typename U>
625 auto operator*=(U &&value)
626 -> typename std::enable_if<_MulOperationHelper<T, U>::value, TDerived &>::type
627 {
628 this->Set(this->Get() * std::forward<U>(value));
629 return *static_cast<TDerived *>(this);
630 }
631
635 template <typename U>
636 auto operator*=(U &&value) const
637 -> typename std::enable_if<_MulOperationHelper<T, U>::value, const TDerived &>::type
638 {
639 this->Set(this->Get() * std::forward<U>(value));
640 return *static_cast<const TDerived *>(this);
641 }
642
646 template <typename D, typename U>
648 -> typename std::enable_if<_MulOperationHelper<T, U>::value, TDerived &>::type
649 {
650 this->Set(this->Get() * prop.Get());
651 return *static_cast<TDerived *>(this);
652 }
653
657 template <typename D, typename U>
659 -> typename std::enable_if<_MulOperationHelper<T, U>::value, const TDerived &>::type
660 {
661 this->Set(this->Get() * prop.Get());
662 return *static_cast<const TDerived *>(this);
663 }
664
668 template <typename U>
669 auto operator/=(U &&value)
670 -> typename std::enable_if<_DivOperationHelper<T, U>::value, TDerived &>::type
671 {
672 this->Set(this->Get() / std::forward<U>(value));
673 return *static_cast<TDerived *>(this);
674 }
675
679 template <typename U>
680 auto operator/=(U &&value) const
681 -> typename std::enable_if<_DivOperationHelper<T, U>::value, const TDerived &>::type
682 {
683 this->Set(this->Get() / std::forward<U>(value));
684 return *static_cast<const TDerived *>(this);
685 }
686
690 template <typename D, typename U>
692 -> typename std::enable_if<_DivOperationHelper<T, U>::value, TDerived &>::type
693 {
694 this->Set(this->Get() / prop.Get());
695 return *static_cast<TDerived *>(this);
696 }
697
701 template <typename D, typename U>
703 -> typename std::enable_if<_DivOperationHelper<T, U>::value, const TDerived &>::type
704 {
705 this->Set(this->Get() / prop.Get());
706 return *static_cast<const TDerived *>(this);
707 }
708
712 template <typename U = T>
714 -> typename std::enable_if<_AddOperationHelper<U, int>::value, TDerived &>::type
715 {
716 this->Set(this->Get() + 1);
717 return *static_cast<TDerived *>(this);
718 }
719
723 template <typename U = T>
725 -> typename std::enable_if<_AddOperationHelper<U, int>::value, const TDerived &>::type
726 {
727 this->Set(this->Get() + 1);
728 return *static_cast<const TDerived *>(this);
729 }
730
734 template <typename U = T>
736 -> typename std::enable_if<_SubOperationHelper<U, int>::value, TDerived &>::type
737 {
738 this->Set(this->Get() - 1);
739 return *static_cast<TDerived *>(this);
740 }
741
745 template <typename U = T>
747 -> typename std::enable_if<_SubOperationHelper<U, int>::value, const TDerived &>::type
748 {
749 this->Set(this->Get() - 1);
750 return *static_cast<const TDerived *>(this);
751 }
752
756 template <typename U = T>
757 auto operator++(int) const
758 -> typename std::enable_if<_AddOperationHelper<U, int>::value, T>::type
759 {
760 T oldval = this->Get();
761 this->Set(oldval + 1);
762 return oldval;
763 }
764
768 template <typename U = T>
769 auto operator--(int) const
770 -> typename std::enable_if<_SubOperationHelper<U, int>::value, T>::type
771 {
772 T oldval = this->Get();
773 this->Set(oldval - 1);
774 return oldval;
775 }
776
780 template <typename U>
781 auto operator&=(U &&value)
782 -> typename std::enable_if<_BitAndOperationHelper<T, U>::value, TDerived &>::type
783 {
784 this->Set(this->Get() & std::forward<U>(value));
785 return *static_cast<TDerived *>(this);
786 }
787
791 template <typename U>
792 auto operator&=(U &&value) const
793 -> typename std::enable_if<_BitAndOperationHelper<T, U>::value, const TDerived &>::type
794 {
795 this->Set(this->Get() & std::forward<U>(value));
796 return *static_cast<const TDerived *>(this);
797 }
798
802 template <typename D, typename U>
804 -> typename std::enable_if<_BitAndOperationHelper<T, U>::value, TDerived &>::type
805 {
806 this->Set(this->Get() & prop.Get());
807 return *static_cast<TDerived *>(this);
808 }
809
813 template <typename D, typename U>
815 -> typename std::enable_if<_BitAndOperationHelper<T, U>::value, const TDerived &>::type
816 {
817 this->Set(this->Get() & prop.Get());
818 return *static_cast<const TDerived *>(this);
819 }
820
824 template <typename U>
825 auto operator|=(U &&value)
826 -> typename std::enable_if<_BitOrOperationHelper<T, U>::value, TDerived &>::type
827 {
828 this->Set(this->Get() | std::forward<U>(value));
829 return *static_cast<TDerived *>(this);
830 }
831
835 template <typename U>
836 auto operator|=(U &&value) const
837 -> typename std::enable_if<_BitOrOperationHelper<T, U>::value, const TDerived &>::type
838 {
839 this->Set(this->Get() | std::forward<U>(value));
840 return *static_cast<const TDerived *>(this);
841 }
842
846 template <typename D, typename U>
848 -> typename std::enable_if<_BitOrOperationHelper<T, U>::value, TDerived &>::type
849 {
850 this->Set(this->Get() | prop.Get());
851 return *static_cast<TDerived *>(this);
852 }
853
857 template <typename D, typename U>
859 -> typename std::enable_if<_BitOrOperationHelper<T, U>::value, const TDerived &>::type
860 {
861 this->Set(this->Get() | prop.Get());
862 return *static_cast<const TDerived *>(this);
863 }
864
868 template <typename U>
869 auto operator^=(U &&value)
870 -> typename std::enable_if<_BitXorOperationHelper<T, U>::value, TDerived &>::type
871 {
872 this->Set(this->Get() ^ std::forward<U>(value));
873 return *static_cast<TDerived *>(this);
874 }
875
879 template <typename U>
880 auto operator^=(U &&value) const
881 -> typename std::enable_if<_BitXorOperationHelper<T, U>::value, const TDerived &>::type
882 {
883 this->Set(this->Get() ^ std::forward<U>(value));
884 return *static_cast<const TDerived *>(this);
885 }
886
890 template <typename D, typename U>
892 -> typename std::enable_if<_BitXorOperationHelper<T, U>::value, TDerived &>::type
893 {
894 this->Set(this->Get() ^ prop.Get());
895 return *static_cast<TDerived *>(this);
896 }
897
901 template <typename D, typename U>
903 -> typename std::enable_if<_BitXorOperationHelper<T, U>::value, const TDerived &>::type
904 {
905 this->Set(this->Get() ^ prop.Get());
906 return *static_cast<const TDerived *>(this);
907 }
908
912 template <typename U>
913 auto operator<<=(U &&value)
914 -> typename std::enable_if<_ShlOperationHelper<T, U>::value, TDerived &>::type
915 {
916 this->Set(this->Get() << std::forward<U>(value));
917 return *static_cast<TDerived *>(this);
918 }
919
923 template <typename U>
924 auto operator<<=(U &&value) const
925 -> typename std::enable_if<_ShlOperationHelper<T, U>::value, const TDerived &>::type
926 {
927 this->Set(this->Get() << std::forward<U>(value));
928 return *static_cast<const TDerived *>(this);
929 }
930
934 template <typename D, typename U>
936 -> typename std::enable_if<_ShlOperationHelper<T, U>::value, TDerived &>::type
937 {
938 this->Set(this->Get() << prop.Get());
939 return *static_cast<TDerived *>(this);
940 }
941
945 template <typename D, typename U>
947 -> typename std::enable_if<_ShlOperationHelper<T, U>::value, const TDerived &>::type
948 {
949 this->Set(this->Get() << prop.Get());
950 return *static_cast<const TDerived *>(this);
951 }
952
956 template <typename U>
957 auto operator>>=(U &&value)
958 -> typename std::enable_if<_ShrOperationHelper<T, U>::value, TDerived &>::type
959 {
960 this->Set(this->Get() >> std::forward<U>(value));
961 return *static_cast<TDerived *>(this);
962 }
963
967 template <typename U>
968 auto operator>>=(U &&value) const
969 -> typename std::enable_if<_ShrOperationHelper<T, U>::value, const TDerived &>::type
970 {
971 this->Set(this->Get() >> std::forward<U>(value));
972 return *static_cast<const TDerived *>(this);
973 }
974
978 template <typename D, typename U>
980 -> typename std::enable_if<_ShrOperationHelper<T, U>::value, TDerived &>::type
981 {
982 this->Set(this->Get() >> prop.Get());
983 return *static_cast<TDerived *>(this);
984 }
985
989 template <typename D, typename U>
991 -> typename std::enable_if<_ShrOperationHelper<T, U>::value, const TDerived &>::type
992 {
993 this->Set(this->Get() >> prop.Get());
994 return *static_cast<const TDerived *>(this);
995 }
996
1000 template <typename U = T>
1003 {
1004 return !this->Get();
1005 }
1006
1010 template <typename U = T>
1013 {
1014 return ~this->Get();
1015 }
1016
1023 template <typename U = T>
1025 -> typename std::enable_if<
1026 _DerefOperationHelper<U>::value &&
1027 !std::is_reference<typename _DerefOperationHelper<U>::type>::value,
1028 typename _DerefOperationHelper<U>::type>::type
1029 {
1030 return *this->Get();
1031 }
1032
1038 template <typename U = T>
1040 -> typename std::enable_if<
1041 _DerefOperationHelper<U>::value && std::is_pointer<T>::value,
1042 typename _DerefOperationHelper<U>::type>::type
1043 {
1044 return *this->Get();
1045 }
1046
1050 template <typename U = T>
1053 {
1054 return +this->Get();
1055 }
1056
1060 template <typename U = T>
1063 {
1064 return -this->Get();
1065 }
1066
1070 template <typename U>
1071 auto operator+(U &&value) const
1072 -> typename std::enable_if<_AddOperationHelper<T, U>::value, typename _AddOperationHelper<T, U>::type>::type
1073 {
1074 return this->Get() + std::forward<U>(value);
1075 }
1076
1080 template <typename D, typename U>
1082 -> typename std::enable_if<_AddOperationHelper<T, U>::value, typename _AddOperationHelper<T, U>::type>::type
1083 {
1084 return this->Get() + prop.Get();
1085 }
1086
1090 template <typename U>
1091 auto operator-(U &&value) const
1092 -> typename std::enable_if<_SubOperationHelper<T, U>::value, typename _SubOperationHelper<T, U>::type>::type
1093 {
1094 return this->Get() - std::forward<U>(value);
1095 }
1096
1100 template <typename D, typename U>
1102 -> typename std::enable_if<_SubOperationHelper<T, U>::value, typename _SubOperationHelper<T, U>::type>::type
1103 {
1104 return this->Get() - prop.Get();
1105 }
1106
1110 template <typename U>
1111 auto operator*(U &&value) const
1112 -> typename std::enable_if<_MulOperationHelper<T, U>::value, typename _MulOperationHelper<T, U>::type>::type
1113 {
1114 return this->Get() * std::forward<U>(value);
1115 }
1116
1120 template <typename D, typename U>
1122 -> typename std::enable_if<_MulOperationHelper<T, U>::value, typename _MulOperationHelper<T, U>::type>::type
1123 {
1124 return this->Get() * prop.Get();
1125 }
1126
1130 template <typename U>
1131 auto operator/(U &&value) const
1132 -> typename std::enable_if<_DivOperationHelper<T, U>::value, typename _DivOperationHelper<T, U>::type>::type
1133 {
1134 return this->Get() / std::forward<U>(value);
1135 }
1136
1140 template <typename D, typename U>
1142 -> typename std::enable_if<_DivOperationHelper<T, U>::value, typename _DivOperationHelper<T, U>::type>::type
1143 {
1144 return this->Get() / prop.Get();
1145 }
1146
1150 template <typename U>
1151 auto operator%(U &&value) const
1152 -> typename std::enable_if<_ModOperationHelper<T, U>::value, typename _ModOperationHelper<T, U>::type>::type
1153 {
1154 return this->Get() % std::forward<U>(value);
1155 }
1156
1160 template <typename D, typename U>
1162 -> typename std::enable_if<_ModOperationHelper<T, U>::value, typename _ModOperationHelper<T, U>::type>::type
1163 {
1164 return this->Get() % prop.Get();
1165 }
1166
1170 template <typename U>
1171 auto operator==(U &&value) const
1172 -> typename std::enable_if<_EqOperationHelper<T, U>::value, typename _EqOperationHelper<T, U>::type>::type
1173 {
1174 return this->Get() == std::forward<U>(value);
1175 }
1176
1180 template <typename D, typename U>
1182 -> typename std::enable_if<_EqOperationHelper<T, U>::value, typename _EqOperationHelper<T, U>::type>::type
1183 {
1184 return this->Get() == prop.Get();
1185 }
1186
1191 template <typename U>
1192 auto operator!=(U &&value) const
1193 -> typename std::enable_if<_EqOperationHelper<T, U>::value, typename _EqOperationHelper<T, U>::type>::type
1194 {
1195 return !(*this == std::forward<U>(value));
1196 }
1197
1202 template <typename D, typename U>
1204 -> typename std::enable_if<_EqOperationHelper<T, U>::value, typename _EqOperationHelper<T, U>::type>::type
1205 {
1206 return !(*this == prop);
1207 }
1208
1212 template <typename U>
1213 auto operator<(U &&value) const
1214 -> typename std::enable_if<_LtOperationHelper<T, U>::value, typename _LtOperationHelper<T, U>::type>::type
1215 {
1216 return this->Get() < std::forward<U>(value);
1217 }
1218
1222 template <typename D, typename U>
1224 -> typename std::enable_if<_LtOperationHelper<T, U>::value, typename _LtOperationHelper<T, U>::type>::type
1225 {
1226 return this->Get() < prop.Get();
1227 }
1228
1232 template <typename U>
1233 auto operator<=(U &&value) const
1234 -> typename std::enable_if<_LeOperationHelper<T, U>::value, typename _LeOperationHelper<T, U>::type>::type
1235 {
1236 return this->Get() <= std::forward<U>(value);
1237 }
1238
1242 template <typename D, typename U>
1244 -> typename std::enable_if<_LeOperationHelper<T, U>::value, typename _LeOperationHelper<T, U>::type>::type
1245 {
1246 return this->Get() <= prop.Get();
1247 }
1248
1252 template <typename U>
1253 auto operator>(U &&value) const
1254 -> typename std::enable_if<_GtOperationHelper<T, U>::value, typename _GtOperationHelper<T, U>::type>::type
1255 {
1256 return this->Get() > std::forward<U>(value);
1257 }
1258
1262 template <typename D, typename U>
1264 -> typename std::enable_if<_GtOperationHelper<T, U>::value, typename _GtOperationHelper<T, U>::type>::type
1265 {
1266 return this->Get() > prop.Get();
1267 }
1268
1272 template <typename U>
1273 auto operator>=(U &&value) const
1274 -> typename std::enable_if<_GeOperationHelper<T, U>::value, typename _GeOperationHelper<T, U>::type>::type
1275 {
1276 return this->Get() >= std::forward<U>(value);
1277 }
1278
1282 template <typename D, typename U>
1284 -> typename std::enable_if<_GeOperationHelper<T, U>::value, typename _GeOperationHelper<T, U>::type>::type
1285 {
1286 return this->Get() >= prop.Get();
1287 }
1288
1292 template <typename U>
1293 auto operator&(U &&value) const
1294 -> typename std::enable_if<_BitAndOperationHelper<T, U>::value, typename _BitAndOperationHelper<T, U>::type>::type
1295 {
1296 return this->Get() & std::forward<U>(value);
1297 }
1298
1302 template <typename D, typename U>
1304 -> typename std::enable_if<_BitAndOperationHelper<T, U>::value, typename _BitAndOperationHelper<T, U>::type>::type
1305 {
1306 return this->Get() & prop.Get();
1307 }
1308
1312 template <typename U>
1313 auto operator|(U &&value) const
1314 -> typename std::enable_if<_BitOrOperationHelper<T, U>::value, typename _BitOrOperationHelper<T, U>::type>::type
1315 {
1316 return this->Get() | std::forward<U>(value);
1317 }
1318
1322 template <typename D, typename U>
1324 -> typename std::enable_if<_BitOrOperationHelper<T, U>::value, typename _BitOrOperationHelper<T, U>::type>::type
1325 {
1326 return this->Get() | prop.Get();
1327 }
1328
1332 template <typename U>
1333 auto operator^(U &&value) const
1334 -> typename std::enable_if<_BitXorOperationHelper<T, U>::value, typename _BitXorOperationHelper<T, U>::type>::type
1335 {
1336 return this->Get() ^ std::forward<U>(value);
1337 }
1338
1342 template <typename D, typename U>
1344 -> typename std::enable_if<_BitXorOperationHelper<T, U>::value, typename _BitXorOperationHelper<T, U>::type>::type
1345 {
1346 return this->Get() ^ prop.Get();
1347 }
1348
1352 template <typename U>
1353 auto operator<<(U &&value) const
1354 -> typename std::enable_if<_ShlOperationHelper<T, U>::value, typename _ShlOperationHelper<T, U>::type>::type
1355 {
1356 return this->Get() << std::forward<U>(value);
1357 }
1358
1362 template <typename D, typename U>
1364 -> typename std::enable_if<_ShlOperationHelper<T, U>::value, typename _ShlOperationHelper<T, U>::type>::type
1365 {
1366 return this->Get() << prop.Get();
1367 }
1368
1372 template <typename U>
1373 auto operator>>(U &&value) const
1374 -> typename std::enable_if<_ShrOperationHelper<T, U>::value, typename _ShrOperationHelper<T, U>::type>::type
1375 {
1376 return this->Get() >> std::forward<U>(value);
1377 }
1378
1382 template <typename D, typename U>
1384 -> typename std::enable_if<_ShrOperationHelper<T, U>::value, typename _ShrOperationHelper<T, U>::type>::type
1385 {
1386 return this->Get() >> prop.Get();
1387 }
1388
1392 template <typename U>
1393 auto operator&&(U &&value) const
1394 -> typename std::enable_if<_LogicAndOperationHelper<T, U>::value, typename _LogicAndOperationHelper<T, U>::type>::type
1395 {
1396 return this->Get() && std::forward<U>(value);
1397 }
1398
1402 template <typename D, typename U>
1404 -> typename std::enable_if<_LogicAndOperationHelper<T, U>::value, typename _LogicAndOperationHelper<T, U>::type>::type
1405 {
1406 return this->Get() && prop.Get();
1407 }
1408
1412 template <typename U>
1413 auto operator||(U &&value) const
1414 -> typename std::enable_if<_LogicOrOperationHelper<T, U>::value, typename _LogicOrOperationHelper<T, U>::type>::type
1415 {
1416 return this->Get() || std::forward<U>(value);
1417 }
1418
1422 template <typename D, typename U>
1424 -> typename std::enable_if<_LogicOrOperationHelper<T, U>::value, typename _LogicOrOperationHelper<T, U>::type>::type
1425 {
1426 return this->Get() || prop.Get();
1427 }
1428
1435 template <typename U>
1436 auto operator[](U &&value) const
1437 -> typename std::enable_if<
1439 !std::is_reference<typename _BracketOperationHelper<T, U>::type>::value,
1441 {
1442 return this->Get()[std::forward<U>(value)];
1443 }
1444
1451 template <typename D, typename U>
1453 -> typename std::enable_if<
1455 !std::is_reference<typename _BracketOperationHelper<T, U>::type>::value,
1457 {
1458 return this->Get()[prop.Get()];
1459 }
1460
1466 template <typename U>
1467 auto operator[](U &&value) const
1468 -> typename std::enable_if<
1469 _BracketOperationHelper<T, U>::value && std::is_pointer<T>::value,
1471 {
1472 return this->Get()[std::forward<U>(value)];
1473 }
1474
1480 template <typename D, typename U>
1482 -> typename std::enable_if<
1483 _BracketOperationHelper<T, U>::value && std::is_pointer<T>::value,
1485 {
1486 return this->Get()[prop.Get()];
1487 }
1488
1489 protected:
1495 using TFuncPtr = void (*)();
1496
1500 static constexpr std::ptrdiff_t _STATICOFFSET =
1501 (std::numeric_limits<std::ptrdiff_t>::max)();
1502
1506 std::ptrdiff_t _offset{_STATICOFFSET};
1507
1512 {
1513 return _offset == _STATICOFFSET;
1514 }
1515
1519 void SetOwner(void *owner) noexcept
1520 {
1521 if (owner == nullptr) {
1523 } else {
1524 _offset = reinterpret_cast<uint8_t *>(owner) - reinterpret_cast<uint8_t *>(this);
1525 }
1526 }
1527
1532 {
1533 if (this->IsStatic()) {
1534 return nullptr;
1535 } else {
1536 return const_cast<uint8_t *>(reinterpret_cast<const uint8_t *>(this)) + _offset;
1537 }
1538 }
1539
1540 public:
1544 template <typename TOwner>
1550
1554 static auto Init()
1556 {
1558 }
1559 };
1560
1561 /*================================================================================*/
1562
1566 template <typename D, typename T, typename U>
1567 auto operator+(T &&left, const PropertyBase<U, D> &right)
1568 -> typename std::enable_if<!_IsProperty<T>::value && _AddOperationHelper<T, U>::value, typename _AddOperationHelper<T, U>::type>::type
1569 {
1570 return std::forward<T>(left) + right.Get();
1571 }
1572
1576 template <typename D, typename T, typename U>
1577 auto operator-(T &&left, const PropertyBase<U, D> &right)
1578 -> typename std::enable_if<!_IsProperty<T>::value && _SubOperationHelper<T, U>::value, typename _SubOperationHelper<T, U>::type>::type
1579 {
1580 return std::forward<T>(left) - right.Get();
1581 }
1582
1586 template <typename D, typename T, typename U>
1587 auto operator*(T &&left, const PropertyBase<U, D> &right)
1588 -> typename std::enable_if<!_IsProperty<T>::value && _MulOperationHelper<T, U>::value, typename _MulOperationHelper<T, U>::type>::type
1589 {
1590 return std::forward<T>(left) * right.Get();
1591 }
1592
1596 template <typename D, typename T, typename U>
1597 auto operator/(T &&left, const PropertyBase<U, D> &right)
1598 -> typename std::enable_if<!_IsProperty<T>::value && _DivOperationHelper<T, U>::value, typename _DivOperationHelper<T, U>::type>::type
1599 {
1600 return std::forward<T>(left) / right.Get();
1601 }
1602
1606 template <typename D, typename T, typename U>
1607 auto operator%(T &&left, const PropertyBase<U, D> &right)
1608 -> typename std::enable_if<!_IsProperty<T>::value && _ModOperationHelper<T, U>::value, typename _ModOperationHelper<T, U>::type>::type
1609 {
1610 return std::forward<T>(left) % right.Get();
1611 }
1612
1616 template <typename D, typename T, typename U>
1617 auto operator==(T &&left, const PropertyBase<U, D> &right)
1618 -> typename std::enable_if<!_IsProperty<T>::value && _EqOperationHelper<T, U>::value, typename _EqOperationHelper<T, U>::type>::type
1619 {
1620 return std::forward<T>(left) == right.Get();
1621 }
1622
1627 template <typename D, typename T, typename U>
1628 auto operator!=(T &&left, const PropertyBase<U, D> &right)
1629 -> typename std::enable_if<!_IsProperty<T>::value && _EqOperationHelper<T, U>::value, typename _EqOperationHelper<T, U>::type>::type
1630 {
1631 return !(std::forward<T>(left) == right);
1632 }
1633
1637 template <typename D, typename T, typename U>
1638 auto operator<(T &&left, const PropertyBase<U, D> &right)
1639 -> typename std::enable_if<!_IsProperty<T>::value && _LtOperationHelper<T, U>::value, typename _LtOperationHelper<T, U>::type>::type
1640 {
1641 return std::forward<T>(left) < right.Get();
1642 }
1643
1647 template <typename D, typename T, typename U>
1648 auto operator<=(T &&left, const PropertyBase<U, D> &right)
1649 -> typename std::enable_if<!_IsProperty<T>::value && _LeOperationHelper<T, U>::value, typename _LeOperationHelper<T, U>::type>::type
1650 {
1651 return std::forward<T>(left) <= right.Get();
1652 }
1653
1657 template <typename D, typename T, typename U>
1658 auto operator>(T &&left, const PropertyBase<U, D> &right)
1659 -> typename std::enable_if<!_IsProperty<T>::value && _GtOperationHelper<T, U>::value, typename _GtOperationHelper<T, U>::type>::type
1660 {
1661 return std::forward<T>(left) > right.Get();
1662 }
1663
1667 template <typename D, typename T, typename U>
1668 auto operator>=(T &&left, const PropertyBase<U, D> &right)
1669 -> typename std::enable_if<!_IsProperty<T>::value && _GeOperationHelper<T, U>::value, typename _GeOperationHelper<T, U>::type>::type
1670 {
1671 return std::forward<T>(left) >= right.Get();
1672 }
1673
1677 template <typename D, typename T, typename U>
1678 auto operator&(T &&left, const PropertyBase<U, D> &right)
1679 -> typename std::enable_if<!_IsProperty<T>::value && _BitAndOperationHelper<T, U>::value, typename _BitAndOperationHelper<T, U>::type>::type
1680 {
1681 return std::forward<T>(left) & right.Get();
1682 }
1683
1687 template <typename D, typename T, typename U>
1688 auto operator|(T &&left, const PropertyBase<U, D> &right)
1689 -> typename std::enable_if<!_IsProperty<T>::value && _BitOrOperationHelper<T, U>::value, typename _BitOrOperationHelper<T, U>::type>::type
1690 {
1691 return std::forward<T>(left) | right.Get();
1692 }
1693
1697 template <typename D, typename T, typename U>
1698 auto operator^(T &&left, const PropertyBase<U, D> &right)
1699 -> typename std::enable_if<!_IsProperty<T>::value && _BitXorOperationHelper<T, U>::value, typename _BitXorOperationHelper<T, U>::type>::type
1700 {
1701 return std::forward<T>(left) ^ right.Get();
1702 }
1703
1707 template <typename D, typename T, typename U>
1708 auto operator<<(T &&left, const PropertyBase<U, D> &right)
1709 -> typename std::enable_if<!_IsProperty<T>::value && _ShlOperationHelper<T, U>::value, typename _ShlOperationHelper<T, U>::type>::type
1710 {
1711 return std::forward<T>(left) << right.Get();
1712 }
1713
1717 template <typename D, typename T, typename U>
1718 auto operator>>(T &&left, const PropertyBase<U, D> &right)
1719 -> typename std::enable_if<!_IsProperty<T>::value && _ShrOperationHelper<T, U>::value, typename _ShrOperationHelper<T, U>::type>::type
1720 {
1721 return std::forward<T>(left) >> right.Get();
1722 }
1723
1727 template <typename D, typename T, typename U>
1728 auto operator&&(T &&left, const PropertyBase<U, D> &right)
1729 -> typename std::enable_if<!_IsProperty<T>::value && _LogicAndOperationHelper<T, U>::value, typename _LogicAndOperationHelper<T, U>::type>::type
1730 {
1731 return std::forward<T>(left) && right.Get();
1732 }
1733
1737 template <typename D, typename T, typename U>
1738 auto operator||(T &&left, const PropertyBase<U, D> &right)
1739 -> typename std::enable_if<!_IsProperty<T>::value && _LogicOrOperationHelper<T, U>::value, typename _LogicOrOperationHelper<T, U>::type>::type
1740 {
1741 return std::forward<T>(left) || right.Get();
1742 }
1743
1744 /*================================================================================*/
1745
1749 template <typename T>
1750 class Property : public PropertyBase<T, Property<T>>
1751 {
1752 public:
1754 using TValue = typename TBase::TValue;
1755 using TSetterParam = typename TBase::TSetterParam;
1756 using TFuncPtr = typename TBase::TFuncPtr;
1757 using TGetter = T (*)(void *);
1758 using TSetter = void (*)(void *, TSetterParam);
1759 using TStaticGetter = T (*)();
1760 using TStaticSetter = void (*)(TSetterParam);
1761
1762 private:
1766 TFuncPtr _getter;
1767
1771 TFuncPtr _setter;
1772
1773 public:
1777 using TBase::operator=;
1778
1782 template <typename TOwner>
1784 {
1785 assert(initializer._owner != nullptr);
1786 assert(initializer._getter != nullptr);
1787 assert(initializer._setter != nullptr);
1788
1789 this->SetOwner(initializer._owner);
1790 this->_getter = reinterpret_cast<TFuncPtr>(initializer._getter);
1791 this->_setter = reinterpret_cast<TFuncPtr>(initializer._setter);
1792 }
1793
1798 {
1799 assert(initializer._getter != nullptr);
1800 assert(initializer._setter != nullptr);
1801
1802 this->SetOwner(nullptr);
1803 this->_getter = reinterpret_cast<TFuncPtr>(initializer._getter);
1804 this->_setter = reinterpret_cast<TFuncPtr>(initializer._setter);
1805 }
1806
1811 {
1812 if (this->IsStatic()) {
1813 return reinterpret_cast<TStaticGetter>(this->_getter)();
1814 } else {
1815 return reinterpret_cast<TGetter>(this->_getter)(this->GetOwner());
1816 }
1817 }
1818
1822 void SetterImpl(TSetterParam value) const
1823 {
1824 if (this->IsStatic()) {
1825 reinterpret_cast<TStaticSetter>(this->_setter)(value);
1826 } else {
1827 reinterpret_cast<TSetter>(this->_setter)(this->GetOwner(), value);
1828 }
1829 }
1830 };
1831
1835 template <typename T>
1836 class ReadOnlyProperty : public PropertyBase<T, ReadOnlyProperty<T>>
1837 {
1838 public:
1840 using TValue = typename TBase::TValue;
1841 using TSetterParam = typename TBase::TSetterParam;
1842 using TFuncPtr = typename TBase::TFuncPtr;
1843 using TGetter = T (*)(void *);
1844 using TStaticGetter = T (*)();
1845
1846 private:
1850 TFuncPtr _getter;
1851
1852 public:
1856 template <typename TOwner>
1858 {
1859 assert(initializer._owner != nullptr);
1860 assert(initializer._getter != nullptr);
1861
1862 this->SetOwner(initializer._owner);
1863 this->_getter = reinterpret_cast<TFuncPtr>(initializer._getter);
1864 }
1865
1870 {
1871 assert(initializer._getter != nullptr);
1872
1873 this->SetOwner(nullptr);
1874 this->_getter = reinterpret_cast<TFuncPtr>(initializer._getter);
1875 }
1876
1881 {
1882 if (this->IsStatic()) {
1883 return reinterpret_cast<TStaticGetter>(this->_getter)();
1884 } else {
1885 return reinterpret_cast<TGetter>(this->_getter)(this->GetOwner());
1886 }
1887 }
1888 };
1889
1893 template <typename T>
1894 class WriteOnlyProperty : public PropertyBase<T, WriteOnlyProperty<T>>
1895 {
1896 public:
1898 using TValue = typename TBase::TValue;
1899 using TSetterParam = typename TBase::TSetterParam;
1900 using TFuncPtr = typename TBase::TFuncPtr;
1901 using TSetter = void (*)(void *, TSetterParam);
1902 using TStaticSetter = void (*)(TSetterParam);
1903
1904 private:
1908 TFuncPtr _setter;
1909
1910 public:
1914 using TBase::operator=;
1915
1919 template <typename TOwner>
1921 {
1922 assert(initializer._owner != nullptr);
1923 assert(initializer._setter != nullptr);
1924
1925 this->SetOwner(initializer._owner);
1926 this->_setter = reinterpret_cast<TFuncPtr>(initializer._setter);
1927 }
1928
1933 {
1934 assert(initializer._setter != nullptr);
1935
1936 this->SetOwner(nullptr);
1937 this->_setter = reinterpret_cast<TFuncPtr>(initializer._setter);
1938 }
1939
1943 void SetterImpl(TSetterParam value) const
1944 {
1945 if (this->IsStatic()) {
1946 reinterpret_cast<TStaticSetter>(this->_setter)(value);
1947 } else {
1948 reinterpret_cast<TSetter>(this->_setter)(this->GetOwner(), value);
1949 }
1950 }
1951 };
1952}
1953
1954/*================================================================================*/
1955
1960#include <string>
1961
1962#define _SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(T) \
1963 extern template class sw::Property<T>; \
1964 extern template class sw::ReadOnlyProperty<T>; \
1965 extern template class sw::WriteOnlyProperty<T>
1966
1967#define _SW_DEFINE_EXTERN_PROPERTY_TEMPLATE(T) \
1968 template class sw::Property<T>; \
1969 template class sw::ReadOnlyProperty<T>; \
1970 template class sw::WriteOnlyProperty<T>
1971
1972_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(bool);
1973_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(float);
1974_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(double);
1975_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(int8_t);
1976_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(int16_t);
1977_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(int32_t);
1978_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(int64_t);
1979_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(uint8_t);
1980_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(uint16_t);
1981_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(uint32_t);
1982_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(uint64_t);
1983_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(std::string);
1984_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(std::wstring);
值转换器接口
Definition IValueConverter.h:14
成员属性初始化器
Definition Property.h:239
MemberPropertyInitializer & Setter()
设置成员函数setter
Definition Property.h:315
MemberPropertyInitializer & Getter(TValue(*getter)(TOwner *))
设置getter
Definition Property.h:272
MemberPropertyInitializer(TOwner *owner)
构造成员属性初始化器
Definition Property.h:264
MemberPropertyInitializer & Setter(void(*setter)(TOwner *, _PropertySetterParamType< TValue >))
设置setter
Definition Property.h:281
MemberPropertyInitializer & Getter()
设置成员函数getter
Definition Property.h:291
属性基类模板
Definition Property.h:416
auto operator[](const PropertyBase< U, D > &prop) const -> typename std::enable_if< _BracketOperationHelper< T, U >::value &&std::is_pointer< T >::value, typename _BracketOperationHelper< T, U >::type >::type
指针下标运算
Definition Property.h:1481
auto operator[](U &&value) const -> typename std::enable_if< _BracketOperationHelper< T, U >::value &&std::is_pointer< T >::value, typename _BracketOperationHelper< T, U >::type >::type
指针下标运算
Definition Property.h:1467
auto operator==(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _EqOperationHelper< T, U >::value, typename _EqOperationHelper< T, U >::type >::type
等于运算
Definition Property.h:1181
void SetOwner(void *owner) noexcept
设置属性所有者对象,nullptr表示静态属性
Definition Property.h:1519
auto operator/=(U &&value) -> typename std::enable_if< _DivOperationHelper< T, U >::value, TDerived & >::type
除赋值运算
Definition Property.h:669
auto operator++(int) const -> typename std::enable_if< _AddOperationHelper< U, int >::value, T >::type
后置自增运算
Definition Property.h:757
auto operator>(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _GtOperationHelper< T, U >::value, typename _GtOperationHelper< T, U >::type >::type
大于运算
Definition Property.h:1263
auto operator>>(U &&value) const -> typename std::enable_if< _ShrOperationHelper< T, U >::value, typename _ShrOperationHelper< T, U >::type >::type
右移运算
Definition Property.h:1373
auto operator%(U &&value) const -> typename std::enable_if< _ModOperationHelper< T, U >::value, typename _ModOperationHelper< T, U >::type >::type
取模运算
Definition Property.h:1151
T Get() const
获取属性值
Definition Property.h:445
auto operator/=(U &&value) const -> typename std::enable_if< _DivOperationHelper< T, U >::value, const TDerived & >::type
除赋值运算
Definition Property.h:680
auto operator>>=(U &&value) const -> typename std::enable_if< _ShrOperationHelper< T, U >::value, const TDerived & >::type
右移赋值运算
Definition Property.h:968
auto operator--(int) const -> typename std::enable_if< _SubOperationHelper< U, int >::value, T >::type
后置自减运算
Definition Property.h:769
auto operator||(U &&value) const -> typename std::enable_if< _LogicOrOperationHelper< T, U >::value, typename _LogicOrOperationHelper< T, U >::type >::type
逻辑或运算
Definition Property.h:1413
auto operator*(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _MulOperationHelper< T, U >::value, typename _MulOperationHelper< T, U >::type >::type
乘法运算
Definition Property.h:1121
auto operator<<=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _ShlOperationHelper< T, U >::value, const TDerived & >::type
左移赋值运算
Definition Property.h:946
auto operator+(U &&value) const -> typename std::enable_if< _AddOperationHelper< T, U >::value, typename _AddOperationHelper< T, U >::type >::type
加法运算
Definition Property.h:1071
auto operator^=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _BitXorOperationHelper< T, U >::value, const TDerived & >::type
按位异或赋值运算
Definition Property.h:902
auto operator|(U &&value) const -> typename std::enable_if< _BitOrOperationHelper< T, U >::value, typename _BitOrOperationHelper< T, U >::type >::type
按位或运算
Definition Property.h:1313
auto operator--() const -> typename std::enable_if< _SubOperationHelper< U, int >::value, const TDerived & >::type
前置自减运算
Definition Property.h:746
auto operator&=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _BitAndOperationHelper< T, U >::value, const TDerived & >::type
按位与赋值运算
Definition Property.h:814
auto operator<<(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _ShlOperationHelper< T, U >::value, typename _ShlOperationHelper< T, U >::type >::type
左移运算
Definition Property.h:1363
auto operator|(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _BitOrOperationHelper< T, U >::value, typename _BitOrOperationHelper< T, U >::type >::type
按位或运算
Definition Property.h:1323
auto operator>=(U &&value) const -> typename std::enable_if< _GeOperationHelper< T, U >::value, typename _GeOperationHelper< T, U >::type >::type
大于等于运算
Definition Property.h:1273
auto operator+(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _AddOperationHelper< T, U >::value, typename _AddOperationHelper< T, U >::type >::type
加法运算
Definition Property.h:1081
auto operator/(U &&value) const -> typename std::enable_if< _DivOperationHelper< T, U >::value, typename _DivOperationHelper< T, U >::type >::type
除法运算
Definition Property.h:1131
const TDerived & operator=(TSetterParam value) const
设置属性值
Definition Property.h:509
const TDerived & operator=(const PropertyBase &prop) const
设置属性值
Definition Property.h:527
auto operator[](const PropertyBase< U, D > &prop) const -> typename std::enable_if< _BracketOperationHelper< T, U >::value &&!std::is_reference< typename _BracketOperationHelper< T, U >::type >::value, typename _BracketOperationHelper< T, U >::type >::type
下标运算
Definition Property.h:1452
auto operator/=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _DivOperationHelper< T, U >::value, TDerived & >::type
除赋值运算
Definition Property.h:691
auto operator!=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _EqOperationHelper< T, U >::value, typename _EqOperationHelper< T, U >::type >::type
不等于运算
Definition Property.h:1203
auto operator++() -> typename std::enable_if< _AddOperationHelper< U, int >::value, TDerived & >::type
前置自增运算
Definition Property.h:713
auto operator==(U &&value) const -> typename std::enable_if< _EqOperationHelper< T, U >::value, typename _EqOperationHelper< T, U >::type >::type
等于运算
Definition Property.h:1171
auto operator|=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _BitOrOperationHelper< T, U >::value, TDerived & >::type
按位或赋值运算
Definition Property.h:847
auto operator+=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _AddOperationHelper< T, U >::value, TDerived & >::type
加赋值运算
Definition Property.h:559
std::ptrdiff_t _offset
所有者对象相对于当前属性对象的偏移量
Definition Property.h:1506
auto operator|=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _BitOrOperationHelper< T, U >::value, const TDerived & >::type
按位或赋值运算
Definition Property.h:858
auto operator&=(U &&value) -> typename std::enable_if< _BitAndOperationHelper< T, U >::value, TDerived & >::type
按位与赋值运算
Definition Property.h:781
static constexpr std::ptrdiff_t _STATICOFFSET
静态属性偏移量标记
Definition Property.h:1500
auto operator<(U &&value) const -> typename std::enable_if< _LtOperationHelper< T, U >::value, typename _LtOperationHelper< T, U >::type >::type
小于运算
Definition Property.h:1213
auto operator-() const -> typename std::enable_if< _UnaryMinusOperationHelper< U >::value, typename _UnaryMinusOperationHelper< U >::type >::type
负号运算
Definition Property.h:1061
auto operator||(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _LogicOrOperationHelper< T, U >::value, typename _LogicOrOperationHelper< T, U >::type >::type
逻辑或运算
Definition Property.h:1423
auto operator-=(U &&value) -> typename std::enable_if< _SubOperationHelper< T, U >::value, TDerived & >::type
减赋值运算
Definition Property.h:581
auto operator-(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _SubOperationHelper< T, U >::value, typename _SubOperationHelper< T, U >::type >::type
减法运算
Definition Property.h:1101
TDerived & operator=(const PropertyBase &prop)
设置属性值
Definition Property.h:518
static auto Init() -> StaticPropertyInitializer< T >
获取静态属性初始化器
Definition Property.h:1554
auto operator>(U &&value) const -> typename std::enable_if< _GtOperationHelper< T, U >::value, typename _GtOperationHelper< T, U >::type >::type
大于运算
Definition Property.h:1253
auto operator*(U &&value) const -> typename std::enable_if< _MulOperationHelper< T, U >::value, typename _MulOperationHelper< T, U >::type >::type
乘法运算
Definition Property.h:1111
auto operator&=(U &&value) const -> typename std::enable_if< _BitAndOperationHelper< T, U >::value, const TDerived & >::type
按位与赋值运算
Definition Property.h:792
auto operator--() -> typename std::enable_if< _SubOperationHelper< U, int >::value, TDerived & >::type
前置自减运算
Definition Property.h:735
auto operator<=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _LeOperationHelper< T, U >::value, typename _LeOperationHelper< T, U >::type >::type
小于等于运算
Definition Property.h:1243
auto operator>>=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _ShrOperationHelper< T, U >::value, const TDerived & >::type
右移赋值运算
Definition Property.h:990
auto operator&(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _BitAndOperationHelper< T, U >::value, typename _BitAndOperationHelper< T, U >::type >::type
按位与运算
Definition Property.h:1303
static auto Init(TOwner *owner) -> MemberPropertyInitializer< TOwner, T >
获取成员属性初始化器
Definition Property.h:1545
auto operator&&(U &&value) const -> typename std::enable_if< _LogicAndOperationHelper< T, U >::value, typename _LogicAndOperationHelper< T, U >::type >::type
逻辑与运算
Definition Property.h:1393
auto operator~() const -> typename std::enable_if< _BitNotOperationHelper< U >::value, typename _BitNotOperationHelper< U >::type >::type
按位非运算
Definition Property.h:1011
auto operator-=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _SubOperationHelper< T, U >::value, TDerived & >::type
减赋值运算
Definition Property.h:603
auto operator-(U &&value) const -> typename std::enable_if< _SubOperationHelper< T, U >::value, typename _SubOperationHelper< T, U >::type >::type
减法运算
Definition Property.h:1091
void Set(TSetterParam value) const
设置属性值
Definition Property.h:453
auto operator++() const -> typename std::enable_if< _AddOperationHelper< U, int >::value, const TDerived & >::type
前置自增运算
Definition Property.h:724
auto operator[](U &&value) const -> typename std::enable_if< _BracketOperationHelper< T, U >::value &&!std::is_reference< typename _BracketOperationHelper< T, U >::type >::value, typename _BracketOperationHelper< T, U >::type >::type
下标运算
Definition Property.h:1436
auto operator*=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _MulOperationHelper< T, U >::value, const TDerived & >::type
乘赋值运算
Definition Property.h:658
auto operator^=(U &&value) -> typename std::enable_if< _BitXorOperationHelper< T, U >::value, TDerived & >::type
按位异或赋值运算
Definition Property.h:869
bool IsStatic() const noexcept
判断属性是否为静态属性
Definition Property.h:1511
auto operator^(U &&value) const -> typename std::enable_if< _BitXorOperationHelper< T, U >::value, typename _BitXorOperationHelper< T, U >::type >::type
按位异或运算
Definition Property.h:1333
auto operator<<(U &&value) const -> typename std::enable_if< _ShlOperationHelper< T, U >::value, typename _ShlOperationHelper< T, U >::type >::type
左移运算
Definition Property.h:1353
auto operator<<=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _ShlOperationHelper< T, U >::value, TDerived & >::type
左移赋值运算
Definition Property.h:935
auto operator!=(U &&value) const -> typename std::enable_if< _EqOperationHelper< T, U >::value, typename _EqOperationHelper< T, U >::type >::type
不等于运算
Definition Property.h:1192
auto operator->() const
取属性字段
Definition Property.h:461
auto operator&&(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _LogicAndOperationHelper< T, U >::value, typename _LogicAndOperationHelper< T, U >::type >::type
逻辑与运算
Definition Property.h:1403
auto operator|=(U &&value) -> typename std::enable_if< _BitOrOperationHelper< T, U >::value, TDerived & >::type
按位或赋值运算
Definition Property.h:825
auto operator<<=(U &&value) const -> typename std::enable_if< _ShlOperationHelper< T, U >::value, const TDerived & >::type
左移赋值运算
Definition Property.h:924
auto operator&=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _BitAndOperationHelper< T, U >::value, TDerived & >::type
按位与赋值运算
Definition Property.h:803
auto operator%(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _ModOperationHelper< T, U >::value, typename _ModOperationHelper< T, U >::type >::type
取模运算
Definition Property.h:1161
auto operator+=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _AddOperationHelper< T, U >::value, const TDerived & >::type
加赋值运算
Definition Property.h:570
auto operator*() const -> typename std::enable_if< _DerefOperationHelper< U >::value &&!std::is_reference< typename _DerefOperationHelper< U >::type >::value, typename _DerefOperationHelper< U >::type >::type
解引用运算
Definition Property.h:1024
auto operator+=(U &&value) -> typename std::enable_if< _AddOperationHelper< T, U >::value, TDerived & >::type
加赋值运算
Definition Property.h:537
auto operator&(U &&value) const -> typename std::enable_if< _BitAndOperationHelper< T, U >::value, typename _BitAndOperationHelper< T, U >::type >::type
按位与运算
Definition Property.h:1293
auto operator|=(U &&value) const -> typename std::enable_if< _BitOrOperationHelper< T, U >::value, const TDerived & >::type
按位或赋值运算
Definition Property.h:836
auto operator<<=(U &&value) -> typename std::enable_if< _ShlOperationHelper< T, U >::value, TDerived & >::type
左移赋值运算
Definition Property.h:913
auto operator+=(U &&value) const -> typename std::enable_if< _AddOperationHelper< T, U >::value, const TDerived & >::type
加赋值运算
Definition Property.h:548
auto operator-=(U &&value) const -> typename std::enable_if< _SubOperationHelper< T, U >::value, const TDerived & >::type
减赋值运算
Definition Property.h:592
auto operator*() const -> typename std::enable_if< _DerefOperationHelper< U >::value &&std::is_pointer< T >::value, typename _DerefOperationHelper< U >::type >::type
指针解引用运算
Definition Property.h:1039
FieldsAccessor< T > AccessFields() const
访问属性字段,可由子类重写
Definition Property.h:437
auto operator<=(U &&value) const -> typename std::enable_if< _LeOperationHelper< T, U >::value, typename _LeOperationHelper< T, U >::type >::type
小于等于运算
Definition Property.h:1233
void(*)() TFuncPtr
用于存储任意签名函数指针的通用类型
Definition Property.h:1495
auto operator>>=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _ShrOperationHelper< T, U >::value, TDerived & >::type
右移赋值运算
Definition Property.h:979
auto operator!() const -> typename std::enable_if< _LogicNotOperationHelper< U >::value, typename _LogicNotOperationHelper< U >::type >::type
逻辑非运算
Definition Property.h:1001
auto operator*=(U &&value) -> typename std::enable_if< _MulOperationHelper< T, U >::value, TDerived & >::type
乘赋值运算
Definition Property.h:625
void * GetOwner() const noexcept
获取属性所有者对象,当属性为静态属性时返回nullptr
Definition Property.h:1531
auto operator>>=(U &&value) -> typename std::enable_if< _ShrOperationHelper< T, U >::value, TDerived & >::type
右移赋值运算
Definition Property.h:957
auto operator^=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _BitXorOperationHelper< T, U >::value, TDerived & >::type
按位异或赋值运算
Definition Property.h:891
TDerived & operator=(TSetterParam value)
设置属性值
Definition Property.h:500
auto operator-=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _SubOperationHelper< T, U >::value, const TDerived & >::type
减赋值运算
Definition Property.h:614
auto operator/=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _DivOperationHelper< T, U >::value, const TDerived & >::type
除赋值运算
Definition Property.h:702
auto operator*=(U &&value) const -> typename std::enable_if< _MulOperationHelper< T, U >::value, const TDerived & >::type
乘赋值运算
Definition Property.h:636
auto operator/(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _DivOperationHelper< T, U >::value, typename _DivOperationHelper< T, U >::type >::type
除法运算
Definition Property.h:1141
auto operator^(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _BitXorOperationHelper< T, U >::value, typename _BitXorOperationHelper< T, U >::type >::type
按位异或运算
Definition Property.h:1343
auto operator*=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _MulOperationHelper< T, U >::value, TDerived & >::type
乘赋值运算
Definition Property.h:647
auto operator>>(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _ShrOperationHelper< T, U >::value, typename _ShrOperationHelper< T, U >::type >::type
右移运算
Definition Property.h:1383
auto operator+() const -> typename std::enable_if< _UnaryPlusOperationHelper< U >::value, typename _UnaryPlusOperationHelper< U >::type >::type
正号运算
Definition Property.h:1051
auto operator<(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _LtOperationHelper< T, U >::value, typename _LtOperationHelper< T, U >::type >::type
小于运算
Definition Property.h:1223
auto operator^=(U &&value) const -> typename std::enable_if< _BitXorOperationHelper< T, U >::value, const TDerived & >::type
按位异或赋值运算
Definition Property.h:880
auto operator>=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _GeOperationHelper< T, U >::value, typename _GeOperationHelper< T, U >::type >::type
大于等于运算
Definition Property.h:1283
属性
Definition Property.h:1751
T GetterImpl() const
获取属性值
Definition Property.h:1810
void SetterImpl(TSetterParam value) const
设置属性值
Definition Property.h:1822
Property(const MemberPropertyInitializer< TOwner, T > &initializer)
构造成员属性
Definition Property.h:1783
Property(const StaticPropertyInitializer< T > &initializer)
构造静态属性
Definition Property.h:1797
只读属性
Definition Property.h:1837
ReadOnlyProperty(const StaticPropertyInitializer< T > &initializer)
构造静态属性
Definition Property.h:1869
ReadOnlyProperty(const MemberPropertyInitializer< TOwner, T > &initializer)
构造成员属性
Definition Property.h:1857
T GetterImpl() const
获取属性值
Definition Property.h:1880
静态属性初始化器
Definition Property.h:365
StaticPropertyInitializer()
构造静态属性初始化器
Definition Property.h:385
StaticPropertyInitializer & Setter(void(*setter)(_PropertySetterParamType< TValue >))
设置setter
Definition Property.h:402
StaticPropertyInitializer & Getter(TValue(*getter)())
设置getter
Definition Property.h:393
只写属性
Definition Property.h:1895
void SetterImpl(TSetterParam value) const
设置属性值
Definition Property.h:1943
WriteOnlyProperty(const MemberPropertyInitializer< TOwner, T > &initializer)
构造成员属性
Definition Property.h:1920
WriteOnlyProperty(const StaticPropertyInitializer< T > &initializer)
构造静态属性
Definition Property.h:1932
SimpleWindow框架的顶级命名空间,所有公共类型、控件、枚举和工具函数均定义于此。
Definition Alignment.h:4
auto operator&&(T &&left, const PropertyBase< U, D > &right) -> typename std::enable_if<!_IsProperty< T >::value &&_LogicAndOperationHelper< T, U >::value, typename _LogicAndOperationHelper< T, U >::type >::type
逻辑与运算
Definition Property.h:1728
auto operator<<(T &&left, const PropertyBase< U, D > &right) -> typename std::enable_if<!_IsProperty< T >::value &&_ShlOperationHelper< T, U >::value, typename _ShlOperationHelper< T, U >::type >::type
左移运算
Definition Property.h:1708
auto operator>(T &&left, const PropertyBase< U, D > &right) -> typename std::enable_if<!_IsProperty< T >::value &&_GtOperationHelper< T, U >::value, typename _GtOperationHelper< T, U >::type >::type
大于运算
Definition Property.h:1658
bool operator==(std::nullptr_t, const Delegate< TRet(Args...)> &d) noexcept
比较委托和nullptr
Definition Delegate.h:1094
auto operator+(T &&left, const PropertyBase< U, D > &right) -> typename std::enable_if<!_IsProperty< T >::value &&_AddOperationHelper< T, U >::value, typename _AddOperationHelper< T, U >::type >::type
加法运算
Definition Property.h:1567
auto operator<(T &&left, const PropertyBase< U, D > &right) -> typename std::enable_if<!_IsProperty< T >::value &&_LtOperationHelper< T, U >::value, typename _LtOperationHelper< T, U >::type >::type
小于运算
Definition Property.h:1638
auto operator<=(T &&left, const PropertyBase< U, D > &right) -> typename std::enable_if<!_IsProperty< T >::value &&_LeOperationHelper< T, U >::value, typename _LeOperationHelper< T, U >::type >::type
小于等于运算
Definition Property.h:1648
auto operator*(T &&left, const PropertyBase< U, D > &right) -> typename std::enable_if<!_IsProperty< T >::value &&_MulOperationHelper< T, U >::value, typename _MulOperationHelper< T, U >::type >::type
乘法运算
Definition Property.h:1587
constexpr auto operator&(T a, T b) -> typename std::enable_if< std::is_enum< T >::value &&_EnumSupportBitOperations< T >::value, T >::type
为标记_EnumSupportBitOperations的枚举类型提供按位与运算
Definition EnumBit.h:44
auto operator||(T &&left, const PropertyBase< U, D > &right) -> typename std::enable_if<!_IsProperty< T >::value &&_LogicOrOperationHelper< T, U >::value, typename _LogicOrOperationHelper< T, U >::type >::type
逻辑或运算
Definition Property.h:1738
constexpr auto operator^(T a, T b) -> typename std::enable_if< std::is_enum< T >::value &&_EnumSupportBitOperations< T >::value, T >::type
为标记_EnumSupportBitOperations的枚举类型提供按位异或运算
Definition EnumBit.h:65
constexpr auto operator|(T a, T b) -> typename std::enable_if< std::is_enum< T >::value &&_EnumSupportBitOperations< T >::value, T >::type
为标记_EnumSupportBitOperations的枚举类型提供按位或运算
Definition EnumBit.h:23
bool operator!=(std::nullptr_t, const Delegate< TRet(Args...)> &d) noexcept
比较委托和nullptr
Definition Delegate.h:1104
auto operator>=(T &&left, const PropertyBase< U, D > &right) -> typename std::enable_if<!_IsProperty< T >::value &&_GeOperationHelper< T, U >::value, typename _GeOperationHelper< T, U >::type >::type
大于等于运算
Definition Property.h:1668
auto operator%(T &&left, const PropertyBase< U, D > &right) -> typename std::enable_if<!_IsProperty< T >::value &&_ModOperationHelper< T, U >::value, typename _ModOperationHelper< T, U >::type >::type
取模运算
Definition Property.h:1607
auto operator/(T &&left, const PropertyBase< U, D > &right) -> typename std::enable_if<!_IsProperty< T >::value &&_DivOperationHelper< T, U >::value, typename _DivOperationHelper< T, U >::type >::type
除法运算
Definition Property.h:1597
auto operator>>(T &&left, const PropertyBase< U, D > &right) -> typename std::enable_if<!_IsProperty< T >::value &&_ShrOperationHelper< T, U >::value, typename _ShrOperationHelper< T, U >::type >::type
右移运算
Definition Property.h:1718
auto operator-(T &&left, const PropertyBase< U, D > &right) -> typename std::enable_if<!_IsProperty< T >::value &&_SubOperationHelper< T, U >::value, typename _SubOperationHelper< T, U >::type >::type
减法运算
Definition Property.h:1577
字段访问器,用于实现使用operator->取属性字段
Definition Property.h:188
auto operator->() -> typename std::enable_if<!std::is_pointer< U >::value &&_HasArrowOperator< U >::value, typename _HasArrowOperator< U >::type >::type
非指针类型,且有operator->,转发operator->
Definition Property.h:227
T value
字段访问器所维护的值
Definition Property.h:192
auto operator->() -> typename std::enable_if< std::is_pointer< U >::value, U >::type
指针类型,直接返回值
Definition Property.h:207
FieldsAccessor(Args &&...args)
构造字段访问器
Definition Property.h:198
auto operator->() -> typename std::enable_if<!std::is_pointer< U >::value &&!_HasArrowOperator< U >::value, U * >::type
非指针类型,且无operator->,返回值的地址
Definition Property.h:217
判断类型是否可以使用[]操作符的辅助模板
Definition Property.h:148
判断类型是否有operator->的辅助模板
Definition Property.h:164
判断类型是否有GetterImpl成员的辅助模板
Definition Property.h:102
判断类型是否有SetterImpl成员的辅助模板
Definition Property.h:117
判断类型是否可以显式转换的辅助模板
Definition Internal.h:19
_IsProperty的实现
Definition Property.h:81
判断类型是否为属性的辅助模板
Definition Property.h:95
判断类型是否为可读属性的辅助模板
Definition Property.h:133
判断类型是否为可写属性的辅助模板
Definition Property.h:141