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>
207 typename std::enable_if<std::is_pointer<U>::value, U>::type operator->()
208 {
209 return this->value;
210 }
211
215 template <typename U = T>
216 typename std::enable_if<!std::is_pointer<U>::value && !_HasArrowOperator<U>::value, U *>::type operator->()
217 {
218 return &this->value;
219 }
220
224 template <typename U = T>
225 typename std::enable_if<!std::is_pointer<U>::value && _HasArrowOperator<U>::value, typename _HasArrowOperator<U>::type>::type operator->()
226 {
227 return this->value.operator->();
228 }
229 };
230
234 template <typename TOwner, typename TValue>
236 {
237 friend class Property<TValue>;
238 friend class ReadOnlyProperty<TValue>;
239 friend class WriteOnlyProperty<TValue>;
240
241 private:
245 TOwner *_owner;
246
250 TValue (*_getter)(TOwner *);
251
256
257 public:
262 : _owner(owner), _getter(nullptr), _setter(nullptr)
263 {
264 }
265
270 {
271 this->_getter = getter;
272 return *this;
273 }
274
279 {
280 this->_setter = setter;
281 return *this;
282 }
283
287 template <TValue (TOwner::*getter)()>
289 {
290 return this->Getter(
291 [](TOwner *owner) -> TValue {
292 return (owner->*getter)();
293 });
294 }
295
299 template <TValue (TOwner::*getter)() const>
301 {
302 return this->Getter(
303 [](TOwner *owner) -> TValue {
304 return (owner->*getter)();
305 });
306 }
307
311 template <void (TOwner::*setter)(_PropertySetterParamType<TValue>)>
313 {
314 return this->Setter(
316 (owner->*setter)(value);
317 });
318 }
319
323 template <void (TOwner::*setter)(_PropertySetterParamType<TValue>) const>
325 {
326 return this->Setter(
328 (owner->*setter)(value);
329 });
330 }
331
335 template <TValue TOwner::*field>
337 {
338 return this->Getter(
339 [](TOwner *owner) -> TValue {
340 return owner->*field;
341 });
342 }
343
347 template <TValue TOwner::*field>
349 {
350 return this->Setter(
352 owner->*field = value;
353 });
354 }
355 };
356
360 template <typename TValue>
362 {
363 friend class Property<TValue>;
364 friend class ReadOnlyProperty<TValue>;
365 friend class WriteOnlyProperty<TValue>;
366
367 private:
371 TValue (*_getter)();
372
377
378 public:
383 : _getter(nullptr), _setter(nullptr)
384 {
385 }
386
391 {
392 this->_getter = getter;
393 return *this;
394 }
395
400 {
401 this->_setter = setter;
402 return *this;
403 }
404 };
405
406 /*================================================================================*/
407
411 template <typename T, typename TDerived>
413 {
414 public:
415 // 属性值类型别名
416 using TValue = T;
417
418 // setter参数类型别名
420
421 // /**
422 // * @brief 获取属性值,由子类实现
423 // */
424 // T GetterImpl() const;
425
426 // /**
427 // * @brief 设置属性值,由子类实现
428 // */
429 // void SetterImpl(TSetterParam value) const;
430
435 {
436 return FieldsAccessor<T>(this->Get());
437 }
438
442 T Get() const
443 {
444 return static_cast<const TDerived *>(this)->GetterImpl();
445 }
446
450 void Set(TSetterParam value) const
451 {
452 static_cast<const TDerived *>(this)->SetterImpl(value);
453 }
454
458 auto operator->() const
459 {
460 return static_cast<const TDerived *>(this)->AccessFields();
461 }
462
466 operator T() const
467 {
468 return this->Get();
469 }
470
474 template <
475 typename U = T,
476 typename = typename std::enable_if<!std::is_arithmetic<T>::value && std::is_convertible<T, U>::value, U>::type>
477 operator U() const
478 {
479 return static_cast<U>(this->Get());
480 }
481
485 template <
486 typename U = T,
487 typename = typename std::enable_if<!std::is_arithmetic<T>::value && !std::is_convertible<T, U>::value, U>::type,
488 typename = typename std::enable_if<!std::is_arithmetic<T>::value && _IsExplicitlyConvertable<T, U>::value, U>::type>
489 explicit operator U() const
490 {
491 return static_cast<U>(this->Get());
492 }
493
498 {
499 this->Set(value);
500 return *static_cast<TDerived *>(this);
501 }
502
506 const TDerived &operator=(TSetterParam value) const
507 {
508 this->Set(value);
509 return *static_cast<const TDerived *>(this);
510 }
511
516 {
517 this->Set(prop.Get());
518 return *static_cast<TDerived *>(this);
519 }
520
524 const TDerived &operator=(const PropertyBase &prop) const
525 {
526 this->Set(prop.Get());
527 return *static_cast<const TDerived *>(this);
528 }
529
533 template <typename U>
534 auto operator+=(U &&value)
535 -> typename std::enable_if<_AddOperationHelper<T, U>::value, TDerived &>::type
536 {
537 this->Set(this->Get() + std::forward<U>(value));
538 return *static_cast<TDerived *>(this);
539 }
540
544 template <typename U>
545 auto operator+=(U &&value) const
546 -> typename std::enable_if<_AddOperationHelper<T, U>::value, const TDerived &>::type
547 {
548 this->Set(this->Get() + std::forward<U>(value));
549 return *static_cast<const TDerived *>(this);
550 }
551
555 template <typename D, typename U>
557 -> typename std::enable_if<_AddOperationHelper<T, U>::value, TDerived &>::type
558 {
559 this->Set(this->Get() + prop.Get());
560 return *static_cast<TDerived *>(this);
561 }
562
566 template <typename D, typename U>
568 -> typename std::enable_if<_AddOperationHelper<T, U>::value, const TDerived &>::type
569 {
570 this->Set(this->Get() + prop.Get());
571 return *static_cast<const TDerived *>(this);
572 }
573
577 template <typename U>
578 auto operator-=(U &&value)
579 -> typename std::enable_if<_SubOperationHelper<T, U>::value, TDerived &>::type
580 {
581 this->Set(this->Get() - std::forward<U>(value));
582 return *static_cast<TDerived *>(this);
583 }
584
588 template <typename U>
589 auto operator-=(U &&value) const
590 -> typename std::enable_if<_SubOperationHelper<T, U>::value, const TDerived &>::type
591 {
592 this->Set(this->Get() - std::forward<U>(value));
593 return *static_cast<const TDerived *>(this);
594 }
595
599 template <typename D, typename U>
601 -> typename std::enable_if<_SubOperationHelper<T, U>::value, TDerived &>::type
602 {
603 this->Set(this->Get() - prop.Get());
604 return *static_cast<TDerived *>(this);
605 }
606
610 template <typename D, typename U>
612 -> typename std::enable_if<_SubOperationHelper<T, U>::value, const TDerived &>::type
613 {
614 this->Set(this->Get() - prop.Get());
615 return *static_cast<const TDerived *>(this);
616 }
617
621 template <typename U>
622 auto operator*=(U &&value)
623 -> typename std::enable_if<_MulOperationHelper<T, U>::value, TDerived &>::type
624 {
625 this->Set(this->Get() * std::forward<U>(value));
626 return *static_cast<TDerived *>(this);
627 }
628
632 template <typename U>
633 auto operator*=(U &&value) const
634 -> typename std::enable_if<_MulOperationHelper<T, U>::value, const TDerived &>::type
635 {
636 this->Set(this->Get() * std::forward<U>(value));
637 return *static_cast<const TDerived *>(this);
638 }
639
643 template <typename D, typename U>
645 -> typename std::enable_if<_MulOperationHelper<T, U>::value, TDerived &>::type
646 {
647 this->Set(this->Get() * prop.Get());
648 return *static_cast<TDerived *>(this);
649 }
650
654 template <typename D, typename U>
656 -> typename std::enable_if<_MulOperationHelper<T, U>::value, const TDerived &>::type
657 {
658 this->Set(this->Get() * prop.Get());
659 return *static_cast<const TDerived *>(this);
660 }
661
665 template <typename U>
666 auto operator/=(U &&value)
667 -> typename std::enable_if<_DivOperationHelper<T, U>::value, TDerived &>::type
668 {
669 this->Set(this->Get() / std::forward<U>(value));
670 return *static_cast<TDerived *>(this);
671 }
672
676 template <typename U>
677 auto operator/=(U &&value) const
678 -> typename std::enable_if<_DivOperationHelper<T, U>::value, const TDerived &>::type
679 {
680 this->Set(this->Get() / std::forward<U>(value));
681 return *static_cast<const TDerived *>(this);
682 }
683
687 template <typename D, typename U>
689 -> typename std::enable_if<_DivOperationHelper<T, U>::value, TDerived &>::type
690 {
691 this->Set(this->Get() / prop.Get());
692 return *static_cast<TDerived *>(this);
693 }
694
698 template <typename D, typename U>
700 -> typename std::enable_if<_DivOperationHelper<T, U>::value, const TDerived &>::type
701 {
702 this->Set(this->Get() / prop.Get());
703 return *static_cast<const TDerived *>(this);
704 }
705
709 template <typename U = T>
711 -> typename std::enable_if<_AddOperationHelper<U, int>::value, TDerived &>::type
712 {
713 this->Set(this->Get() + 1);
714 return *static_cast<TDerived *>(this);
715 }
716
720 template <typename U = T>
722 -> typename std::enable_if<_AddOperationHelper<U, int>::value, const TDerived &>::type
723 {
724 this->Set(this->Get() + 1);
725 return *static_cast<const TDerived *>(this);
726 }
727
731 template <typename U = T>
733 -> typename std::enable_if<_SubOperationHelper<U, int>::value, TDerived &>::type
734 {
735 this->Set(this->Get() - 1);
736 return *static_cast<TDerived *>(this);
737 }
738
742 template <typename U = T>
744 -> typename std::enable_if<_SubOperationHelper<U, int>::value, const TDerived &>::type
745 {
746 this->Set(this->Get() - 1);
747 return *static_cast<const TDerived *>(this);
748 }
749
753 template <typename U = T>
754 auto operator++(int) const
755 -> typename std::enable_if<_AddOperationHelper<U, int>::value, T>::type
756 {
757 T oldval = this->Get();
758 this->Set(oldval + 1);
759 return oldval;
760 }
761
765 template <typename U = T>
766 auto operator--(int) const
767 -> typename std::enable_if<_SubOperationHelper<U, int>::value, T>::type
768 {
769 T oldval = this->Get();
770 this->Set(oldval - 1);
771 return oldval;
772 }
773
777 template <typename U>
778 auto operator&=(U &&value)
779 -> typename std::enable_if<_BitAndOperationHelper<T, U>::value, TDerived &>::type
780 {
781 this->Set(this->Get() & std::forward<U>(value));
782 return *static_cast<TDerived *>(this);
783 }
784
788 template <typename U>
789 auto operator&=(U &&value) const
790 -> typename std::enable_if<_BitAndOperationHelper<T, U>::value, const TDerived &>::type
791 {
792 this->Set(this->Get() & std::forward<U>(value));
793 return *static_cast<const TDerived *>(this);
794 }
795
799 template <typename D, typename U>
801 -> typename std::enable_if<_BitAndOperationHelper<T, U>::value, TDerived &>::type
802 {
803 this->Set(this->Get() & prop.Get());
804 return *static_cast<TDerived *>(this);
805 }
806
810 template <typename D, typename U>
812 -> typename std::enable_if<_BitAndOperationHelper<T, U>::value, const TDerived &>::type
813 {
814 this->Set(this->Get() & prop.Get());
815 return *static_cast<const TDerived *>(this);
816 }
817
821 template <typename U>
822 auto operator|=(U &&value)
823 -> typename std::enable_if<_BitOrOperationHelper<T, U>::value, TDerived &>::type
824 {
825 this->Set(this->Get() | std::forward<U>(value));
826 return *static_cast<TDerived *>(this);
827 }
828
832 template <typename U>
833 auto operator|=(U &&value) const
834 -> typename std::enable_if<_BitOrOperationHelper<T, U>::value, const TDerived &>::type
835 {
836 this->Set(this->Get() | std::forward<U>(value));
837 return *static_cast<const TDerived *>(this);
838 }
839
843 template <typename D, typename U>
845 -> typename std::enable_if<_BitOrOperationHelper<T, U>::value, TDerived &>::type
846 {
847 this->Set(this->Get() | prop.Get());
848 return *static_cast<TDerived *>(this);
849 }
850
854 template <typename D, typename U>
856 -> typename std::enable_if<_BitOrOperationHelper<T, U>::value, const TDerived &>::type
857 {
858 this->Set(this->Get() | prop.Get());
859 return *static_cast<const TDerived *>(this);
860 }
861
865 template <typename U>
866 auto operator^=(U &&value)
867 -> typename std::enable_if<_BitXorOperationHelper<T, U>::value, TDerived &>::type
868 {
869 this->Set(this->Get() ^ std::forward<U>(value));
870 return *static_cast<TDerived *>(this);
871 }
872
876 template <typename U>
877 auto operator^=(U &&value) const
878 -> typename std::enable_if<_BitXorOperationHelper<T, U>::value, const TDerived &>::type
879 {
880 this->Set(this->Get() ^ std::forward<U>(value));
881 return *static_cast<const TDerived *>(this);
882 }
883
887 template <typename D, typename U>
889 -> typename std::enable_if<_BitXorOperationHelper<T, U>::value, TDerived &>::type
890 {
891 this->Set(this->Get() ^ prop.Get());
892 return *static_cast<TDerived *>(this);
893 }
894
898 template <typename D, typename U>
900 -> typename std::enable_if<_BitXorOperationHelper<T, U>::value, const TDerived &>::type
901 {
902 this->Set(this->Get() ^ prop.Get());
903 return *static_cast<const TDerived *>(this);
904 }
905
909 template <typename U>
910 auto operator<<=(U &&value)
911 -> typename std::enable_if<_ShlOperationHelper<T, U>::value, TDerived &>::type
912 {
913 this->Set(this->Get() << std::forward<U>(value));
914 return *static_cast<TDerived *>(this);
915 }
916
920 template <typename U>
921 auto operator<<=(U &&value) const
922 -> typename std::enable_if<_ShlOperationHelper<T, U>::value, const TDerived &>::type
923 {
924 this->Set(this->Get() << std::forward<U>(value));
925 return *static_cast<const TDerived *>(this);
926 }
927
931 template <typename D, typename U>
933 -> typename std::enable_if<_ShlOperationHelper<T, U>::value, TDerived &>::type
934 {
935 this->Set(this->Get() << prop.Get());
936 return *static_cast<TDerived *>(this);
937 }
938
942 template <typename D, typename U>
944 -> typename std::enable_if<_ShlOperationHelper<T, U>::value, const TDerived &>::type
945 {
946 this->Set(this->Get() << prop.Get());
947 return *static_cast<const TDerived *>(this);
948 }
949
953 template <typename U>
954 auto operator>>=(U &&value)
955 -> typename std::enable_if<_ShrOperationHelper<T, U>::value, TDerived &>::type
956 {
957 this->Set(this->Get() >> std::forward<U>(value));
958 return *static_cast<TDerived *>(this);
959 }
960
964 template <typename U>
965 auto operator>>=(U &&value) const
966 -> typename std::enable_if<_ShrOperationHelper<T, U>::value, const TDerived &>::type
967 {
968 this->Set(this->Get() >> std::forward<U>(value));
969 return *static_cast<const TDerived *>(this);
970 }
971
975 template <typename D, typename U>
977 -> typename std::enable_if<_ShrOperationHelper<T, U>::value, TDerived &>::type
978 {
979 this->Set(this->Get() >> prop.Get());
980 return *static_cast<TDerived *>(this);
981 }
982
986 template <typename D, typename U>
988 -> typename std::enable_if<_ShrOperationHelper<T, U>::value, const TDerived &>::type
989 {
990 this->Set(this->Get() >> prop.Get());
991 return *static_cast<const TDerived *>(this);
992 }
993
997 template <typename U = T>
1000 {
1001 return !this->Get();
1002 }
1003
1007 template <typename U = T>
1010 {
1011 return ~this->Get();
1012 }
1013
1017 template <typename U = T>
1019 -> typename std::enable_if<_DerefOperationHelper<U>::value, typename _DerefOperationHelper<U>::type>::type
1020 {
1021 return *this->Get();
1022 }
1023
1027 template <typename U = T>
1029 -> typename std::enable_if<_AddrOperationHelper<U>::value, typename _AddrOperationHelper<U>::type>::type
1030 {
1031 return &this->Get();
1032 }
1033
1037 template <typename U = T>
1040 {
1041 return +this->Get();
1042 }
1043
1047 template <typename U = T>
1050 {
1051 return -this->Get();
1052 }
1053
1057 template <typename U>
1058 auto operator+(U &&value) const
1059 -> typename std::enable_if<_AddOperationHelper<T, U>::value, typename _AddOperationHelper<T, U>::type>::type
1060 {
1061 return this->Get() + std::forward<U>(value);
1062 }
1063
1067 template <typename D, typename U>
1069 -> typename std::enable_if<_AddOperationHelper<T, U>::value, typename _AddOperationHelper<T, U>::type>::type
1070 {
1071 return this->Get() + prop.Get();
1072 }
1073
1077 template <typename U>
1078 auto operator-(U &&value) const
1079 -> typename std::enable_if<_SubOperationHelper<T, U>::value, typename _SubOperationHelper<T, U>::type>::type
1080 {
1081 return this->Get() - std::forward<U>(value);
1082 }
1083
1087 template <typename D, typename U>
1089 -> typename std::enable_if<_SubOperationHelper<T, U>::value, typename _SubOperationHelper<T, U>::type>::type
1090 {
1091 return this->Get() - prop.Get();
1092 }
1093
1097 template <typename U>
1098 auto operator*(U &&value) const
1099 -> typename std::enable_if<_MulOperationHelper<T, U>::value, typename _MulOperationHelper<T, U>::type>::type
1100 {
1101 return this->Get() * std::forward<U>(value);
1102 }
1103
1107 template <typename D, typename U>
1109 -> typename std::enable_if<_MulOperationHelper<T, U>::value, typename _MulOperationHelper<T, U>::type>::type
1110 {
1111 return this->Get() * prop.Get();
1112 }
1113
1117 template <typename U>
1118 auto operator/(U &&value) const
1119 -> typename std::enable_if<_DivOperationHelper<T, U>::value, typename _DivOperationHelper<T, U>::type>::type
1120 {
1121 return this->Get() / std::forward<U>(value);
1122 }
1123
1127 template <typename D, typename U>
1129 -> typename std::enable_if<_DivOperationHelper<T, U>::value, typename _DivOperationHelper<T, U>::type>::type
1130 {
1131 return this->Get() / prop.Get();
1132 }
1133
1137 template <typename U>
1138 auto operator%(U &&value) const
1139 -> typename std::enable_if<_ModOperationHelper<T, U>::value, typename _ModOperationHelper<T, U>::type>::type
1140 {
1141 return this->Get() % std::forward<U>(value);
1142 }
1143
1147 template <typename D, typename U>
1149 -> typename std::enable_if<_ModOperationHelper<T, U>::value, typename _ModOperationHelper<T, U>::type>::type
1150 {
1151 return this->Get() % prop.Get();
1152 }
1153
1157 template <typename U>
1158 auto operator==(U &&value) const
1159 -> typename std::enable_if<_EqOperationHelper<T, U>::value, typename _EqOperationHelper<T, U>::type>::type
1160 {
1161 return this->Get() == std::forward<U>(value);
1162 }
1163
1167 template <typename D, typename U>
1169 -> typename std::enable_if<_EqOperationHelper<T, U>::value, typename _EqOperationHelper<T, U>::type>::type
1170 {
1171 return this->Get() == prop.Get();
1172 }
1173
1178 template <typename U>
1179 auto operator!=(U &&value) const
1180 -> typename std::enable_if<_EqOperationHelper<T, U>::value, typename _EqOperationHelper<T, U>::type>::type
1181 {
1182 return !(*this == std::forward<U>(value));
1183 }
1184
1189 template <typename D, typename U>
1191 -> typename std::enable_if<_EqOperationHelper<T, U>::value, typename _EqOperationHelper<T, U>::type>::type
1192 {
1193 return !(*this == prop);
1194 }
1195
1199 template <typename U>
1200 auto operator<(U &&value) const
1201 -> typename std::enable_if<_LtOperationHelper<T, U>::value, typename _LtOperationHelper<T, U>::type>::type
1202 {
1203 return this->Get() < std::forward<U>(value);
1204 }
1205
1209 template <typename D, typename U>
1211 -> typename std::enable_if<_LtOperationHelper<T, U>::value, typename _LtOperationHelper<T, U>::type>::type
1212 {
1213 return this->Get() < prop.Get();
1214 }
1215
1219 template <typename U>
1220 auto operator<=(U &&value) const
1221 -> typename std::enable_if<_LeOperationHelper<T, U>::value, typename _LeOperationHelper<T, U>::type>::type
1222 {
1223 return this->Get() <= std::forward<U>(value);
1224 }
1225
1229 template <typename D, typename U>
1231 -> typename std::enable_if<_LeOperationHelper<T, U>::value, typename _LeOperationHelper<T, U>::type>::type
1232 {
1233 return this->Get() <= prop.Get();
1234 }
1235
1239 template <typename U>
1240 auto operator>(U &&value) const
1241 -> typename std::enable_if<_GtOperationHelper<T, U>::value, typename _GtOperationHelper<T, U>::type>::type
1242 {
1243 return this->Get() > std::forward<U>(value);
1244 }
1245
1249 template <typename D, typename U>
1251 -> typename std::enable_if<_GtOperationHelper<T, U>::value, typename _GtOperationHelper<T, U>::type>::type
1252 {
1253 return this->Get() > prop.Get();
1254 }
1255
1259 template <typename U>
1260 auto operator>=(U &&value) const
1261 -> typename std::enable_if<_GeOperationHelper<T, U>::value, typename _GeOperationHelper<T, U>::type>::type
1262 {
1263 return this->Get() >= std::forward<U>(value);
1264 }
1265
1269 template <typename D, typename U>
1271 -> typename std::enable_if<_GeOperationHelper<T, U>::value, typename _GeOperationHelper<T, U>::type>::type
1272 {
1273 return this->Get() >= prop.Get();
1274 }
1275
1279 template <typename U>
1280 auto operator&(U &&value) const
1281 -> typename std::enable_if<_BitAndOperationHelper<T, U>::value, typename _BitAndOperationHelper<T, U>::type>::type
1282 {
1283 return this->Get() & std::forward<U>(value);
1284 }
1285
1289 template <typename D, typename U>
1291 -> typename std::enable_if<_BitAndOperationHelper<T, U>::value, typename _BitAndOperationHelper<T, U>::type>::type
1292 {
1293 return this->Get() & prop.Get();
1294 }
1295
1299 template <typename U>
1300 auto operator|(U &&value) const
1301 -> typename std::enable_if<_BitOrOperationHelper<T, U>::value, typename _BitOrOperationHelper<T, U>::type>::type
1302 {
1303 return this->Get() | std::forward<U>(value);
1304 }
1305
1309 template <typename D, typename U>
1311 -> typename std::enable_if<_BitOrOperationHelper<T, U>::value, typename _BitOrOperationHelper<T, U>::type>::type
1312 {
1313 return this->Get() | prop.Get();
1314 }
1315
1319 template <typename U>
1320 auto operator^(U &&value) const
1321 -> typename std::enable_if<_BitXorOperationHelper<T, U>::value, typename _BitXorOperationHelper<T, U>::type>::type
1322 {
1323 return this->Get() ^ std::forward<U>(value);
1324 }
1325
1329 template <typename D, typename U>
1331 -> typename std::enable_if<_BitXorOperationHelper<T, U>::value, typename _BitXorOperationHelper<T, U>::type>::type
1332 {
1333 return this->Get() ^ prop.Get();
1334 }
1335
1339 template <typename U>
1340 auto operator<<(U &&value) const
1341 -> typename std::enable_if<_ShlOperationHelper<T, U>::value, typename _ShlOperationHelper<T, U>::type>::type
1342 {
1343 return this->Get() << std::forward<U>(value);
1344 }
1345
1349 template <typename D, typename U>
1351 -> typename std::enable_if<_ShlOperationHelper<T, U>::value, typename _ShlOperationHelper<T, U>::type>::type
1352 {
1353 return this->Get() << prop.Get();
1354 }
1355
1359 template <typename U>
1360 auto operator>>(U &&value) const
1361 -> typename std::enable_if<_ShrOperationHelper<T, U>::value, typename _ShrOperationHelper<T, U>::type>::type
1362 {
1363 return this->Get() >> std::forward<U>(value);
1364 }
1365
1369 template <typename D, typename U>
1371 -> typename std::enable_if<_ShrOperationHelper<T, U>::value, typename _ShrOperationHelper<T, U>::type>::type
1372 {
1373 return this->Get() >> prop.Get();
1374 }
1375
1379 template <typename U>
1380 auto operator&&(U &&value) const
1381 -> typename std::enable_if<_LogicAndOperationHelper<T, U>::value, typename _LogicAndOperationHelper<T, U>::type>::type
1382 {
1383 return this->Get() && std::forward<U>(value);
1384 }
1385
1389 template <typename D, typename U>
1391 -> typename std::enable_if<_LogicAndOperationHelper<T, U>::value, typename _LogicAndOperationHelper<T, U>::type>::type
1392 {
1393 return this->Get() && prop.Get();
1394 }
1395
1399 template <typename U>
1400 auto operator||(U &&value) const
1401 -> typename std::enable_if<_LogicOrOperationHelper<T, U>::value, typename _LogicOrOperationHelper<T, U>::type>::type
1402 {
1403 return this->Get() || std::forward<U>(value);
1404 }
1405
1409 template <typename D, typename U>
1411 -> typename std::enable_if<_LogicOrOperationHelper<T, U>::value, typename _LogicOrOperationHelper<T, U>::type>::type
1412 {
1413 return this->Get() || prop.Get();
1414 }
1415
1419 template <typename U>
1420 auto operator[](U &&value) const
1421 -> typename std::enable_if<
1423 !std::is_reference<typename _BracketOperationHelper<T, U>::type>::value,
1425 {
1426 return this->Get()[std::forward<U>(value)];
1427 }
1428
1432 template <typename D, typename U>
1434 -> typename std::enable_if<
1436 !std::is_reference<typename _BracketOperationHelper<T, U>::type>::value,
1438 {
1439 return this->Get()[prop.Get()];
1440 }
1441
1445 template <typename U>
1446 auto operator[](U &&value) const
1447 -> typename std::enable_if<
1448 _BracketOperationHelper<T, U>::value && std::is_pointer<T>::value,
1450 {
1451 return this->Get()[std::forward<U>(value)];
1452 }
1453
1457 template <typename D, typename U>
1459 -> typename std::enable_if<
1460 _BracketOperationHelper<T, U>::value && std::is_pointer<T>::value,
1462 {
1463 return this->Get()[prop.Get()];
1464 }
1465
1466 protected:
1470 static constexpr std::ptrdiff_t _STATICOFFSET =
1471 (std::numeric_limits<std::ptrdiff_t>::max)();
1472
1476 std::ptrdiff_t _offset{_STATICOFFSET};
1477
1482 {
1483 return _offset == _STATICOFFSET;
1484 }
1485
1489 void SetOwner(void *owner) noexcept
1490 {
1491 if (owner == nullptr) {
1493 } else {
1494 _offset = reinterpret_cast<uint8_t *>(owner) - reinterpret_cast<uint8_t *>(this);
1495 }
1496 }
1497
1502 {
1503 if (this->IsStatic()) {
1504 return nullptr;
1505 } else {
1506 return const_cast<uint8_t *>(reinterpret_cast<const uint8_t *>(this)) + _offset;
1507 }
1508 }
1509
1510 public:
1514 template <typename TOwner>
1519
1527 };
1528
1529 /*================================================================================*/
1530
1534 template <typename D, typename T, typename U>
1535 auto operator+(T &&left, const PropertyBase<U, D> &right)
1536 -> typename std::enable_if<!_IsProperty<T>::value && _AddOperationHelper<T, U>::value, typename _AddOperationHelper<T, U>::type>::type
1537 {
1538 return std::forward<T>(left) + right.Get();
1539 }
1540
1544 template <typename D, typename T, typename U>
1545 auto operator-(T &&left, const PropertyBase<U, D> &right)
1546 -> typename std::enable_if<!_IsProperty<T>::value && _SubOperationHelper<T, U>::value, typename _SubOperationHelper<T, U>::type>::type
1547 {
1548 return std::forward<T>(left) - right.Get();
1549 }
1550
1554 template <typename D, typename T, typename U>
1555 auto operator*(T &&left, const PropertyBase<U, D> &right)
1556 -> typename std::enable_if<!_IsProperty<T>::value && _MulOperationHelper<T, U>::value, typename _MulOperationHelper<T, U>::type>::type
1557 {
1558 return std::forward<T>(left) * right.Get();
1559 }
1560
1564 template <typename D, typename T, typename U>
1565 auto operator/(T &&left, const PropertyBase<U, D> &right)
1566 -> typename std::enable_if<!_IsProperty<T>::value && _DivOperationHelper<T, U>::value, typename _DivOperationHelper<T, U>::type>::type
1567 {
1568 return std::forward<T>(left) / right.Get();
1569 }
1570
1574 template <typename D, typename T, typename U>
1575 auto operator%(T &&left, const PropertyBase<U, D> &right)
1576 -> typename std::enable_if<!_IsProperty<T>::value && _ModOperationHelper<T, U>::value, typename _ModOperationHelper<T, U>::type>::type
1577 {
1578 return std::forward<T>(left) % right.Get();
1579 }
1580
1584 template <typename D, typename T, typename U>
1585 auto operator==(T &&left, const PropertyBase<U, D> &right)
1586 -> typename std::enable_if<!_IsProperty<T>::value && _EqOperationHelper<T, U>::value, typename _EqOperationHelper<T, U>::type>::type
1587 {
1588 return std::forward<T>(left) == right.Get();
1589 }
1590
1595 template <typename D, typename T, typename U>
1596 auto operator!=(T &&left, const PropertyBase<U, D> &right)
1597 -> typename std::enable_if<!_IsProperty<T>::value && _EqOperationHelper<T, U>::value, typename _EqOperationHelper<T, U>::type>::type
1598 {
1599 return !(std::forward<T>(left) == right);
1600 }
1601
1605 template <typename D, typename T, typename U>
1606 auto operator<(T &&left, const PropertyBase<U, D> &right)
1607 -> typename std::enable_if<!_IsProperty<T>::value && _LtOperationHelper<T, U>::value, typename _LtOperationHelper<T, U>::type>::type
1608 {
1609 return std::forward<T>(left) < right.Get();
1610 }
1611
1615 template <typename D, typename T, typename U>
1616 auto operator<=(T &&left, const PropertyBase<U, D> &right)
1617 -> typename std::enable_if<!_IsProperty<T>::value && _LeOperationHelper<T, U>::value, typename _LeOperationHelper<T, U>::type>::type
1618 {
1619 return std::forward<T>(left) <= right.Get();
1620 }
1621
1625 template <typename D, typename T, typename U>
1626 auto operator>(T &&left, const PropertyBase<U, D> &right)
1627 -> typename std::enable_if<!_IsProperty<T>::value && _GtOperationHelper<T, U>::value, typename _GtOperationHelper<T, U>::type>::type
1628 {
1629 return std::forward<T>(left) > right.Get();
1630 }
1631
1635 template <typename D, typename T, typename U>
1636 auto operator>=(T &&left, const PropertyBase<U, D> &right)
1637 -> typename std::enable_if<!_IsProperty<T>::value && _GeOperationHelper<T, U>::value, typename _GeOperationHelper<T, U>::type>::type
1638 {
1639 return std::forward<T>(left) >= right.Get();
1640 }
1641
1645 template <typename D, typename T, typename U>
1646 auto operator&(T &&left, const PropertyBase<U, D> &right)
1647 -> typename std::enable_if<!_IsProperty<T>::value && _BitAndOperationHelper<T, U>::value, typename _BitAndOperationHelper<T, U>::type>::type
1648 {
1649 return std::forward<T>(left) & right.Get();
1650 }
1651
1655 template <typename D, typename T, typename U>
1656 auto operator|(T &&left, const PropertyBase<U, D> &right)
1657 -> typename std::enable_if<!_IsProperty<T>::value && _BitOrOperationHelper<T, U>::value, typename _BitOrOperationHelper<T, U>::type>::type
1658 {
1659 return std::forward<T>(left) | right.Get();
1660 }
1661
1665 template <typename D, typename T, typename U>
1666 auto operator^(T &&left, const PropertyBase<U, D> &right)
1667 -> typename std::enable_if<!_IsProperty<T>::value && _BitXorOperationHelper<T, U>::value, typename _BitXorOperationHelper<T, U>::type>::type
1668 {
1669 return std::forward<T>(left) ^ right.Get();
1670 }
1671
1675 template <typename D, typename T, typename U>
1676 auto operator<<(T &&left, const PropertyBase<U, D> &right)
1677 -> typename std::enable_if<!_IsProperty<T>::value && _ShlOperationHelper<T, U>::value, typename _ShlOperationHelper<T, U>::type>::type
1678 {
1679 return std::forward<T>(left) << right.Get();
1680 }
1681
1685 template <typename D, typename T, typename U>
1686 auto operator>>(T &&left, const PropertyBase<U, D> &right)
1687 -> typename std::enable_if<!_IsProperty<T>::value && _ShrOperationHelper<T, U>::value, typename _ShrOperationHelper<T, U>::type>::type
1688 {
1689 return std::forward<T>(left) >> right.Get();
1690 }
1691
1695 template <typename D, typename T, typename U>
1696 auto operator&&(T &&left, const PropertyBase<U, D> &right)
1697 -> typename std::enable_if<!_IsProperty<T>::value && _LogicAndOperationHelper<T, U>::value, typename _LogicAndOperationHelper<T, U>::type>::type
1698 {
1699 return std::forward<T>(left) && right.Get();
1700 }
1701
1705 template <typename D, typename T, typename U>
1706 auto operator||(T &&left, const PropertyBase<U, D> &right)
1707 -> typename std::enable_if<!_IsProperty<T>::value && _LogicOrOperationHelper<T, U>::value, typename _LogicOrOperationHelper<T, U>::type>::type
1708 {
1709 return std::forward<T>(left) || right.Get();
1710 }
1711
1712 /*================================================================================*/
1713
1717 template <typename T>
1718 class Property : public PropertyBase<T, Property<T>>
1719 {
1720 public:
1722 using TValue = typename TBase::TValue;
1723 using TSetterParam = typename TBase::TSetterParam;
1724 using TGetter = T (*)(void *);
1725 using TSetter = void (*)(void *, TSetterParam);
1726 using TStaticGetter = T (*)();
1727 using TStaticSetter = void (*)(TSetterParam);
1728
1729 private:
1733 void *_getter;
1734
1738 void *_setter;
1739
1740 public:
1744 using TBase::operator=;
1745
1749 template <typename TOwner>
1751 {
1752 assert(initializer._owner != nullptr);
1753 assert(initializer._getter != nullptr);
1754 assert(initializer._setter != nullptr);
1755
1756 this->SetOwner(initializer._owner);
1757 this->_getter = reinterpret_cast<void *>(initializer._getter);
1758 this->_setter = reinterpret_cast<void *>(initializer._setter);
1759 }
1760
1765 {
1766 assert(initializer._getter != nullptr);
1767 assert(initializer._setter != nullptr);
1768
1769 this->SetOwner(nullptr);
1770 this->_getter = reinterpret_cast<void *>(initializer._getter);
1771 this->_setter = reinterpret_cast<void *>(initializer._setter);
1772 }
1773
1777 T GetterImpl() const
1778 {
1779 if (this->IsStatic()) {
1780 return reinterpret_cast<TStaticGetter>(this->_getter)();
1781 } else {
1782 return reinterpret_cast<TGetter>(this->_getter)(this->GetOwner());
1783 }
1784 }
1785
1789 void SetterImpl(TSetterParam value) const
1790 {
1791 if (this->IsStatic()) {
1792 reinterpret_cast<TStaticSetter>(this->_setter)(value);
1793 } else {
1794 reinterpret_cast<TSetter>(this->_setter)(this->GetOwner(), value);
1795 }
1796 }
1797 };
1798
1802 template <typename T>
1803 class ReadOnlyProperty : public PropertyBase<T, ReadOnlyProperty<T>>
1804 {
1805 public:
1807 using TValue = typename TBase::TValue;
1808 using TSetterParam = typename TBase::TSetterParam;
1809 using TGetter = T (*)(void *);
1810 using TStaticGetter = T (*)();
1811
1812 private:
1816 void *_getter;
1817
1818 public:
1822 template <typename TOwner>
1824 {
1825 assert(initializer._owner != nullptr);
1826 assert(initializer._getter != nullptr);
1827
1828 this->SetOwner(initializer._owner);
1829 this->_getter = reinterpret_cast<void *>(initializer._getter);
1830 }
1831
1836 {
1837 assert(initializer._getter != nullptr);
1838
1839 this->SetOwner(nullptr);
1840 this->_getter = reinterpret_cast<void *>(initializer._getter);
1841 }
1842
1846 T GetterImpl() const
1847 {
1848 if (this->IsStatic()) {
1849 return reinterpret_cast<TStaticGetter>(this->_getter)();
1850 } else {
1851 return reinterpret_cast<TGetter>(this->_getter)(this->GetOwner());
1852 }
1853 }
1854 };
1855
1859 template <typename T>
1860 class WriteOnlyProperty : public PropertyBase<T, WriteOnlyProperty<T>>
1861 {
1862 public:
1864 using TValue = typename TBase::TValue;
1865 using TSetterParam = typename TBase::TSetterParam;
1866 using TSetter = void (*)(void *, TSetterParam);
1867 using TStaticSetter = void (*)(TSetterParam);
1868
1869 private:
1873 void *_setter;
1874
1875 public:
1879 using TBase::operator=;
1880
1884 template <typename TOwner>
1886 {
1887 assert(initializer._owner != nullptr);
1888 assert(initializer._setter != nullptr);
1889
1890 this->SetOwner(initializer._owner);
1891 this->_setter = reinterpret_cast<void *>(initializer._setter);
1892 }
1893
1898 {
1899 assert(initializer._setter != nullptr);
1900
1901 this->SetOwner(nullptr);
1902 this->_setter = reinterpret_cast<void *>(initializer._setter);
1903 }
1904
1908 void SetterImpl(TSetterParam value) const
1909 {
1910 if (this->IsStatic()) {
1911 reinterpret_cast<TStaticSetter>(this->_setter)(value);
1912 } else {
1913 reinterpret_cast<TSetter>(this->_setter)(this->GetOwner(), value);
1914 }
1915 }
1916 };
1917}
1918
1919/*================================================================================*/
1920
1925#include <string>
1926
1927#define _SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(T) \
1928 extern template class sw::Property<T>; \
1929 extern template class sw::ReadOnlyProperty<T>; \
1930 extern template class sw::WriteOnlyProperty<T>
1931
1932#define _SW_DEFINE_EXTERN_PROPERTY_TEMPLATE(T) \
1933 template class sw::Property<T>; \
1934 template class sw::ReadOnlyProperty<T>; \
1935 template class sw::WriteOnlyProperty<T>
1936
1937_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(bool);
1938_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(float);
1939_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(double);
1940_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(int8_t);
1941_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(int16_t);
1942_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(int32_t);
1943_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(int64_t);
1944_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(uint8_t);
1945_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(uint16_t);
1946_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(uint32_t);
1947_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(uint64_t);
1948_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(std::string);
1949_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(std::wstring);
值转换器接口
Definition IValueConverter.h:14
成员属性初始化器
Definition Property.h:236
MemberPropertyInitializer & Setter()
设置成员函数setter
Definition Property.h:312
MemberPropertyInitializer & Getter(TValue(*getter)(TOwner *))
设置getter
Definition Property.h:269
MemberPropertyInitializer(TOwner *owner)
构造成员属性初始化器
Definition Property.h:261
MemberPropertyInitializer & Setter(void(*setter)(TOwner *, _PropertySetterParamType< TValue >))
设置setter
Definition Property.h:278
MemberPropertyInitializer & Getter()
设置成员函数getter
Definition Property.h:288
属性基类模板
Definition Property.h:413
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:1458
static StaticPropertyInitializer< T > Init()
获取静态属性初始化器
Definition Property.h:1523
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:1446
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:1168
void SetOwner(void *owner) noexcept
设置属性所有者对象,nullptr表示静态属性
Definition Property.h:1489
auto operator/=(U &&value) -> typename std::enable_if< _DivOperationHelper< T, U >::value, TDerived & >::type
除赋值运算
Definition Property.h:666
auto operator*() const -> typename std::enable_if< _DerefOperationHelper< U >::value, typename _DerefOperationHelper< U >::type >::type
解引用运算
Definition Property.h:1018
auto operator++(int) const -> typename std::enable_if< _AddOperationHelper< U, int >::value, T >::type
后置自增运算
Definition Property.h:754
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:1250
auto operator>>(U &&value) const -> typename std::enable_if< _ShrOperationHelper< T, U >::value, typename _ShrOperationHelper< T, U >::type >::type
右移运算
Definition Property.h:1360
auto operator%(U &&value) const -> typename std::enable_if< _ModOperationHelper< T, U >::value, typename _ModOperationHelper< T, U >::type >::type
取模运算
Definition Property.h:1138
T Get() const
获取属性值
Definition Property.h:442
auto operator/=(U &&value) const -> typename std::enable_if< _DivOperationHelper< T, U >::value, const TDerived & >::type
除赋值运算
Definition Property.h:677
auto operator>>=(U &&value) const -> typename std::enable_if< _ShrOperationHelper< T, U >::value, const TDerived & >::type
右移赋值运算
Definition Property.h:965
auto operator--(int) const -> typename std::enable_if< _SubOperationHelper< U, int >::value, T >::type
后置自减运算
Definition Property.h:766
auto operator||(U &&value) const -> typename std::enable_if< _LogicOrOperationHelper< T, U >::value, typename _LogicOrOperationHelper< T, U >::type >::type
逻辑或运算
Definition Property.h:1400
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:1108
auto operator<<=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _ShlOperationHelper< T, U >::value, const TDerived & >::type
左移赋值运算
Definition Property.h:943
auto operator+(U &&value) const -> typename std::enable_if< _AddOperationHelper< T, U >::value, typename _AddOperationHelper< T, U >::type >::type
加法运算
Definition Property.h:1058
auto operator^=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _BitXorOperationHelper< T, U >::value, const TDerived & >::type
按位异或赋值运算
Definition Property.h:899
auto operator&() const -> typename std::enable_if< _AddrOperationHelper< U >::value, typename _AddrOperationHelper< U >::type >::type
地址运算
Definition Property.h:1028
auto operator|(U &&value) const -> typename std::enable_if< _BitOrOperationHelper< T, U >::value, typename _BitOrOperationHelper< T, U >::type >::type
按位或运算
Definition Property.h:1300
auto operator--() const -> typename std::enable_if< _SubOperationHelper< U, int >::value, const TDerived & >::type
前置自减运算
Definition Property.h:743
auto operator&=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _BitAndOperationHelper< T, U >::value, const TDerived & >::type
按位与赋值运算
Definition Property.h:811
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:1350
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:1310
auto operator>=(U &&value) const -> typename std::enable_if< _GeOperationHelper< T, U >::value, typename _GeOperationHelper< T, U >::type >::type
大于等于运算
Definition Property.h:1260
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:1068
auto operator/(U &&value) const -> typename std::enable_if< _DivOperationHelper< T, U >::value, typename _DivOperationHelper< T, U >::type >::type
除法运算
Definition Property.h:1118
const TDerived & operator=(TSetterParam value) const
设置属性值
Definition Property.h:506
const TDerived & operator=(const PropertyBase &prop) const
设置属性值
Definition Property.h:524
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:1433
auto operator/=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _DivOperationHelper< T, U >::value, TDerived & >::type
除赋值运算
Definition Property.h:688
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:1190
auto operator++() -> typename std::enable_if< _AddOperationHelper< U, int >::value, TDerived & >::type
前置自增运算
Definition Property.h:710
auto operator==(U &&value) const -> typename std::enable_if< _EqOperationHelper< T, U >::value, typename _EqOperationHelper< T, U >::type >::type
等于运算
Definition Property.h:1158
auto operator|=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _BitOrOperationHelper< T, U >::value, TDerived & >::type
按位或赋值运算
Definition Property.h:844
auto operator+=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _AddOperationHelper< T, U >::value, TDerived & >::type
加赋值运算
Definition Property.h:556
std::ptrdiff_t _offset
所有者对象相对于当前属性对象的偏移量
Definition Property.h:1476
auto operator|=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _BitOrOperationHelper< T, U >::value, const TDerived & >::type
按位或赋值运算
Definition Property.h:855
auto operator&=(U &&value) -> typename std::enable_if< _BitAndOperationHelper< T, U >::value, TDerived & >::type
按位与赋值运算
Definition Property.h:778
static constexpr std::ptrdiff_t _STATICOFFSET
静态属性偏移量标记
Definition Property.h:1470
auto operator<(U &&value) const -> typename std::enable_if< _LtOperationHelper< T, U >::value, typename _LtOperationHelper< T, U >::type >::type
小于运算
Definition Property.h:1200
auto operator-() const -> typename std::enable_if< _UnaryMinusOperationHelper< U >::value, typename _UnaryMinusOperationHelper< U >::type >::type
负号运算
Definition Property.h:1048
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:1410
auto operator-=(U &&value) -> typename std::enable_if< _SubOperationHelper< T, U >::value, TDerived & >::type
减赋值运算
Definition Property.h:578
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:1088
TDerived & operator=(const PropertyBase &prop)
设置属性值
Definition Property.h:515
auto operator>(U &&value) const -> typename std::enable_if< _GtOperationHelper< T, U >::value, typename _GtOperationHelper< T, U >::type >::type
大于运算
Definition Property.h:1240
auto operator*(U &&value) const -> typename std::enable_if< _MulOperationHelper< T, U >::value, typename _MulOperationHelper< T, U >::type >::type
乘法运算
Definition Property.h:1098
auto operator&=(U &&value) const -> typename std::enable_if< _BitAndOperationHelper< T, U >::value, const TDerived & >::type
按位与赋值运算
Definition Property.h:789
auto operator--() -> typename std::enable_if< _SubOperationHelper< U, int >::value, TDerived & >::type
前置自减运算
Definition Property.h:732
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:1230
auto operator>>=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _ShrOperationHelper< T, U >::value, const TDerived & >::type
右移赋值运算
Definition Property.h:987
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:1290
auto operator&&(U &&value) const -> typename std::enable_if< _LogicAndOperationHelper< T, U >::value, typename _LogicAndOperationHelper< T, U >::type >::type
逻辑与运算
Definition Property.h:1380
auto operator~() const -> typename std::enable_if< _BitNotOperationHelper< U >::value, typename _BitNotOperationHelper< U >::type >::type
按位非运算
Definition Property.h:1008
static MemberPropertyInitializer< TOwner, T > Init(TOwner *owner)
获取成员属性初始化器
Definition Property.h:1515
auto operator-=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _SubOperationHelper< T, U >::value, TDerived & >::type
减赋值运算
Definition Property.h:600
auto operator-(U &&value) const -> typename std::enable_if< _SubOperationHelper< T, U >::value, typename _SubOperationHelper< T, U >::type >::type
减法运算
Definition Property.h:1078
void Set(TSetterParam value) const
设置属性值
Definition Property.h:450
auto operator++() const -> typename std::enable_if< _AddOperationHelper< U, int >::value, const TDerived & >::type
前置自增运算
Definition Property.h:721
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:1420
auto operator*=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _MulOperationHelper< T, U >::value, const TDerived & >::type
乘赋值运算
Definition Property.h:655
auto operator^=(U &&value) -> typename std::enable_if< _BitXorOperationHelper< T, U >::value, TDerived & >::type
按位异或赋值运算
Definition Property.h:866
bool IsStatic() const noexcept
判断属性是否为静态属性
Definition Property.h:1481
auto operator^(U &&value) const -> typename std::enable_if< _BitXorOperationHelper< T, U >::value, typename _BitXorOperationHelper< T, U >::type >::type
按位异或运算
Definition Property.h:1320
auto operator<<(U &&value) const -> typename std::enable_if< _ShlOperationHelper< T, U >::value, typename _ShlOperationHelper< T, U >::type >::type
左移运算
Definition Property.h:1340
auto operator<<=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _ShlOperationHelper< T, U >::value, TDerived & >::type
左移赋值运算
Definition Property.h:932
auto operator!=(U &&value) const -> typename std::enable_if< _EqOperationHelper< T, U >::value, typename _EqOperationHelper< T, U >::type >::type
不等于运算
Definition Property.h:1179
auto operator->() const
取属性字段
Definition Property.h:458
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:1390
auto operator|=(U &&value) -> typename std::enable_if< _BitOrOperationHelper< T, U >::value, TDerived & >::type
按位或赋值运算
Definition Property.h:822
auto operator<<=(U &&value) const -> typename std::enable_if< _ShlOperationHelper< T, U >::value, const TDerived & >::type
左移赋值运算
Definition Property.h:921
auto operator&=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _BitAndOperationHelper< T, U >::value, TDerived & >::type
按位与赋值运算
Definition Property.h:800
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:1148
auto operator+=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _AddOperationHelper< T, U >::value, const TDerived & >::type
加赋值运算
Definition Property.h:567
auto operator+=(U &&value) -> typename std::enable_if< _AddOperationHelper< T, U >::value, TDerived & >::type
加赋值运算
Definition Property.h:534
auto operator&(U &&value) const -> typename std::enable_if< _BitAndOperationHelper< T, U >::value, typename _BitAndOperationHelper< T, U >::type >::type
按位与运算
Definition Property.h:1280
auto operator|=(U &&value) const -> typename std::enable_if< _BitOrOperationHelper< T, U >::value, const TDerived & >::type
按位或赋值运算
Definition Property.h:833
auto operator<<=(U &&value) -> typename std::enable_if< _ShlOperationHelper< T, U >::value, TDerived & >::type
左移赋值运算
Definition Property.h:910
auto operator+=(U &&value) const -> typename std::enable_if< _AddOperationHelper< T, U >::value, const TDerived & >::type
加赋值运算
Definition Property.h:545
auto operator-=(U &&value) const -> typename std::enable_if< _SubOperationHelper< T, U >::value, const TDerived & >::type
减赋值运算
Definition Property.h:589
FieldsAccessor< T > AccessFields() const
访问属性字段,可由子类重写
Definition Property.h:434
auto operator<=(U &&value) const -> typename std::enable_if< _LeOperationHelper< T, U >::value, typename _LeOperationHelper< T, U >::type >::type
小于等于运算
Definition Property.h:1220
auto operator>>=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _ShrOperationHelper< T, U >::value, TDerived & >::type
右移赋值运算
Definition Property.h:976
auto operator!() const -> typename std::enable_if< _LogicNotOperationHelper< U >::value, typename _LogicNotOperationHelper< U >::type >::type
逻辑非运算
Definition Property.h:998
auto operator*=(U &&value) -> typename std::enable_if< _MulOperationHelper< T, U >::value, TDerived & >::type
乘赋值运算
Definition Property.h:622
void * GetOwner() const noexcept
获取属性所有者对象,当属性为静态属性时返回nullptr
Definition Property.h:1501
auto operator>>=(U &&value) -> typename std::enable_if< _ShrOperationHelper< T, U >::value, TDerived & >::type
右移赋值运算
Definition Property.h:954
auto operator^=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _BitXorOperationHelper< T, U >::value, TDerived & >::type
按位异或赋值运算
Definition Property.h:888
TDerived & operator=(TSetterParam value)
设置属性值
Definition Property.h:497
auto operator-=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _SubOperationHelper< T, U >::value, const TDerived & >::type
减赋值运算
Definition Property.h:611
auto operator/=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _DivOperationHelper< T, U >::value, const TDerived & >::type
除赋值运算
Definition Property.h:699
auto operator*=(U &&value) const -> typename std::enable_if< _MulOperationHelper< T, U >::value, const TDerived & >::type
乘赋值运算
Definition Property.h:633
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:1128
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:1330
auto operator*=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _MulOperationHelper< T, U >::value, TDerived & >::type
乘赋值运算
Definition Property.h:644
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:1370
auto operator+() const -> typename std::enable_if< _UnaryPlusOperationHelper< U >::value, typename _UnaryPlusOperationHelper< U >::type >::type
正号运算
Definition Property.h:1038
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:1210
auto operator^=(U &&value) const -> typename std::enable_if< _BitXorOperationHelper< T, U >::value, const TDerived & >::type
按位异或赋值运算
Definition Property.h:877
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:1270
属性
Definition Property.h:1719
T GetterImpl() const
获取属性值
Definition Property.h:1777
void SetterImpl(TSetterParam value) const
设置属性值
Definition Property.h:1789
Property(const MemberPropertyInitializer< TOwner, T > &initializer)
构造成员属性
Definition Property.h:1750
Property(const StaticPropertyInitializer< T > &initializer)
构造静态属性
Definition Property.h:1764
只读属性
Definition Property.h:1804
ReadOnlyProperty(const StaticPropertyInitializer< T > &initializer)
构造静态属性
Definition Property.h:1835
ReadOnlyProperty(const MemberPropertyInitializer< TOwner, T > &initializer)
构造成员属性
Definition Property.h:1823
T GetterImpl() const
获取属性值
Definition Property.h:1846
静态属性初始化器
Definition Property.h:362
StaticPropertyInitializer()
构造静态属性初始化器
Definition Property.h:382
StaticPropertyInitializer & Setter(void(*setter)(_PropertySetterParamType< TValue >))
设置setter
Definition Property.h:399
StaticPropertyInitializer & Getter(TValue(*getter)())
设置getter
Definition Property.h:390
只写属性
Definition Property.h:1861
void SetterImpl(TSetterParam value) const
设置属性值
Definition Property.h:1908
WriteOnlyProperty(const MemberPropertyInitializer< TOwner, T > &initializer)
构造成员属性
Definition Property.h:1885
WriteOnlyProperty(const StaticPropertyInitializer< T > &initializer)
构造静态属性
Definition Property.h:1897
字段访问器,用于实现使用operator->取属性字段
Definition Property.h:188
std::enable_if< std::is_pointer< U >::value, U >::type operator->()
指针类型,直接返回值
Definition Property.h:207
T value
字段访问器所维护的值
Definition Property.h:192
FieldsAccessor(Args &&...args)
构造字段访问器
Definition Property.h:198
std::enable_if<!std::is_pointer< U >::value &&!_HasArrowOperator< U >::value, U * >::type operator->()
非指针类型,且无operator->,返回值的地址
Definition Property.h:216
std::enable_if<!std::is_pointer< U >::value &&_HasArrowOperator< U >::value, typename_HasArrowOperator< U >::type >::type operator->()
非指针类型,且有operator->,转发operator->
Definition Property.h:225
判断类型是否可以使用[]操作符的辅助模板
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