10#define _SW_DEFINE_OPERATION_HELPER(NAME, OP) \
11 template <typename T, typename U, typename = void> \
12 struct NAME : std::false_type { \
14 template <typename T, typename U> \
15 struct NAME<T, U, decltype(void(std::declval<T>() OP std::declval<U>()))> : std::true_type { \
16 using type = decltype(std::declval<T>() OP std::declval<U>()); \
19#define _SW_DEFINE_UNARY_OPERATION_HELPER(NAME, OP) \
20 template <typename T, typename = void> \
21 struct NAME : std::false_type { \
23 template <typename T> \
24 struct NAME<T, decltype(void(OP std::declval<T>()))> : std::true_type { \
25 using type = decltype(OP std::declval<T>()); \
34 template <
typename T,
typename TDerived>
41 class ReadOnlyProperty;
44 class WriteOnlyProperty;
49 _SW_DEFINE_OPERATION_HELPER(_AddOperationHelper, +);
50 _SW_DEFINE_OPERATION_HELPER(_SubOperationHelper, -);
51 _SW_DEFINE_OPERATION_HELPER(_MulOperationHelper, *);
52 _SW_DEFINE_OPERATION_HELPER(_DivOperationHelper, /);
53 _SW_DEFINE_OPERATION_HELPER(_ModOperationHelper, %);
54 _SW_DEFINE_OPERATION_HELPER(_EqOperationHelper, ==);
55 _SW_DEFINE_OPERATION_HELPER(_NeOperationHelper, !=);
56 _SW_DEFINE_OPERATION_HELPER(_LtOperationHelper, <);
57 _SW_DEFINE_OPERATION_HELPER(_LeOperationHelper, <=);
58 _SW_DEFINE_OPERATION_HELPER(_GtOperationHelper, >);
59 _SW_DEFINE_OPERATION_HELPER(_GeOperationHelper, >=);
60 _SW_DEFINE_OPERATION_HELPER(_BitAndOperationHelper, &);
61 _SW_DEFINE_OPERATION_HELPER(_BitOrOperationHelper, |);
62 _SW_DEFINE_OPERATION_HELPER(_BitXorOperationHelper, ^);
63 _SW_DEFINE_OPERATION_HELPER(_ShlOperationHelper, <<);
64 _SW_DEFINE_OPERATION_HELPER(_ShrOperationHelper, >>);
65 _SW_DEFINE_OPERATION_HELPER(_LogicAndOperationHelper, &&);
66 _SW_DEFINE_OPERATION_HELPER(_LogicOrOperationHelper, ||);
67 _SW_DEFINE_UNARY_OPERATION_HELPER(_LogicNotOperationHelper, !);
68 _SW_DEFINE_UNARY_OPERATION_HELPER(_BitNotOperationHelper, ~);
69 _SW_DEFINE_UNARY_OPERATION_HELPER(_DerefOperationHelper, *);
70 _SW_DEFINE_UNARY_OPERATION_HELPER(_AddrOperationHelper, &);
71 _SW_DEFINE_UNARY_OPERATION_HELPER(_UnaryPlusOperationHelper, +);
72 _SW_DEFINE_UNARY_OPERATION_HELPER(_UnaryMinusOperationHelper, -);
82 template <
typename U,
typename V>
84 static std::false_type test(...);
87 using type =
decltype(test(std::declval<T *>()));
100 template <
typename,
typename =
void>
107 template <
typename T>
109 T, decltype(void(&T::GetterImpl))> : std::true_type {
115 template <
typename,
typename =
void>
122 template <
typename T>
124 T, decltype(void(&T::SetterImpl))> : std::true_type {
130 template <
typename T>
132 : std::integral_constant<bool, _IsProperty<T>::value && _HasGetterImpl<T>::value> {
138 template <
typename T>
140 : std::integral_constant<bool, _IsProperty<T>::value && _HasSetterImpl<T>::value> {
146 template <
typename T,
typename U,
typename =
void>
153 template <
typename T,
typename U>
155 T, U, decltype(void(std::declval<T>()[std::declval<U>()]))> : std::true_type {
156 using type =
decltype(std::declval<T>()[std::declval<U>()]);
162 template <
typename TFrom,
typename TTo,
typename =
void>
169 template <
typename TFrom,
typename TTo>
171 TFrom, TTo, decltype(void(static_cast<TTo>(std::declval<TFrom>())))> : std::true_type {
177 template <
typename T,
typename =
void>
184 template <
typename T>
186 T, decltype(void(std::declval<T>().operator->()))> : std::true_type {
187 using type =
decltype(std::declval<T>().operator->());
193 template <
typename T>
195 using type =
typename std::conditional<
196 std::is_scalar<T>::value, T,
const T &>::type;
202 template <
typename T>
203 using _PropertySetterParamType =
211 template <
typename T>
221 template <
typename... Args>
223 :
value(std::forward<Args>(args)...)
230 template <
typename U = T>
231 typename std::enable_if<std::is_pointer<U>::value, U>::type
operator->()
239 template <
typename U = T>
248 template <
typename U = T>
251 return this->value.operator->();
258 template <
typename TOwner,
typename TValue>
274 TValue (*_getter)(TOwner *);
279 void (*_setter)(TOwner *, _PropertySetterParamType<TValue>);
286 : _owner(owner), _getter(nullptr), _setter(nullptr)
295 this->_getter = getter;
304 this->_setter = setter;
311 template <TValue (TOwner::*getter)()>
315 [](TOwner *owner) -> TValue {
316 return (owner->*getter)();
323 template <TValue (TOwner::*getter)() const>
327 [](TOwner *owner) -> TValue {
328 return (owner->*getter)();
335 template <
void (TOwner::*setter)(_PropertySetterParamType<TValue>)>
339 [](TOwner *owner, _PropertySetterParamType<TValue> value) {
340 (owner->*setter)(value);
347 template <
void (TOwner::*setter)(_PropertySetterParamType<TValue>) const>
351 [](TOwner *owner, _PropertySetterParamType<TValue> value) {
352 (owner->*setter)(value);
359 template <TValue TOwner::*field>
363 [](TOwner *owner) -> TValue {
364 return owner->*field;
371 template <TValue TOwner::*field>
375 [](TOwner *owner, _PropertySetterParamType<TValue> value) {
376 owner->*field = value;
384 template <
typename TValue>
400 void (*_setter)(_PropertySetterParamType<TValue>);
407 : _getter(nullptr), _setter(nullptr)
416 this->_getter = getter;
425 this->_setter = setter;
435 template <
typename T,
typename TDerived>
443 using TSetterParam = _PropertySetterParamType<T>;
468 return static_cast<const TDerived *
>(
this)->GetterImpl();
474 void Set(TSetterParam value)
const
476 static_cast<const TDerived *
>(
this)->SetterImpl(value);
484 return static_cast<const TDerived *
>(
this)->
AccessFields();
500 typename =
typename std::enable_if<!std::is_arithmetic<T>::value && std::is_convertible<T, U>::value, U>::type>
503 return static_cast<U
>(this->
Get());
511 typename =
typename std::enable_if<!std::is_arithmetic<T>::value && !std::is_convertible<T, U>::value, U>::type,
513 explicit operator U()
const
515 return static_cast<U
>(this->
Get());
524 return *
static_cast<TDerived *
>(
this);
533 return *
static_cast<const TDerived *
>(
this);
542 return *
static_cast<TDerived *
>(
this);
551 return *
static_cast<const TDerived *
>(
this);
557 template <
typename U>
559 ->
typename std::enable_if<_AddOperationHelper<T, U>::value, TDerived &>::type
561 this->
Set(this->
Get() + std::forward<U>(value));
562 return *
static_cast<TDerived *
>(
this);
568 template <
typename U>
570 ->
typename std::enable_if<_AddOperationHelper<T, U>::value,
const TDerived &>::type
572 this->
Set(this->
Get() + std::forward<U>(value));
573 return *
static_cast<const TDerived *
>(
this);
579 template <
typename D,
typename U>
581 ->
typename std::enable_if<_AddOperationHelper<T, U>::value, TDerived &>::type
583 this->
Set(this->
Get() + prop.Get());
584 return *
static_cast<TDerived *
>(
this);
590 template <
typename D,
typename U>
592 ->
typename std::enable_if<_AddOperationHelper<T, U>::value,
const TDerived &>::type
594 this->
Set(this->
Get() + prop.Get());
595 return *
static_cast<const TDerived *
>(
this);
601 template <
typename U>
603 ->
typename std::enable_if<_SubOperationHelper<T, U>::value, TDerived &>::type
605 this->
Set(this->
Get() - std::forward<U>(value));
606 return *
static_cast<TDerived *
>(
this);
612 template <
typename U>
614 ->
typename std::enable_if<_SubOperationHelper<T, U>::value,
const TDerived &>::type
616 this->
Set(this->
Get() - std::forward<U>(value));
617 return *
static_cast<const TDerived *
>(
this);
623 template <
typename D,
typename U>
625 ->
typename std::enable_if<_SubOperationHelper<T, U>::value, TDerived &>::type
627 this->
Set(this->
Get() - prop.Get());
628 return *
static_cast<TDerived *
>(
this);
634 template <
typename D,
typename U>
636 ->
typename std::enable_if<_SubOperationHelper<T, U>::value,
const TDerived &>::type
638 this->
Set(this->
Get() - prop.Get());
639 return *
static_cast<const TDerived *
>(
this);
645 template <
typename U>
647 ->
typename std::enable_if<_MulOperationHelper<T, U>::value, TDerived &>::type
649 this->
Set(this->
Get() * std::forward<U>(value));
650 return *
static_cast<TDerived *
>(
this);
656 template <
typename U>
658 ->
typename std::enable_if<_MulOperationHelper<T, U>::value,
const TDerived &>::type
660 this->
Set(this->
Get() * std::forward<U>(value));
661 return *
static_cast<const TDerived *
>(
this);
667 template <
typename D,
typename U>
669 ->
typename std::enable_if<_MulOperationHelper<T, U>::value, TDerived &>::type
671 this->
Set(this->
Get() * prop.Get());
672 return *
static_cast<TDerived *
>(
this);
678 template <
typename D,
typename U>
680 ->
typename std::enable_if<_MulOperationHelper<T, U>::value,
const TDerived &>::type
682 this->
Set(this->
Get() * prop.Get());
683 return *
static_cast<const TDerived *
>(
this);
689 template <
typename U>
691 ->
typename std::enable_if<_DivOperationHelper<T, U>::value, TDerived &>::type
693 this->
Set(this->
Get() / std::forward<U>(value));
694 return *
static_cast<TDerived *
>(
this);
700 template <
typename U>
702 ->
typename std::enable_if<_DivOperationHelper<T, U>::value,
const TDerived &>::type
704 this->
Set(this->
Get() / std::forward<U>(value));
705 return *
static_cast<const TDerived *
>(
this);
711 template <
typename D,
typename U>
713 ->
typename std::enable_if<_DivOperationHelper<T, U>::value, TDerived &>::type
715 this->
Set(this->
Get() / prop.Get());
716 return *
static_cast<TDerived *
>(
this);
722 template <
typename D,
typename U>
724 ->
typename std::enable_if<_DivOperationHelper<T, U>::value,
const TDerived &>::type
726 this->
Set(this->
Get() / prop.Get());
727 return *
static_cast<const TDerived *
>(
this);
733 template <
typename U = T>
735 ->
typename std::enable_if<_AddOperationHelper<U, int>::value, TDerived &>::type
737 this->
Set(this->
Get() + 1);
738 return *
static_cast<TDerived *
>(
this);
744 template <
typename U = T>
746 -> typename std::enable_if<_AddOperationHelper<U,
int>::value, const TDerived &>::type
748 this->
Set(this->
Get() + 1);
749 return *
static_cast<const TDerived *
>(
this);
755 template <
typename U = T>
757 ->
typename std::enable_if<_SubOperationHelper<U, int>::value, TDerived &>::type
759 this->
Set(this->
Get() - 1);
760 return *
static_cast<TDerived *
>(
this);
766 template <
typename U = T>
768 -> typename std::enable_if<_SubOperationHelper<U,
int>::value, const TDerived &>::type
770 this->
Set(this->
Get() - 1);
771 return *
static_cast<const TDerived *
>(
this);
777 template <
typename U = T>
779 ->
typename std::enable_if<_AddOperationHelper<U, int>::value, T>::type
781 T oldval = this->
Get();
782 this->
Set(oldval + 1);
789 template <
typename U = T>
791 ->
typename std::enable_if<_SubOperationHelper<U, int>::value, T>::type
793 T oldval = this->
Get();
794 this->
Set(oldval - 1);
801 template <
typename U>
803 ->
typename std::enable_if<_BitAndOperationHelper<T, U>::value, TDerived &>::type
805 this->
Set(this->
Get() & std::forward<U>(value));
806 return *
static_cast<TDerived *
>(
this);
812 template <
typename U>
814 ->
typename std::enable_if<_BitAndOperationHelper<T, U>::value,
const TDerived &>::type
816 this->
Set(this->
Get() & std::forward<U>(value));
817 return *
static_cast<const TDerived *
>(
this);
823 template <
typename D,
typename U>
825 ->
typename std::enable_if<_BitAndOperationHelper<T, U>::value, TDerived &>::type
827 this->
Set(this->
Get() & prop.Get());
828 return *
static_cast<TDerived *
>(
this);
834 template <
typename D,
typename U>
836 ->
typename std::enable_if<_BitAndOperationHelper<T, U>::value,
const TDerived &>::type
838 this->
Set(this->
Get() & prop.Get());
839 return *
static_cast<const TDerived *
>(
this);
845 template <
typename U>
847 ->
typename std::enable_if<_BitOrOperationHelper<T, U>::value, TDerived &>::type
849 this->
Set(this->
Get() | std::forward<U>(value));
850 return *
static_cast<TDerived *
>(
this);
856 template <
typename U>
858 ->
typename std::enable_if<_BitOrOperationHelper<T, U>::value,
const TDerived &>::type
860 this->
Set(this->
Get() | std::forward<U>(value));
861 return *
static_cast<const TDerived *
>(
this);
867 template <
typename D,
typename U>
869 ->
typename std::enable_if<_BitOrOperationHelper<T, U>::value, TDerived &>::type
871 this->
Set(this->
Get() | prop.Get());
872 return *
static_cast<TDerived *
>(
this);
878 template <
typename D,
typename U>
880 ->
typename std::enable_if<_BitOrOperationHelper<T, U>::value,
const TDerived &>::type
882 this->
Set(this->
Get() | prop.Get());
883 return *
static_cast<const TDerived *
>(
this);
889 template <
typename U>
891 ->
typename std::enable_if<_BitXorOperationHelper<T, U>::value, TDerived &>::type
893 this->
Set(this->
Get() ^ std::forward<U>(value));
894 return *
static_cast<TDerived *
>(
this);
900 template <
typename U>
902 ->
typename std::enable_if<_BitXorOperationHelper<T, U>::value,
const TDerived &>::type
904 this->
Set(this->
Get() ^ std::forward<U>(value));
905 return *
static_cast<const TDerived *
>(
this);
911 template <
typename D,
typename U>
913 ->
typename std::enable_if<_BitXorOperationHelper<T, U>::value, TDerived &>::type
915 this->
Set(this->
Get() ^ prop.Get());
916 return *
static_cast<TDerived *
>(
this);
922 template <
typename D,
typename U>
924 ->
typename std::enable_if<_BitXorOperationHelper<T, U>::value,
const TDerived &>::type
926 this->
Set(this->
Get() ^ prop.Get());
927 return *
static_cast<const TDerived *
>(
this);
933 template <
typename U>
935 ->
typename std::enable_if<_ShlOperationHelper<T, U>::value, TDerived &>::type
937 this->
Set(this->
Get() << std::forward<U>(value));
938 return *
static_cast<TDerived *
>(
this);
944 template <
typename U>
946 ->
typename std::enable_if<_ShlOperationHelper<T, U>::value,
const TDerived &>::type
948 this->
Set(this->
Get() << std::forward<U>(value));
949 return *
static_cast<const TDerived *
>(
this);
955 template <
typename D,
typename U>
957 ->
typename std::enable_if<_ShlOperationHelper<T, U>::value, TDerived &>::type
959 this->
Set(this->
Get() << prop.Get());
960 return *
static_cast<TDerived *
>(
this);
966 template <
typename D,
typename U>
968 ->
typename std::enable_if<_ShlOperationHelper<T, U>::value,
const TDerived &>::type
970 this->
Set(this->
Get() << prop.Get());
971 return *
static_cast<const TDerived *
>(
this);
977 template <
typename U>
979 ->
typename std::enable_if<_ShrOperationHelper<T, U>::value, TDerived &>::type
981 this->
Set(this->
Get() >> std::forward<U>(value));
982 return *
static_cast<TDerived *
>(
this);
988 template <
typename U>
990 ->
typename std::enable_if<_ShrOperationHelper<T, U>::value,
const TDerived &>::type
992 this->
Set(this->
Get() >> std::forward<U>(value));
993 return *
static_cast<const TDerived *
>(
this);
999 template <
typename D,
typename U>
1001 ->
typename std::enable_if<_ShrOperationHelper<T, U>::value, TDerived &>::type
1003 this->
Set(this->
Get() >> prop.Get());
1004 return *
static_cast<TDerived *
>(
this);
1010 template <
typename D,
typename U>
1012 ->
typename std::enable_if<_ShrOperationHelper<T, U>::value,
const TDerived &>::type
1014 this->
Set(this->
Get() >> prop.Get());
1015 return *
static_cast<const TDerived *
>(
this);
1021 template <
typename U = T>
1023 -> typename std::enable_if<_LogicNotOperationHelper<U>::value, typename _LogicNotOperationHelper<U>::type>::type
1025 return !this->
Get();
1031 template <
typename U = T>
1033 -> typename std::enable_if<_BitNotOperationHelper<U>::value, typename _BitNotOperationHelper<U>::type>::type
1035 return ~this->Get();
1041 template <
typename U = T>
1043 -> typename std::enable_if<_DerefOperationHelper<U>::value, typename _DerefOperationHelper<U>::type>::type
1045 return *this->
Get();
1051 template <
typename U = T>
1053 -> typename std::enable_if<_AddrOperationHelper<U>::value, typename _AddrOperationHelper<U>::type>::type
1055 return &this->
Get();
1061 template <
typename U = T>
1063 -> typename std::enable_if<_UnaryPlusOperationHelper<U>::value, typename _UnaryPlusOperationHelper<U>::type>::type
1065 return +this->
Get();
1071 template <
typename U = T>
1073 -> typename std::enable_if<_UnaryMinusOperationHelper<U>::value, typename _UnaryMinusOperationHelper<U>::type>::type
1075 return -this->
Get();
1081 template <
typename U>
1083 ->
typename std::enable_if<_AddOperationHelper<T, U>::value,
typename _AddOperationHelper<T, U>::type>::type
1085 return this->
Get() + std::forward<U>(value);
1091 template <
typename D,
typename U>
1093 ->
typename std::enable_if<_AddOperationHelper<T, U>::value,
typename _AddOperationHelper<T, U>::type>::type
1095 return this->
Get() + prop.Get();
1101 template <
typename U>
1103 ->
typename std::enable_if<_SubOperationHelper<T, U>::value,
typename _SubOperationHelper<T, U>::type>::type
1105 return this->
Get() - std::forward<U>(value);
1111 template <
typename D,
typename U>
1113 ->
typename std::enable_if<_SubOperationHelper<T, U>::value,
typename _SubOperationHelper<T, U>::type>::type
1115 return this->
Get() - prop.Get();
1121 template <
typename U>
1123 ->
typename std::enable_if<_MulOperationHelper<T, U>::value,
typename _MulOperationHelper<T, U>::type>::type
1125 return this->
Get() * std::forward<U>(value);
1131 template <
typename D,
typename U>
1133 ->
typename std::enable_if<_MulOperationHelper<T, U>::value,
typename _MulOperationHelper<T, U>::type>::type
1135 return this->
Get() * prop.Get();
1141 template <
typename U>
1143 ->
typename std::enable_if<_DivOperationHelper<T, U>::value,
typename _DivOperationHelper<T, U>::type>::type
1145 return this->
Get() / std::forward<U>(value);
1151 template <
typename D,
typename U>
1153 ->
typename std::enable_if<_DivOperationHelper<T, U>::value,
typename _DivOperationHelper<T, U>::type>::type
1155 return this->
Get() / prop.Get();
1161 template <
typename U>
1163 ->
typename std::enable_if<_ModOperationHelper<T, U>::value,
typename _ModOperationHelper<T, U>::type>::type
1165 return this->
Get() % std::forward<U>(value);
1171 template <
typename D,
typename U>
1173 ->
typename std::enable_if<_ModOperationHelper<T, U>::value,
typename _ModOperationHelper<T, U>::type>::type
1175 return this->
Get() % prop.Get();
1181 template <
typename U>
1183 ->
typename std::enable_if<_EqOperationHelper<T, U>::value,
typename _EqOperationHelper<T, U>::type>::type
1185 return this->
Get() == std::forward<U>(value);
1191 template <
typename D,
typename U>
1193 ->
typename std::enable_if<_EqOperationHelper<T, U>::value,
typename _EqOperationHelper<T, U>::type>::type
1195 return this->
Get() == prop.Get();
1202 template <
typename U>
1204 ->
typename std::enable_if<_EqOperationHelper<T, U>::value,
typename _EqOperationHelper<T, U>::type>::type
1206 return !(*
this == std::forward<U>(value));
1213 template <
typename D,
typename U>
1215 ->
typename std::enable_if<_EqOperationHelper<T, U>::value,
typename _EqOperationHelper<T, U>::type>::type
1217 return !(*
this == prop);
1223 template <
typename U>
1225 ->
typename std::enable_if<_LtOperationHelper<T, U>::value,
typename _LtOperationHelper<T, U>::type>::type
1227 return this->
Get() < std::forward<U>(value);
1233 template <
typename D,
typename U>
1235 ->
typename std::enable_if<_LtOperationHelper<T, U>::value,
typename _LtOperationHelper<T, U>::type>::type
1237 return this->
Get() < prop.Get();
1243 template <
typename U>
1245 ->
typename std::enable_if<_LeOperationHelper<T, U>::value,
typename _LeOperationHelper<T, U>::type>::type
1247 return this->
Get() <= std::forward<U>(value);
1253 template <
typename D,
typename U>
1255 ->
typename std::enable_if<_LeOperationHelper<T, U>::value,
typename _LeOperationHelper<T, U>::type>::type
1257 return this->
Get() <= prop.Get();
1263 template <
typename U>
1265 ->
typename std::enable_if<_GtOperationHelper<T, U>::value,
typename _GtOperationHelper<T, U>::type>::type
1267 return this->
Get() > std::forward<U>(value);
1273 template <
typename D,
typename U>
1275 ->
typename std::enable_if<_GtOperationHelper<T, U>::value,
typename _GtOperationHelper<T, U>::type>::type
1277 return this->
Get() > prop.Get();
1283 template <
typename U>
1285 ->
typename std::enable_if<_GeOperationHelper<T, U>::value,
typename _GeOperationHelper<T, U>::type>::type
1287 return this->
Get() >= std::forward<U>(value);
1293 template <
typename D,
typename U>
1295 ->
typename std::enable_if<_GeOperationHelper<T, U>::value,
typename _GeOperationHelper<T, U>::type>::type
1297 return this->
Get() >= prop.Get();
1303 template <
typename U>
1305 ->
typename std::enable_if<_BitAndOperationHelper<T, U>::value,
typename _BitAndOperationHelper<T, U>::type>::type
1307 return this->
Get() & std::forward<U>(value);
1313 template <
typename D,
typename U>
1315 ->
typename std::enable_if<_BitAndOperationHelper<T, U>::value,
typename _BitAndOperationHelper<T, U>::type>::type
1317 return this->
Get() & prop.Get();
1323 template <
typename U>
1325 ->
typename std::enable_if<_BitOrOperationHelper<T, U>::value,
typename _BitOrOperationHelper<T, U>::type>::type
1327 return this->
Get() | std::forward<U>(value);
1333 template <
typename D,
typename U>
1335 ->
typename std::enable_if<_BitOrOperationHelper<T, U>::value,
typename _BitOrOperationHelper<T, U>::type>::type
1337 return this->
Get() | prop.Get();
1343 template <
typename U>
1345 ->
typename std::enable_if<_BitXorOperationHelper<T, U>::value,
typename _BitXorOperationHelper<T, U>::type>::type
1347 return this->
Get() ^ std::forward<U>(value);
1353 template <
typename D,
typename U>
1355 ->
typename std::enable_if<_BitXorOperationHelper<T, U>::value,
typename _BitXorOperationHelper<T, U>::type>::type
1357 return this->
Get() ^ prop.Get();
1363 template <
typename U>
1365 ->
typename std::enable_if<_ShlOperationHelper<T, U>::value,
typename _ShlOperationHelper<T, U>::type>::type
1367 return this->
Get() << std::forward<U>(value);
1373 template <
typename D,
typename U>
1375 ->
typename std::enable_if<_ShlOperationHelper<T, U>::value,
typename _ShlOperationHelper<T, U>::type>::type
1377 return this->
Get() << prop.Get();
1383 template <
typename U>
1385 ->
typename std::enable_if<_ShrOperationHelper<T, U>::value,
typename _ShrOperationHelper<T, U>::type>::type
1387 return this->
Get() >> std::forward<U>(value);
1393 template <
typename D,
typename U>
1395 ->
typename std::enable_if<_ShrOperationHelper<T, U>::value,
typename _ShrOperationHelper<T, U>::type>::type
1397 return this->
Get() >> prop.Get();
1403 template <
typename U>
1405 ->
typename std::enable_if<_LogicAndOperationHelper<T, U>::value,
typename _LogicAndOperationHelper<T, U>::type>::type
1407 return this->
Get() && std::forward<U>(value);
1413 template <
typename D,
typename U>
1415 ->
typename std::enable_if<_LogicAndOperationHelper<T, U>::value,
typename _LogicAndOperationHelper<T, U>::type>::type
1417 return this->
Get() && prop.Get();
1423 template <
typename U>
1425 ->
typename std::enable_if<_LogicOrOperationHelper<T, U>::value,
typename _LogicOrOperationHelper<T, U>::type>::type
1427 return this->
Get() || std::forward<U>(value);
1433 template <
typename D,
typename U>
1435 ->
typename std::enable_if<_LogicOrOperationHelper<T, U>::value,
typename _LogicOrOperationHelper<T, U>::type>::type
1437 return this->
Get() || prop.Get();
1443 template <
typename U>
1445 ->
typename std::enable_if<
1447 !std::is_reference<typename _BracketOperationHelper<T, U>::type>::value,
1450 return this->
Get()[std::forward<U>(value)];
1456 template <
typename D,
typename U>
1458 ->
typename std::enable_if<
1460 !std::is_reference<typename _BracketOperationHelper<T, U>::type>::value,
1463 return this->
Get()[prop.Get()];
1469 template <
typename U>
1471 ->
typename std::enable_if<
1475 return this->
Get()[std::forward<U>(value)];
1481 template <
typename D,
typename U>
1483 ->
typename std::enable_if<
1487 return this->
Get()[prop.Get()];
1495 (std::numeric_limits<std::ptrdiff_t>::max)();
1515 if (owner ==
nullptr) {
1518 _offset =
reinterpret_cast<uint8_t *
>(owner) -
reinterpret_cast<uint8_t *
>(
this);
1530 return const_cast<uint8_t *
>(
reinterpret_cast<const uint8_t *
>(
this)) +
_offset;
1538 template <
typename TOwner>
1558 template <
typename D,
typename T,
typename U>
1559 auto operator+(T &&left,
const PropertyBase<U, D> &right)
1560 ->
typename std::enable_if<!_IsProperty<T>::value && _AddOperationHelper<T, U>::value,
typename _AddOperationHelper<T, U>::type>::type
1562 return std::forward<T>(left) + right.Get();
1568 template <
typename D,
typename T,
typename U>
1569 auto operator-(T &&left,
const PropertyBase<U, D> &right)
1570 ->
typename std::enable_if<!_IsProperty<T>::value && _SubOperationHelper<T, U>::value,
typename _SubOperationHelper<T, U>::type>::type
1572 return std::forward<T>(left) - right.Get();
1578 template <
typename D,
typename T,
typename U>
1579 auto operator*(T &&left,
const PropertyBase<U, D> &right)
1580 ->
typename std::enable_if<!_IsProperty<T>::value && _MulOperationHelper<T, U>::value,
typename _MulOperationHelper<T, U>::type>::type
1582 return std::forward<T>(left) * right.Get();
1588 template <
typename D,
typename T,
typename U>
1589 auto operator/(T &&left,
const PropertyBase<U, D> &right)
1590 ->
typename std::enable_if<!_IsProperty<T>::value && _DivOperationHelper<T, U>::value,
typename _DivOperationHelper<T, U>::type>::type
1592 return std::forward<T>(left) / right.Get();
1598 template <
typename D,
typename T,
typename U>
1599 auto operator%(T &&left,
const PropertyBase<U, D> &right)
1600 ->
typename std::enable_if<!_IsProperty<T>::value && _ModOperationHelper<T, U>::value,
typename _ModOperationHelper<T, U>::type>::type
1602 return std::forward<T>(left) % right.Get();
1608 template <
typename D,
typename T,
typename U>
1609 auto operator==(T &&left,
const PropertyBase<U, D> &right)
1610 ->
typename std::enable_if<!_IsProperty<T>::value && _EqOperationHelper<T, U>::value,
typename _EqOperationHelper<T, U>::type>::type
1612 return std::forward<T>(left) == right.Get();
1619 template <
typename D,
typename T,
typename U>
1620 auto operator!=(T &&left,
const PropertyBase<U, D> &right)
1621 ->
typename std::enable_if<!_IsProperty<T>::value && _EqOperationHelper<T, U>::value,
typename _EqOperationHelper<T, U>::type>::type
1623 return !(std::forward<T>(left) == right);
1629 template <
typename D,
typename T,
typename U>
1630 auto operator<(T &&left,
const PropertyBase<U, D> &right)
1631 ->
typename std::enable_if<!_IsProperty<T>::value && _LtOperationHelper<T, U>::value,
typename _LtOperationHelper<T, U>::type>::type
1633 return std::forward<T>(left) < right.Get();
1639 template <
typename D,
typename T,
typename U>
1640 auto operator<=(T &&left,
const PropertyBase<U, D> &right)
1641 ->
typename std::enable_if<!_IsProperty<T>::value && _LeOperationHelper<T, U>::value,
typename _LeOperationHelper<T, U>::type>::type
1643 return std::forward<T>(left) <= right.Get();
1649 template <
typename D,
typename T,
typename U>
1650 auto operator>(T &&left,
const PropertyBase<U, D> &right)
1651 ->
typename std::enable_if<!_IsProperty<T>::value && _GtOperationHelper<T, U>::value,
typename _GtOperationHelper<T, U>::type>::type
1653 return std::forward<T>(left) > right.Get();
1659 template <
typename D,
typename T,
typename U>
1660 auto operator>=(T &&left,
const PropertyBase<U, D> &right)
1661 ->
typename std::enable_if<!_IsProperty<T>::value && _GeOperationHelper<T, U>::value,
typename _GeOperationHelper<T, U>::type>::type
1663 return std::forward<T>(left) >= right.Get();
1669 template <
typename D,
typename T,
typename U>
1670 auto operator&(T &&left,
const PropertyBase<U, D> &right)
1671 ->
typename std::enable_if<!_IsProperty<T>::value && _BitAndOperationHelper<T, U>::value,
typename _BitAndOperationHelper<T, U>::type>::type
1673 return std::forward<T>(left) & right.Get();
1679 template <
typename D,
typename T,
typename U>
1680 auto operator|(T &&left,
const PropertyBase<U, D> &right)
1681 ->
typename std::enable_if<!_IsProperty<T>::value && _BitOrOperationHelper<T, U>::value,
typename _BitOrOperationHelper<T, U>::type>::type
1683 return std::forward<T>(left) | right.Get();
1689 template <
typename D,
typename T,
typename U>
1690 auto operator^(T &&left,
const PropertyBase<U, D> &right)
1691 ->
typename std::enable_if<!_IsProperty<T>::value && _BitXorOperationHelper<T, U>::value,
typename _BitXorOperationHelper<T, U>::type>::type
1693 return std::forward<T>(left) ^ right.Get();
1699 template <
typename D,
typename T,
typename U>
1700 auto operator<<(T &&left,
const PropertyBase<U, D> &right)
1701 ->
typename std::enable_if<!_IsProperty<T>::value && _ShlOperationHelper<T, U>::value,
typename _ShlOperationHelper<T, U>::type>::type
1703 return std::forward<T>(left) << right.Get();
1709 template <
typename D,
typename T,
typename U>
1710 auto operator>>(T &&left,
const PropertyBase<U, D> &right)
1711 ->
typename std::enable_if<!_IsProperty<T>::value && _ShrOperationHelper<T, U>::value,
typename _ShrOperationHelper<T, U>::type>::type
1713 return std::forward<T>(left) >> right.Get();
1719 template <
typename D,
typename T,
typename U>
1720 auto operator&&(T &&left,
const PropertyBase<U, D> &right)
1721 ->
typename std::enable_if<!_IsProperty<T>::value && _LogicAndOperationHelper<T, U>::value,
typename _LogicAndOperationHelper<T, U>::type>::type
1723 return std::forward<T>(left) && right.Get();
1729 template <
typename D,
typename T,
typename U>
1730 auto operator||(T &&left,
const PropertyBase<U, D> &right)
1731 ->
typename std::enable_if<!_IsProperty<T>::value && _LogicOrOperationHelper<T, U>::value,
typename _LogicOrOperationHelper<T, U>::type>::type
1733 return std::forward<T>(left) || right.Get();
1741 template <
typename T>
1746 using TValue =
typename TBase::TValue;
1747 using TSetterParam =
typename TBase::TSetterParam;
1748 using TGetter = T (*)(
void *);
1749 using TSetter = void (*)(
void *, TSetterParam);
1750 using TStaticGetter = T (*)();
1751 using TStaticSetter = void (*)(TSetterParam);
1768 using TBase::operator=;
1773 template <
typename TOwner>
1776 assert(initializer._owner !=
nullptr);
1777 assert(initializer._getter !=
nullptr);
1778 assert(initializer._setter !=
nullptr);
1780 this->
SetOwner(initializer._owner);
1781 this->_getter =
reinterpret_cast<void *
>(initializer._getter);
1782 this->_setter =
reinterpret_cast<void *
>(initializer._setter);
1790 assert(initializer._getter !=
nullptr);
1791 assert(initializer._setter !=
nullptr);
1794 this->_getter =
reinterpret_cast<void *
>(initializer._getter);
1795 this->_setter =
reinterpret_cast<void *
>(initializer._setter);
1804 return reinterpret_cast<TStaticGetter
>(this->_getter)();
1806 return reinterpret_cast<TGetter
>(this->_getter)(this->
GetOwner());
1816 reinterpret_cast<TStaticSetter
>(this->_setter)(value);
1818 reinterpret_cast<TSetter
>(this->_setter)(this->
GetOwner(), value);
1826 template <
typename T>
1831 using TValue =
typename TBase::TValue;
1832 using TSetterParam =
typename TBase::TSetterParam;
1833 using TGetter = T (*)(
void *);
1834 using TStaticGetter = T (*)();
1846 template <
typename TOwner>
1849 assert(initializer._owner !=
nullptr);
1850 assert(initializer._getter !=
nullptr);
1852 this->
SetOwner(initializer._owner);
1853 this->_getter =
reinterpret_cast<void *
>(initializer._getter);
1861 assert(initializer._getter !=
nullptr);
1864 this->_getter =
reinterpret_cast<void *
>(initializer._getter);
1873 return reinterpret_cast<TStaticGetter
>(this->_getter)();
1875 return reinterpret_cast<TGetter
>(this->_getter)(this->
GetOwner());
1883 template <
typename T>
1888 using TValue =
typename TBase::TValue;
1889 using TSetterParam =
typename TBase::TSetterParam;
1890 using TSetter = void (*)(
void *, TSetterParam);
1891 using TStaticSetter = void (*)(TSetterParam);
1903 using TBase::operator=;
1908 template <
typename TOwner>
1911 assert(initializer._owner !=
nullptr);
1912 assert(initializer._setter !=
nullptr);
1914 this->
SetOwner(initializer._owner);
1915 this->_setter =
reinterpret_cast<void *
>(initializer._setter);
1923 assert(initializer._setter !=
nullptr);
1926 this->_setter =
reinterpret_cast<void *
>(initializer._setter);
1935 reinterpret_cast<TStaticSetter
>(this->_setter)(value);
1937 reinterpret_cast<TSetter
>(this->_setter)(this->
GetOwner(), value);
1951#define _SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(T) \
1952 extern template class sw::Property<T>; \
1953 extern template class sw::ReadOnlyProperty<T>; \
1954 extern template class sw::WriteOnlyProperty<T>
1956#define _SW_DEFINE_EXTERN_PROPERTY_TEMPLATE(T) \
1957 template class sw::Property<T>; \
1958 template class sw::ReadOnlyProperty<T>; \
1959 template class sw::WriteOnlyProperty<T>
1961_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(
bool);
1962_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(
float);
1963_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(
double);
1964_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(int8_t);
1965_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(int16_t);
1966_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(int32_t);
1967_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(int64_t);
1968_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(uint8_t);
1969_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(uint16_t);
1970_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(uint32_t);
1971_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(uint64_t);
1972_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(std::string);
1973_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(std::wstring);
成员属性初始化器
Definition Property.h:260
MemberPropertyInitializer & Setter()
设置成员函数setter
Definition Property.h:336
MemberPropertyInitializer & Getter(TValue(*getter)(TOwner *))
设置getter
Definition Property.h:293
MemberPropertyInitializer(TOwner *owner)
构造成员属性初始化器
Definition Property.h:285
MemberPropertyInitializer & Setter(void(*setter)(TOwner *, _PropertySetterParamType< TValue >))
设置setter
Definition Property.h:302
MemberPropertyInitializer & Getter()
设置成员函数getter
Definition Property.h:312
属性基类模板
Definition Property.h:437
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:1482
static StaticPropertyInitializer< T > Init()
获取静态属性初始化器
Definition Property.h:1547
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:1470
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:1192
void SetOwner(void *owner) noexcept
设置属性所有者对象,nullptr表示静态属性
Definition Property.h:1513
auto operator/=(U &&value) -> typename std::enable_if< _DivOperationHelper< T, U >::value, TDerived & >::type
除赋值运算
Definition Property.h:690
auto operator*() const -> typename std::enable_if< _DerefOperationHelper< U >::value, typename _DerefOperationHelper< U >::type >::type
解引用运算
Definition Property.h:1042
auto operator++(int) const -> typename std::enable_if< _AddOperationHelper< U, int >::value, T >::type
后置自增运算
Definition Property.h:778
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:1274
auto operator>>(U &&value) const -> typename std::enable_if< _ShrOperationHelper< T, U >::value, typename _ShrOperationHelper< T, U >::type >::type
右移运算
Definition Property.h:1384
auto operator%(U &&value) const -> typename std::enable_if< _ModOperationHelper< T, U >::value, typename _ModOperationHelper< T, U >::type >::type
取模运算
Definition Property.h:1162
T Get() const
获取属性值
Definition Property.h:466
auto operator/=(U &&value) const -> typename std::enable_if< _DivOperationHelper< T, U >::value, const TDerived & >::type
除赋值运算
Definition Property.h:701
auto operator>>=(U &&value) const -> typename std::enable_if< _ShrOperationHelper< T, U >::value, const TDerived & >::type
右移赋值运算
Definition Property.h:989
auto operator--(int) const -> typename std::enable_if< _SubOperationHelper< U, int >::value, T >::type
后置自减运算
Definition Property.h:790
auto operator||(U &&value) const -> typename std::enable_if< _LogicOrOperationHelper< T, U >::value, typename _LogicOrOperationHelper< T, U >::type >::type
逻辑或运算
Definition Property.h:1424
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:1132
auto operator<<=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _ShlOperationHelper< T, U >::value, const TDerived & >::type
左移赋值运算
Definition Property.h:967
auto operator+(U &&value) const -> typename std::enable_if< _AddOperationHelper< T, U >::value, typename _AddOperationHelper< T, U >::type >::type
加法运算
Definition Property.h:1082
auto operator^=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _BitXorOperationHelper< T, U >::value, const TDerived & >::type
按位异或赋值运算
Definition Property.h:923
auto operator&() const -> typename std::enable_if< _AddrOperationHelper< U >::value, typename _AddrOperationHelper< U >::type >::type
地址运算
Definition Property.h:1052
auto operator|(U &&value) const -> typename std::enable_if< _BitOrOperationHelper< T, U >::value, typename _BitOrOperationHelper< T, U >::type >::type
按位或运算
Definition Property.h:1324
auto operator--() const -> typename std::enable_if< _SubOperationHelper< U, int >::value, const TDerived & >::type
前置自减运算
Definition Property.h:767
auto operator&=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _BitAndOperationHelper< T, U >::value, const TDerived & >::type
按位与赋值运算
Definition Property.h:835
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:1374
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:1334
auto operator>=(U &&value) const -> typename std::enable_if< _GeOperationHelper< T, U >::value, typename _GeOperationHelper< T, U >::type >::type
大于等于运算
Definition Property.h:1284
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:1092
auto operator/(U &&value) const -> typename std::enable_if< _DivOperationHelper< T, U >::value, typename _DivOperationHelper< T, U >::type >::type
除法运算
Definition Property.h:1142
const TDerived & operator=(TSetterParam value) const
设置属性值
Definition Property.h:530
const TDerived & operator=(const PropertyBase &prop) const
设置属性值
Definition Property.h:548
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:1457
auto operator/=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _DivOperationHelper< T, U >::value, TDerived & >::type
除赋值运算
Definition Property.h:712
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:1214
auto operator++() -> typename std::enable_if< _AddOperationHelper< U, int >::value, TDerived & >::type
前置自增运算
Definition Property.h:734
auto operator==(U &&value) const -> typename std::enable_if< _EqOperationHelper< T, U >::value, typename _EqOperationHelper< T, U >::type >::type
等于运算
Definition Property.h:1182
auto operator|=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _BitOrOperationHelper< T, U >::value, TDerived & >::type
按位或赋值运算
Definition Property.h:868
auto operator+=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _AddOperationHelper< T, U >::value, TDerived & >::type
加赋值运算
Definition Property.h:580
std::ptrdiff_t _offset
所有者对象相对于当前属性对象的偏移量
Definition Property.h:1500
auto operator|=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _BitOrOperationHelper< T, U >::value, const TDerived & >::type
按位或赋值运算
Definition Property.h:879
auto operator&=(U &&value) -> typename std::enable_if< _BitAndOperationHelper< T, U >::value, TDerived & >::type
按位与赋值运算
Definition Property.h:802
static constexpr std::ptrdiff_t _STATICOFFSET
静态属性偏移量标记
Definition Property.h:1494
auto operator<(U &&value) const -> typename std::enable_if< _LtOperationHelper< T, U >::value, typename _LtOperationHelper< T, U >::type >::type
小于运算
Definition Property.h:1224
auto operator-() const -> typename std::enable_if< _UnaryMinusOperationHelper< U >::value, typename _UnaryMinusOperationHelper< U >::type >::type
负号运算
Definition Property.h:1072
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:1434
auto operator-=(U &&value) -> typename std::enable_if< _SubOperationHelper< T, U >::value, TDerived & >::type
减赋值运算
Definition Property.h:602
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:1112
TDerived & operator=(const PropertyBase &prop)
设置属性值
Definition Property.h:539
auto operator>(U &&value) const -> typename std::enable_if< _GtOperationHelper< T, U >::value, typename _GtOperationHelper< T, U >::type >::type
大于运算
Definition Property.h:1264
auto operator*(U &&value) const -> typename std::enable_if< _MulOperationHelper< T, U >::value, typename _MulOperationHelper< T, U >::type >::type
乘法运算
Definition Property.h:1122
auto operator&=(U &&value) const -> typename std::enable_if< _BitAndOperationHelper< T, U >::value, const TDerived & >::type
按位与赋值运算
Definition Property.h:813
auto operator--() -> typename std::enable_if< _SubOperationHelper< U, int >::value, TDerived & >::type
前置自减运算
Definition Property.h:756
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:1254
auto operator>>=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _ShrOperationHelper< T, U >::value, const TDerived & >::type
右移赋值运算
Definition Property.h:1011
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:1314
auto operator&&(U &&value) const -> typename std::enable_if< _LogicAndOperationHelper< T, U >::value, typename _LogicAndOperationHelper< T, U >::type >::type
逻辑与运算
Definition Property.h:1404
auto operator~() const -> typename std::enable_if< _BitNotOperationHelper< U >::value, typename _BitNotOperationHelper< U >::type >::type
按位非运算
Definition Property.h:1032
static MemberPropertyInitializer< TOwner, T > Init(TOwner *owner)
获取成员属性初始化器
Definition Property.h:1539
auto operator-=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _SubOperationHelper< T, U >::value, TDerived & >::type
减赋值运算
Definition Property.h:624
auto operator-(U &&value) const -> typename std::enable_if< _SubOperationHelper< T, U >::value, typename _SubOperationHelper< T, U >::type >::type
减法运算
Definition Property.h:1102
void Set(TSetterParam value) const
设置属性值
Definition Property.h:474
auto operator++() const -> typename std::enable_if< _AddOperationHelper< U, int >::value, const TDerived & >::type
前置自增运算
Definition Property.h:745
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:1444
auto operator*=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _MulOperationHelper< T, U >::value, const TDerived & >::type
乘赋值运算
Definition Property.h:679
auto operator^=(U &&value) -> typename std::enable_if< _BitXorOperationHelper< T, U >::value, TDerived & >::type
按位异或赋值运算
Definition Property.h:890
bool IsStatic() const noexcept
判断属性是否为静态属性
Definition Property.h:1505
auto operator^(U &&value) const -> typename std::enable_if< _BitXorOperationHelper< T, U >::value, typename _BitXorOperationHelper< T, U >::type >::type
按位异或运算
Definition Property.h:1344
auto operator<<(U &&value) const -> typename std::enable_if< _ShlOperationHelper< T, U >::value, typename _ShlOperationHelper< T, U >::type >::type
左移运算
Definition Property.h:1364
auto operator<<=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _ShlOperationHelper< T, U >::value, TDerived & >::type
左移赋值运算
Definition Property.h:956
auto operator!=(U &&value) const -> typename std::enable_if< _EqOperationHelper< T, U >::value, typename _EqOperationHelper< T, U >::type >::type
不等于运算
Definition Property.h:1203
auto operator->() const
取属性字段
Definition Property.h:482
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:1414
auto operator|=(U &&value) -> typename std::enable_if< _BitOrOperationHelper< T, U >::value, TDerived & >::type
按位或赋值运算
Definition Property.h:846
auto operator<<=(U &&value) const -> typename std::enable_if< _ShlOperationHelper< T, U >::value, const TDerived & >::type
左移赋值运算
Definition Property.h:945
auto operator&=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _BitAndOperationHelper< T, U >::value, TDerived & >::type
按位与赋值运算
Definition Property.h:824
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:1172
auto operator+=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _AddOperationHelper< T, U >::value, const TDerived & >::type
加赋值运算
Definition Property.h:591
auto operator+=(U &&value) -> typename std::enable_if< _AddOperationHelper< T, U >::value, TDerived & >::type
加赋值运算
Definition Property.h:558
auto operator&(U &&value) const -> typename std::enable_if< _BitAndOperationHelper< T, U >::value, typename _BitAndOperationHelper< T, U >::type >::type
按位与运算
Definition Property.h:1304
auto operator|=(U &&value) const -> typename std::enable_if< _BitOrOperationHelper< T, U >::value, const TDerived & >::type
按位或赋值运算
Definition Property.h:857
auto operator<<=(U &&value) -> typename std::enable_if< _ShlOperationHelper< T, U >::value, TDerived & >::type
左移赋值运算
Definition Property.h:934
auto operator+=(U &&value) const -> typename std::enable_if< _AddOperationHelper< T, U >::value, const TDerived & >::type
加赋值运算
Definition Property.h:569
auto operator-=(U &&value) const -> typename std::enable_if< _SubOperationHelper< T, U >::value, const TDerived & >::type
减赋值运算
Definition Property.h:613
FieldsAccessor< T > AccessFields() const
访问属性字段,可由子类重写
Definition Property.h:458
auto operator<=(U &&value) const -> typename std::enable_if< _LeOperationHelper< T, U >::value, typename _LeOperationHelper< T, U >::type >::type
小于等于运算
Definition Property.h:1244
auto operator>>=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _ShrOperationHelper< T, U >::value, TDerived & >::type
右移赋值运算
Definition Property.h:1000
auto operator!() const -> typename std::enable_if< _LogicNotOperationHelper< U >::value, typename _LogicNotOperationHelper< U >::type >::type
逻辑非运算
Definition Property.h:1022
auto operator*=(U &&value) -> typename std::enable_if< _MulOperationHelper< T, U >::value, TDerived & >::type
乘赋值运算
Definition Property.h:646
void * GetOwner() const noexcept
获取属性所有者对象,当属性为静态属性时返回nullptr
Definition Property.h:1525
auto operator>>=(U &&value) -> typename std::enable_if< _ShrOperationHelper< T, U >::value, TDerived & >::type
右移赋值运算
Definition Property.h:978
auto operator^=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _BitXorOperationHelper< T, U >::value, TDerived & >::type
按位异或赋值运算
Definition Property.h:912
TDerived & operator=(TSetterParam value)
设置属性值
Definition Property.h:521
auto operator-=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _SubOperationHelper< T, U >::value, const TDerived & >::type
减赋值运算
Definition Property.h:635
auto operator/=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _DivOperationHelper< T, U >::value, const TDerived & >::type
除赋值运算
Definition Property.h:723
auto operator*=(U &&value) const -> typename std::enable_if< _MulOperationHelper< T, U >::value, const TDerived & >::type
乘赋值运算
Definition Property.h:657
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:1152
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:1354
auto operator*=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _MulOperationHelper< T, U >::value, TDerived & >::type
乘赋值运算
Definition Property.h:668
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:1394
auto operator+() const -> typename std::enable_if< _UnaryPlusOperationHelper< U >::value, typename _UnaryPlusOperationHelper< U >::type >::type
正号运算
Definition Property.h:1062
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:1234
auto operator^=(U &&value) const -> typename std::enable_if< _BitXorOperationHelper< T, U >::value, const TDerived & >::type
按位异或赋值运算
Definition Property.h:901
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:1294
属性
Definition Property.h:1743
T GetterImpl() const
获取属性值
Definition Property.h:1801
void SetterImpl(TSetterParam value) const
设置属性值
Definition Property.h:1813
Property(const MemberPropertyInitializer< TOwner, T > &initializer)
构造成员属性
Definition Property.h:1774
Property(const StaticPropertyInitializer< T > &initializer)
构造静态属性
Definition Property.h:1788
只读属性
Definition Property.h:1828
ReadOnlyProperty(const StaticPropertyInitializer< T > &initializer)
构造静态属性
Definition Property.h:1859
ReadOnlyProperty(const MemberPropertyInitializer< TOwner, T > &initializer)
构造成员属性
Definition Property.h:1847
T GetterImpl() const
获取属性值
Definition Property.h:1870
静态属性初始化器
Definition Property.h:386
StaticPropertyInitializer()
构造静态属性初始化器
Definition Property.h:406
StaticPropertyInitializer & Setter(void(*setter)(_PropertySetterParamType< TValue >))
设置setter
Definition Property.h:423
StaticPropertyInitializer & Getter(TValue(*getter)())
设置getter
Definition Property.h:414
只写属性
Definition Property.h:1885
void SetterImpl(TSetterParam value) const
设置属性值
Definition Property.h:1932
WriteOnlyProperty(const MemberPropertyInitializer< TOwner, T > &initializer)
构造成员属性
Definition Property.h:1909
WriteOnlyProperty(const StaticPropertyInitializer< T > &initializer)
构造静态属性
Definition Property.h:1921
字段访问器,用于实现使用operator->取属性字段
Definition Property.h:212
std::enable_if< std::is_pointer< U >::value, U >::type operator->()
指针类型,直接返回值
Definition Property.h:231
T value
字段访问器所维护的值
Definition Property.h:216
FieldsAccessor(Args &&...args)
构造字段访问器
Definition Property.h:222
std::enable_if<!std::is_pointer< U >::value &&!_HasArrowOperator< U >::value, U * >::type operator->()
非指针类型,且无operator->,返回值的地址
Definition Property.h:240
std::enable_if<!std::is_pointer< U >::value &&_HasArrowOperator< U >::value, typename_HasArrowOperator< U >::type >::type operator->()
非指针类型,且有operator->,转发operator->
Definition Property.h:249
判断类型是否可以使用[]操作符的辅助模板
Definition Property.h:147
判断类型是否有operator->的辅助模板
Definition Property.h:178
判断类型是否有GetterImpl成员的辅助模板
Definition Property.h:101
判断类型是否有SetterImpl成员的辅助模板
Definition Property.h:116
判断类型是否可以显式转换的辅助模板
Definition Property.h:163
_IsProperty的实现
Definition Property.h:80
判断类型是否为属性的辅助模板
Definition Property.h:94
判断类型是否为可读属性的辅助模板
Definition Property.h:132
判断类型是否为可写属性的辅助模板
Definition Property.h:140
属性setter参数类型辅助模板
Definition Property.h:194