SimpleWindow
载入中...
搜索中...
未找到
Property.h
1#pragma once
2
3#include <cassert>
4#include <cstddef>
5#include <cstdint>
6#include <limits>
7#include <type_traits>
8#include <utility>
9
10#define _SW_DEFINE_OPERATION_HELPER(NAME, OP) \
11 template <typename T, typename U, typename = void> \
12 struct NAME : std::false_type { \
13 }; \
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>()); \
17 }
18
19#define _SW_DEFINE_UNARY_OPERATION_HELPER(NAME, OP) \
20 template <typename T, typename = void> \
21 struct NAME : std::false_type { \
22 }; \
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>()); \
26 }
27
28namespace sw
29{
34 template <typename T, typename TDerived>
35 class PropertyBase;
36
37 template <typename T>
38 class Property;
39
40 template <typename T>
41 class ReadOnlyProperty;
42
43 template <typename T>
44 class WriteOnlyProperty;
45
46 /*================================================================================*/
47
48 // SFINAE templates
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, -);
73 // _SW_DEFINE_UNARY_OPERATION_HELPER(_PreIncOperationHelper, ++);
74 // _SW_DEFINE_UNARY_OPERATION_HELPER(_PreDecOperationHelper, --);
75
79 template <typename T>
81 private:
82 template <typename U, typename V>
83 static std::true_type test(const PropertyBase<U, V> *);
84 static std::false_type test(...);
85
86 public:
87 using type = decltype(test(std::declval<T *>()));
88 };
89
93 template <typename T>
94 struct _IsProperty : _IsPropertyImpl<typename std::decay<T>::type>::type {
95 };
96
100 template <typename, typename = void>
101 struct _HasGetterImpl : std::false_type {
102 };
103
107 template <typename T>
109 T, decltype(void(&T::GetterImpl))> : std::true_type {
110 };
111
115 template <typename, typename = void>
116 struct _HasSetterImpl : std::false_type {
117 };
118
122 template <typename T>
124 T, decltype(void(&T::SetterImpl))> : std::true_type {
125 };
126
130 template <typename T>
132 : std::integral_constant<bool, _IsProperty<T>::value && _HasGetterImpl<T>::value> {
133 };
134
138 template <typename T>
140 : std::integral_constant<bool, _IsProperty<T>::value && _HasSetterImpl<T>::value> {
141 };
142
146 template <typename T, typename U, typename = void>
147 struct _BracketOperationHelper : std::false_type {
148 };
149
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>()]);
157 };
158
162 template <typename TFrom, typename TTo, typename = void>
163 struct _IsExplicitlyConvertable : std::false_type {
164 };
165
169 template <typename TFrom, typename TTo>
171 TFrom, TTo, decltype(void(static_cast<TTo>(std::declval<TFrom>())))> : std::true_type {
172 };
173
177 template <typename T, typename = void>
178 struct _HasArrowOperator : std::false_type {
179 };
180
184 template <typename T>
186 T, decltype(void(std::declval<T>().operator->()))> : std::true_type {
187 using type = decltype(std::declval<T>().operator->());
188 };
189
193 template <typename T>
195 using type = typename std::conditional<
196 std::is_scalar<T>::value, T, const T &>::type;
197 };
198
202 template <typename T>
203 using _PropertySetterParamType =
205
206 /*================================================================================*/
207
211 template <typename T>
217
221 template <typename... Args>
222 FieldsAccessor(Args &&...args)
223 : value(std::forward<Args>(args)...)
224 {
225 }
226
230 template <typename U = T>
231 typename std::enable_if<std::is_pointer<U>::value, U>::type operator->()
232 {
233 return this->value;
234 }
235
239 template <typename U = T>
240 typename std::enable_if<!std::is_pointer<U>::value && !_HasArrowOperator<U>::value, U *>::type operator->()
241 {
242 return &this->value;
243 }
244
248 template <typename U = T>
249 typename std::enable_if<!std::is_pointer<U>::value && _HasArrowOperator<U>::value, typename _HasArrowOperator<U>::type>::type operator->()
250 {
251 return this->value.operator->();
252 }
253 };
254
258 template <typename TOwner, typename TValue>
260 {
261 friend class Property<TValue>;
262 friend class ReadOnlyProperty<TValue>;
263 friend class WriteOnlyProperty<TValue>;
264
265 private:
269 TOwner *_owner;
270
274 TValue (*_getter)(TOwner *);
275
279 void (*_setter)(TOwner *, _PropertySetterParamType<TValue>);
280
281 public:
286 : _owner(owner), _getter(nullptr), _setter(nullptr)
287 {
288 }
289
293 MemberPropertyInitializer &Getter(TValue (*getter)(TOwner *))
294 {
295 this->_getter = getter;
296 return *this;
297 }
298
302 MemberPropertyInitializer &Setter(void (*setter)(TOwner *, _PropertySetterParamType<TValue>))
303 {
304 this->_setter = setter;
305 return *this;
306 }
307
311 template <TValue (TOwner::*getter)()>
313 {
314 return this->Getter(
315 [](TOwner *owner) -> TValue {
316 return (owner->*getter)();
317 });
318 }
319
323 template <TValue (TOwner::*getter)() const>
325 {
326 return this->Getter(
327 [](TOwner *owner) -> TValue {
328 return (owner->*getter)();
329 });
330 }
331
335 template <void (TOwner::*setter)(_PropertySetterParamType<TValue>)>
337 {
338 return this->Setter(
339 [](TOwner *owner, _PropertySetterParamType<TValue> value) {
340 (owner->*setter)(value);
341 });
342 }
343
347 template <void (TOwner::*setter)(_PropertySetterParamType<TValue>) const>
349 {
350 return this->Setter(
351 [](TOwner *owner, _PropertySetterParamType<TValue> value) {
352 (owner->*setter)(value);
353 });
354 }
355
359 template <TValue TOwner::*field>
361 {
362 return this->Getter(
363 [](TOwner *owner) -> TValue {
364 return owner->*field;
365 });
366 }
367
371 template <TValue TOwner::*field>
373 {
374 return this->Setter(
375 [](TOwner *owner, _PropertySetterParamType<TValue> value) {
376 owner->*field = value;
377 });
378 }
379 };
380
384 template <typename TValue>
386 {
387 friend class Property<TValue>;
388 friend class ReadOnlyProperty<TValue>;
389 friend class WriteOnlyProperty<TValue>;
390
391 private:
395 TValue (*_getter)();
396
400 void (*_setter)(_PropertySetterParamType<TValue>);
401
402 public:
407 : _getter(nullptr), _setter(nullptr)
408 {
409 }
410
415 {
416 this->_getter = getter;
417 return *this;
418 }
419
423 StaticPropertyInitializer &Setter(void (*setter)(_PropertySetterParamType<TValue>))
424 {
425 this->_setter = setter;
426 return *this;
427 }
428 };
429
430 /*================================================================================*/
431
435 template <typename T, typename TDerived>
437 {
438 public:
439 // 属性值类型别名
440 using TValue = T;
441
442 // setter参数类型别名
443 using TSetterParam = _PropertySetterParamType<T>;
444
445 // /**
446 // * @brief 获取属性值,由子类实现
447 // */
448 // T GetterImpl() const;
449
450 // /**
451 // * @brief 设置属性值,由子类实现
452 // */
453 // void SetterImpl(TSetterParam value) const;
454
459 {
460 return FieldsAccessor<T>(this->Get());
461 }
462
466 T Get() const
467 {
468 return static_cast<const TDerived *>(this)->GetterImpl();
469 }
470
474 void Set(TSetterParam value) const
475 {
476 static_cast<const TDerived *>(this)->SetterImpl(value);
477 }
478
482 auto operator->() const
483 {
484 return static_cast<const TDerived *>(this)->AccessFields();
485 }
486
490 operator T() const
491 {
492 return this->Get();
493 }
494
498 template <
499 typename U = T,
500 typename = typename std::enable_if<!std::is_arithmetic<T>::value && std::is_convertible<T, U>::value, U>::type>
501 operator U() const
502 {
503 return static_cast<U>(this->Get());
504 }
505
509 template <
510 typename U = T,
511 typename = typename std::enable_if<!std::is_arithmetic<T>::value && !std::is_convertible<T, U>::value, U>::type,
512 typename = typename std::enable_if<!std::is_arithmetic<T>::value && _IsExplicitlyConvertable<T, U>::value, U>::type>
513 explicit operator U() const
514 {
515 return static_cast<U>(this->Get());
516 }
517
521 TDerived &operator=(TSetterParam value)
522 {
523 this->Set(value);
524 return *static_cast<TDerived *>(this);
525 }
526
530 const TDerived &operator=(TSetterParam value) const
531 {
532 this->Set(value);
533 return *static_cast<const TDerived *>(this);
534 }
535
539 TDerived &operator=(const PropertyBase &prop)
540 {
541 this->Set(prop.Get());
542 return *static_cast<TDerived *>(this);
543 }
544
548 const TDerived &operator=(const PropertyBase &prop) const
549 {
550 this->Set(prop.Get());
551 return *static_cast<const TDerived *>(this);
552 }
553
557 template <typename U>
558 auto operator+=(U &&value)
559 -> typename std::enable_if<_AddOperationHelper<T, U>::value, TDerived &>::type
560 {
561 this->Set(this->Get() + std::forward<U>(value));
562 return *static_cast<TDerived *>(this);
563 }
564
568 template <typename U>
569 auto operator+=(U &&value) const
570 -> typename std::enable_if<_AddOperationHelper<T, U>::value, const TDerived &>::type
571 {
572 this->Set(this->Get() + std::forward<U>(value));
573 return *static_cast<const TDerived *>(this);
574 }
575
579 template <typename D, typename U>
581 -> typename std::enable_if<_AddOperationHelper<T, U>::value, TDerived &>::type
582 {
583 this->Set(this->Get() + prop.Get());
584 return *static_cast<TDerived *>(this);
585 }
586
590 template <typename D, typename U>
591 auto operator+=(const PropertyBase<U, D> &prop) const
592 -> typename std::enable_if<_AddOperationHelper<T, U>::value, const TDerived &>::type
593 {
594 this->Set(this->Get() + prop.Get());
595 return *static_cast<const TDerived *>(this);
596 }
597
601 template <typename U>
602 auto operator-=(U &&value)
603 -> typename std::enable_if<_SubOperationHelper<T, U>::value, TDerived &>::type
604 {
605 this->Set(this->Get() - std::forward<U>(value));
606 return *static_cast<TDerived *>(this);
607 }
608
612 template <typename U>
613 auto operator-=(U &&value) const
614 -> typename std::enable_if<_SubOperationHelper<T, U>::value, const TDerived &>::type
615 {
616 this->Set(this->Get() - std::forward<U>(value));
617 return *static_cast<const TDerived *>(this);
618 }
619
623 template <typename D, typename U>
625 -> typename std::enable_if<_SubOperationHelper<T, U>::value, TDerived &>::type
626 {
627 this->Set(this->Get() - prop.Get());
628 return *static_cast<TDerived *>(this);
629 }
630
634 template <typename D, typename U>
635 auto operator-=(const PropertyBase<U, D> &prop) const
636 -> typename std::enable_if<_SubOperationHelper<T, U>::value, const TDerived &>::type
637 {
638 this->Set(this->Get() - prop.Get());
639 return *static_cast<const TDerived *>(this);
640 }
641
645 template <typename U>
646 auto operator*=(U &&value)
647 -> typename std::enable_if<_MulOperationHelper<T, U>::value, TDerived &>::type
648 {
649 this->Set(this->Get() * std::forward<U>(value));
650 return *static_cast<TDerived *>(this);
651 }
652
656 template <typename U>
657 auto operator*=(U &&value) const
658 -> typename std::enable_if<_MulOperationHelper<T, U>::value, const TDerived &>::type
659 {
660 this->Set(this->Get() * std::forward<U>(value));
661 return *static_cast<const TDerived *>(this);
662 }
663
667 template <typename D, typename U>
669 -> typename std::enable_if<_MulOperationHelper<T, U>::value, TDerived &>::type
670 {
671 this->Set(this->Get() * prop.Get());
672 return *static_cast<TDerived *>(this);
673 }
674
678 template <typename D, typename U>
679 auto operator*=(const PropertyBase<U, D> &prop) const
680 -> typename std::enable_if<_MulOperationHelper<T, U>::value, const TDerived &>::type
681 {
682 this->Set(this->Get() * prop.Get());
683 return *static_cast<const TDerived *>(this);
684 }
685
689 template <typename U>
690 auto operator/=(U &&value)
691 -> typename std::enable_if<_DivOperationHelper<T, U>::value, TDerived &>::type
692 {
693 this->Set(this->Get() / std::forward<U>(value));
694 return *static_cast<TDerived *>(this);
695 }
696
700 template <typename U>
701 auto operator/=(U &&value) const
702 -> typename std::enable_if<_DivOperationHelper<T, U>::value, const TDerived &>::type
703 {
704 this->Set(this->Get() / std::forward<U>(value));
705 return *static_cast<const TDerived *>(this);
706 }
707
711 template <typename D, typename U>
713 -> typename std::enable_if<_DivOperationHelper<T, U>::value, TDerived &>::type
714 {
715 this->Set(this->Get() / prop.Get());
716 return *static_cast<TDerived *>(this);
717 }
718
722 template <typename D, typename U>
723 auto operator/=(const PropertyBase<U, D> &prop) const
724 -> typename std::enable_if<_DivOperationHelper<T, U>::value, const TDerived &>::type
725 {
726 this->Set(this->Get() / prop.Get());
727 return *static_cast<const TDerived *>(this);
728 }
729
733 template <typename U = T>
735 -> typename std::enable_if<_AddOperationHelper<U, int>::value, TDerived &>::type
736 {
737 this->Set(this->Get() + 1);
738 return *static_cast<TDerived *>(this);
739 }
740
744 template <typename U = T>
745 auto operator++() const
746 -> typename std::enable_if<_AddOperationHelper<U, int>::value, const TDerived &>::type
747 {
748 this->Set(this->Get() + 1);
749 return *static_cast<const TDerived *>(this);
750 }
751
755 template <typename U = T>
757 -> typename std::enable_if<_SubOperationHelper<U, int>::value, TDerived &>::type
758 {
759 this->Set(this->Get() - 1);
760 return *static_cast<TDerived *>(this);
761 }
762
766 template <typename U = T>
767 auto operator--() const
768 -> typename std::enable_if<_SubOperationHelper<U, int>::value, const TDerived &>::type
769 {
770 this->Set(this->Get() - 1);
771 return *static_cast<const TDerived *>(this);
772 }
773
777 template <typename U = T>
778 auto operator++(int) const
779 -> typename std::enable_if<_AddOperationHelper<U, int>::value, T>::type
780 {
781 T oldval = this->Get();
782 this->Set(oldval + 1);
783 return oldval;
784 }
785
789 template <typename U = T>
790 auto operator--(int) const
791 -> typename std::enable_if<_SubOperationHelper<U, int>::value, T>::type
792 {
793 T oldval = this->Get();
794 this->Set(oldval - 1);
795 return oldval;
796 }
797
801 template <typename U>
802 auto operator&=(U &&value)
803 -> typename std::enable_if<_BitAndOperationHelper<T, U>::value, TDerived &>::type
804 {
805 this->Set(this->Get() & std::forward<U>(value));
806 return *static_cast<TDerived *>(this);
807 }
808
812 template <typename U>
813 auto operator&=(U &&value) const
814 -> typename std::enable_if<_BitAndOperationHelper<T, U>::value, const TDerived &>::type
815 {
816 this->Set(this->Get() & std::forward<U>(value));
817 return *static_cast<const TDerived *>(this);
818 }
819
823 template <typename D, typename U>
825 -> typename std::enable_if<_BitAndOperationHelper<T, U>::value, TDerived &>::type
826 {
827 this->Set(this->Get() & prop.Get());
828 return *static_cast<TDerived *>(this);
829 }
830
834 template <typename D, typename U>
835 auto operator&=(const PropertyBase<U, D> &prop) const
836 -> typename std::enable_if<_BitAndOperationHelper<T, U>::value, const TDerived &>::type
837 {
838 this->Set(this->Get() & prop.Get());
839 return *static_cast<const TDerived *>(this);
840 }
841
845 template <typename U>
846 auto operator|=(U &&value)
847 -> typename std::enable_if<_BitOrOperationHelper<T, U>::value, TDerived &>::type
848 {
849 this->Set(this->Get() | std::forward<U>(value));
850 return *static_cast<TDerived *>(this);
851 }
852
856 template <typename U>
857 auto operator|=(U &&value) const
858 -> typename std::enable_if<_BitOrOperationHelper<T, U>::value, const TDerived &>::type
859 {
860 this->Set(this->Get() | std::forward<U>(value));
861 return *static_cast<const TDerived *>(this);
862 }
863
867 template <typename D, typename U>
869 -> typename std::enable_if<_BitOrOperationHelper<T, U>::value, TDerived &>::type
870 {
871 this->Set(this->Get() | prop.Get());
872 return *static_cast<TDerived *>(this);
873 }
874
878 template <typename D, typename U>
879 auto operator|=(const PropertyBase<U, D> &prop) const
880 -> typename std::enable_if<_BitOrOperationHelper<T, U>::value, const TDerived &>::type
881 {
882 this->Set(this->Get() | prop.Get());
883 return *static_cast<const TDerived *>(this);
884 }
885
889 template <typename U>
890 auto operator^=(U &&value)
891 -> typename std::enable_if<_BitXorOperationHelper<T, U>::value, TDerived &>::type
892 {
893 this->Set(this->Get() ^ std::forward<U>(value));
894 return *static_cast<TDerived *>(this);
895 }
896
900 template <typename U>
901 auto operator^=(U &&value) const
902 -> typename std::enable_if<_BitXorOperationHelper<T, U>::value, const TDerived &>::type
903 {
904 this->Set(this->Get() ^ std::forward<U>(value));
905 return *static_cast<const TDerived *>(this);
906 }
907
911 template <typename D, typename U>
913 -> typename std::enable_if<_BitXorOperationHelper<T, U>::value, TDerived &>::type
914 {
915 this->Set(this->Get() ^ prop.Get());
916 return *static_cast<TDerived *>(this);
917 }
918
922 template <typename D, typename U>
923 auto operator^=(const PropertyBase<U, D> &prop) const
924 -> typename std::enable_if<_BitXorOperationHelper<T, U>::value, const TDerived &>::type
925 {
926 this->Set(this->Get() ^ prop.Get());
927 return *static_cast<const TDerived *>(this);
928 }
929
933 template <typename U>
934 auto operator<<=(U &&value)
935 -> typename std::enable_if<_ShlOperationHelper<T, U>::value, TDerived &>::type
936 {
937 this->Set(this->Get() << std::forward<U>(value));
938 return *static_cast<TDerived *>(this);
939 }
940
944 template <typename U>
945 auto operator<<=(U &&value) const
946 -> typename std::enable_if<_ShlOperationHelper<T, U>::value, const TDerived &>::type
947 {
948 this->Set(this->Get() << std::forward<U>(value));
949 return *static_cast<const TDerived *>(this);
950 }
951
955 template <typename D, typename U>
957 -> typename std::enable_if<_ShlOperationHelper<T, U>::value, TDerived &>::type
958 {
959 this->Set(this->Get() << prop.Get());
960 return *static_cast<TDerived *>(this);
961 }
962
966 template <typename D, typename U>
967 auto operator<<=(const PropertyBase<U, D> &prop) const
968 -> typename std::enable_if<_ShlOperationHelper<T, U>::value, const TDerived &>::type
969 {
970 this->Set(this->Get() << prop.Get());
971 return *static_cast<const TDerived *>(this);
972 }
973
977 template <typename U>
978 auto operator>>=(U &&value)
979 -> typename std::enable_if<_ShrOperationHelper<T, U>::value, TDerived &>::type
980 {
981 this->Set(this->Get() >> std::forward<U>(value));
982 return *static_cast<TDerived *>(this);
983 }
984
988 template <typename U>
989 auto operator>>=(U &&value) const
990 -> typename std::enable_if<_ShrOperationHelper<T, U>::value, const TDerived &>::type
991 {
992 this->Set(this->Get() >> std::forward<U>(value));
993 return *static_cast<const TDerived *>(this);
994 }
995
999 template <typename D, typename U>
1001 -> typename std::enable_if<_ShrOperationHelper<T, U>::value, TDerived &>::type
1002 {
1003 this->Set(this->Get() >> prop.Get());
1004 return *static_cast<TDerived *>(this);
1005 }
1006
1010 template <typename D, typename U>
1011 auto operator>>=(const PropertyBase<U, D> &prop) const
1012 -> typename std::enable_if<_ShrOperationHelper<T, U>::value, const TDerived &>::type
1013 {
1014 this->Set(this->Get() >> prop.Get());
1015 return *static_cast<const TDerived *>(this);
1016 }
1017
1021 template <typename U = T>
1022 auto operator!() const
1023 -> typename std::enable_if<_LogicNotOperationHelper<U>::value, typename _LogicNotOperationHelper<U>::type>::type
1024 {
1025 return !this->Get();
1026 }
1027
1031 template <typename U = T>
1032 auto operator~() const
1033 -> typename std::enable_if<_BitNotOperationHelper<U>::value, typename _BitNotOperationHelper<U>::type>::type
1034 {
1035 return ~this->Get();
1036 }
1037
1041 template <typename U = T>
1042 auto operator*() const
1043 -> typename std::enable_if<_DerefOperationHelper<U>::value, typename _DerefOperationHelper<U>::type>::type
1044 {
1045 return *this->Get();
1046 }
1047
1051 template <typename U = T>
1052 auto operator&() const
1053 -> typename std::enable_if<_AddrOperationHelper<U>::value, typename _AddrOperationHelper<U>::type>::type
1054 {
1055 return &this->Get();
1056 }
1057
1061 template <typename U = T>
1062 auto operator+() const
1063 -> typename std::enable_if<_UnaryPlusOperationHelper<U>::value, typename _UnaryPlusOperationHelper<U>::type>::type
1064 {
1065 return +this->Get();
1066 }
1067
1071 template <typename U = T>
1072 auto operator-() const
1073 -> typename std::enable_if<_UnaryMinusOperationHelper<U>::value, typename _UnaryMinusOperationHelper<U>::type>::type
1074 {
1075 return -this->Get();
1076 }
1077
1081 template <typename U>
1082 auto operator+(U &&value) const
1083 -> typename std::enable_if<_AddOperationHelper<T, U>::value, typename _AddOperationHelper<T, U>::type>::type
1084 {
1085 return this->Get() + std::forward<U>(value);
1086 }
1087
1091 template <typename D, typename U>
1092 auto operator+(const PropertyBase<U, D> &prop) const
1093 -> typename std::enable_if<_AddOperationHelper<T, U>::value, typename _AddOperationHelper<T, U>::type>::type
1094 {
1095 return this->Get() + prop.Get();
1096 }
1097
1101 template <typename U>
1102 auto operator-(U &&value) const
1103 -> typename std::enable_if<_SubOperationHelper<T, U>::value, typename _SubOperationHelper<T, U>::type>::type
1104 {
1105 return this->Get() - std::forward<U>(value);
1106 }
1107
1111 template <typename D, typename U>
1112 auto operator-(const PropertyBase<U, D> &prop) const
1113 -> typename std::enable_if<_SubOperationHelper<T, U>::value, typename _SubOperationHelper<T, U>::type>::type
1114 {
1115 return this->Get() - prop.Get();
1116 }
1117
1121 template <typename U>
1122 auto operator*(U &&value) const
1123 -> typename std::enable_if<_MulOperationHelper<T, U>::value, typename _MulOperationHelper<T, U>::type>::type
1124 {
1125 return this->Get() * std::forward<U>(value);
1126 }
1127
1131 template <typename D, typename U>
1132 auto operator*(const PropertyBase<U, D> &prop) const
1133 -> typename std::enable_if<_MulOperationHelper<T, U>::value, typename _MulOperationHelper<T, U>::type>::type
1134 {
1135 return this->Get() * prop.Get();
1136 }
1137
1141 template <typename U>
1142 auto operator/(U &&value) const
1143 -> typename std::enable_if<_DivOperationHelper<T, U>::value, typename _DivOperationHelper<T, U>::type>::type
1144 {
1145 return this->Get() / std::forward<U>(value);
1146 }
1147
1151 template <typename D, typename U>
1152 auto operator/(const PropertyBase<U, D> &prop) const
1153 -> typename std::enable_if<_DivOperationHelper<T, U>::value, typename _DivOperationHelper<T, U>::type>::type
1154 {
1155 return this->Get() / prop.Get();
1156 }
1157
1161 template <typename U>
1162 auto operator%(U &&value) const
1163 -> typename std::enable_if<_ModOperationHelper<T, U>::value, typename _ModOperationHelper<T, U>::type>::type
1164 {
1165 return this->Get() % std::forward<U>(value);
1166 }
1167
1171 template <typename D, typename U>
1172 auto operator%(const PropertyBase<U, D> &prop) const
1173 -> typename std::enable_if<_ModOperationHelper<T, U>::value, typename _ModOperationHelper<T, U>::type>::type
1174 {
1175 return this->Get() % prop.Get();
1176 }
1177
1181 template <typename U>
1182 auto operator==(U &&value) const
1183 -> typename std::enable_if<_EqOperationHelper<T, U>::value, typename _EqOperationHelper<T, U>::type>::type
1184 {
1185 return this->Get() == std::forward<U>(value);
1186 }
1187
1191 template <typename D, typename U>
1192 auto operator==(const PropertyBase<U, D> &prop) const
1193 -> typename std::enable_if<_EqOperationHelper<T, U>::value, typename _EqOperationHelper<T, U>::type>::type
1194 {
1195 return this->Get() == prop.Get();
1196 }
1197
1202 template <typename U>
1203 auto operator!=(U &&value) const
1204 -> typename std::enable_if<_EqOperationHelper<T, U>::value, typename _EqOperationHelper<T, U>::type>::type
1205 {
1206 return !(*this == std::forward<U>(value));
1207 }
1208
1213 template <typename D, typename U>
1214 auto operator!=(const PropertyBase<U, D> &prop) const
1215 -> typename std::enable_if<_EqOperationHelper<T, U>::value, typename _EqOperationHelper<T, U>::type>::type
1216 {
1217 return !(*this == prop);
1218 }
1219
1223 template <typename U>
1224 auto operator<(U &&value) const
1225 -> typename std::enable_if<_LtOperationHelper<T, U>::value, typename _LtOperationHelper<T, U>::type>::type
1226 {
1227 return this->Get() < std::forward<U>(value);
1228 }
1229
1233 template <typename D, typename U>
1234 auto operator<(const PropertyBase<U, D> &prop) const
1235 -> typename std::enable_if<_LtOperationHelper<T, U>::value, typename _LtOperationHelper<T, U>::type>::type
1236 {
1237 return this->Get() < prop.Get();
1238 }
1239
1243 template <typename U>
1244 auto operator<=(U &&value) const
1245 -> typename std::enable_if<_LeOperationHelper<T, U>::value, typename _LeOperationHelper<T, U>::type>::type
1246 {
1247 return this->Get() <= std::forward<U>(value);
1248 }
1249
1253 template <typename D, typename U>
1254 auto operator<=(const PropertyBase<U, D> &prop) const
1255 -> typename std::enable_if<_LeOperationHelper<T, U>::value, typename _LeOperationHelper<T, U>::type>::type
1256 {
1257 return this->Get() <= prop.Get();
1258 }
1259
1263 template <typename U>
1264 auto operator>(U &&value) const
1265 -> typename std::enable_if<_GtOperationHelper<T, U>::value, typename _GtOperationHelper<T, U>::type>::type
1266 {
1267 return this->Get() > std::forward<U>(value);
1268 }
1269
1273 template <typename D, typename U>
1274 auto operator>(const PropertyBase<U, D> &prop) const
1275 -> typename std::enable_if<_GtOperationHelper<T, U>::value, typename _GtOperationHelper<T, U>::type>::type
1276 {
1277 return this->Get() > prop.Get();
1278 }
1279
1283 template <typename U>
1284 auto operator>=(U &&value) const
1285 -> typename std::enable_if<_GeOperationHelper<T, U>::value, typename _GeOperationHelper<T, U>::type>::type
1286 {
1287 return this->Get() >= std::forward<U>(value);
1288 }
1289
1293 template <typename D, typename U>
1294 auto operator>=(const PropertyBase<U, D> &prop) const
1295 -> typename std::enable_if<_GeOperationHelper<T, U>::value, typename _GeOperationHelper<T, U>::type>::type
1296 {
1297 return this->Get() >= prop.Get();
1298 }
1299
1303 template <typename U>
1304 auto operator&(U &&value) const
1305 -> typename std::enable_if<_BitAndOperationHelper<T, U>::value, typename _BitAndOperationHelper<T, U>::type>::type
1306 {
1307 return this->Get() & std::forward<U>(value);
1308 }
1309
1313 template <typename D, typename U>
1314 auto operator&(const PropertyBase<U, D> &prop) const
1315 -> typename std::enable_if<_BitAndOperationHelper<T, U>::value, typename _BitAndOperationHelper<T, U>::type>::type
1316 {
1317 return this->Get() & prop.Get();
1318 }
1319
1323 template <typename U>
1324 auto operator|(U &&value) const
1325 -> typename std::enable_if<_BitOrOperationHelper<T, U>::value, typename _BitOrOperationHelper<T, U>::type>::type
1326 {
1327 return this->Get() | std::forward<U>(value);
1328 }
1329
1333 template <typename D, typename U>
1334 auto operator|(const PropertyBase<U, D> &prop) const
1335 -> typename std::enable_if<_BitOrOperationHelper<T, U>::value, typename _BitOrOperationHelper<T, U>::type>::type
1336 {
1337 return this->Get() | prop.Get();
1338 }
1339
1343 template <typename U>
1344 auto operator^(U &&value) const
1345 -> typename std::enable_if<_BitXorOperationHelper<T, U>::value, typename _BitXorOperationHelper<T, U>::type>::type
1346 {
1347 return this->Get() ^ std::forward<U>(value);
1348 }
1349
1353 template <typename D, typename U>
1354 auto operator^(const PropertyBase<U, D> &prop) const
1355 -> typename std::enable_if<_BitXorOperationHelper<T, U>::value, typename _BitXorOperationHelper<T, U>::type>::type
1356 {
1357 return this->Get() ^ prop.Get();
1358 }
1359
1363 template <typename U>
1364 auto operator<<(U &&value) const
1365 -> typename std::enable_if<_ShlOperationHelper<T, U>::value, typename _ShlOperationHelper<T, U>::type>::type
1366 {
1367 return this->Get() << std::forward<U>(value);
1368 }
1369
1373 template <typename D, typename U>
1374 auto operator<<(const PropertyBase<U, D> &prop) const
1375 -> typename std::enable_if<_ShlOperationHelper<T, U>::value, typename _ShlOperationHelper<T, U>::type>::type
1376 {
1377 return this->Get() << prop.Get();
1378 }
1379
1383 template <typename U>
1384 auto operator>>(U &&value) const
1385 -> typename std::enable_if<_ShrOperationHelper<T, U>::value, typename _ShrOperationHelper<T, U>::type>::type
1386 {
1387 return this->Get() >> std::forward<U>(value);
1388 }
1389
1393 template <typename D, typename U>
1394 auto operator>>(const PropertyBase<U, D> &prop) const
1395 -> typename std::enable_if<_ShrOperationHelper<T, U>::value, typename _ShrOperationHelper<T, U>::type>::type
1396 {
1397 return this->Get() >> prop.Get();
1398 }
1399
1403 template <typename U>
1404 auto operator&&(U &&value) const
1405 -> typename std::enable_if<_LogicAndOperationHelper<T, U>::value, typename _LogicAndOperationHelper<T, U>::type>::type
1406 {
1407 return this->Get() && std::forward<U>(value);
1408 }
1409
1413 template <typename D, typename U>
1414 auto operator&&(const PropertyBase<U, D> &prop) const
1415 -> typename std::enable_if<_LogicAndOperationHelper<T, U>::value, typename _LogicAndOperationHelper<T, U>::type>::type
1416 {
1417 return this->Get() && prop.Get();
1418 }
1419
1423 template <typename U>
1424 auto operator||(U &&value) const
1425 -> typename std::enable_if<_LogicOrOperationHelper<T, U>::value, typename _LogicOrOperationHelper<T, U>::type>::type
1426 {
1427 return this->Get() || std::forward<U>(value);
1428 }
1429
1433 template <typename D, typename U>
1434 auto operator||(const PropertyBase<U, D> &prop) const
1435 -> typename std::enable_if<_LogicOrOperationHelper<T, U>::value, typename _LogicOrOperationHelper<T, U>::type>::type
1436 {
1437 return this->Get() || prop.Get();
1438 }
1439
1443 template <typename U>
1444 auto operator[](U &&value) const
1445 -> typename std::enable_if<
1447 !std::is_reference<typename _BracketOperationHelper<T, U>::type>::value,
1449 {
1450 return this->Get()[std::forward<U>(value)];
1451 }
1452
1456 template <typename D, typename U>
1457 auto operator[](const PropertyBase<U, D> &prop) const
1458 -> typename std::enable_if<
1460 !std::is_reference<typename _BracketOperationHelper<T, U>::type>::value,
1462 {
1463 return this->Get()[prop.Get()];
1464 }
1465
1469 template <typename U>
1470 auto operator[](U &&value) const
1471 -> typename std::enable_if<
1472 _BracketOperationHelper<T, U>::value && std::is_pointer<T>::value,
1474 {
1475 return this->Get()[std::forward<U>(value)];
1476 }
1477
1481 template <typename D, typename U>
1482 auto operator[](const PropertyBase<U, D> &prop) const
1483 -> typename std::enable_if<
1484 _BracketOperationHelper<T, U>::value && std::is_pointer<T>::value,
1486 {
1487 return this->Get()[prop.Get()];
1488 }
1489
1490 protected:
1494 static constexpr std::ptrdiff_t _STATICOFFSET =
1495 (std::numeric_limits<std::ptrdiff_t>::max)();
1496
1500 std::ptrdiff_t _offset{_STATICOFFSET};
1501
1505 bool IsStatic() const noexcept
1506 {
1507 return _offset == _STATICOFFSET;
1508 }
1509
1513 void SetOwner(void *owner) noexcept
1514 {
1515 if (owner == nullptr) {
1517 } else {
1518 _offset = reinterpret_cast<uint8_t *>(owner) - reinterpret_cast<uint8_t *>(this);
1519 }
1520 }
1521
1525 void *GetOwner() const noexcept
1526 {
1527 if (this->IsStatic()) {
1528 return nullptr;
1529 } else {
1530 return const_cast<uint8_t *>(reinterpret_cast<const uint8_t *>(this)) + _offset;
1531 }
1532 }
1533
1534 public:
1538 template <typename TOwner>
1540 {
1542 }
1543
1551 };
1552
1553 /*================================================================================*/
1554
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
1561 {
1562 return std::forward<T>(left) + right.Get();
1563 }
1564
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
1571 {
1572 return std::forward<T>(left) - right.Get();
1573 }
1574
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
1581 {
1582 return std::forward<T>(left) * right.Get();
1583 }
1584
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
1591 {
1592 return std::forward<T>(left) / right.Get();
1593 }
1594
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
1601 {
1602 return std::forward<T>(left) % right.Get();
1603 }
1604
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
1611 {
1612 return std::forward<T>(left) == right.Get();
1613 }
1614
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
1622 {
1623 return !(std::forward<T>(left) == right);
1624 }
1625
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
1632 {
1633 return std::forward<T>(left) < right.Get();
1634 }
1635
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
1642 {
1643 return std::forward<T>(left) <= right.Get();
1644 }
1645
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
1652 {
1653 return std::forward<T>(left) > right.Get();
1654 }
1655
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
1662 {
1663 return std::forward<T>(left) >= right.Get();
1664 }
1665
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
1672 {
1673 return std::forward<T>(left) & right.Get();
1674 }
1675
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
1682 {
1683 return std::forward<T>(left) | right.Get();
1684 }
1685
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
1692 {
1693 return std::forward<T>(left) ^ right.Get();
1694 }
1695
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
1702 {
1703 return std::forward<T>(left) << right.Get();
1704 }
1705
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
1712 {
1713 return std::forward<T>(left) >> right.Get();
1714 }
1715
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
1722 {
1723 return std::forward<T>(left) && right.Get();
1724 }
1725
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
1732 {
1733 return std::forward<T>(left) || right.Get();
1734 }
1735
1736 /*================================================================================*/
1737
1741 template <typename T>
1742 class Property : public PropertyBase<T, Property<T>>
1743 {
1744 public:
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);
1752
1753 private:
1757 void *_getter;
1758
1762 void *_setter;
1763
1764 public:
1768 using TBase::operator=;
1769
1773 template <typename TOwner>
1775 {
1776 assert(initializer._owner != nullptr);
1777 assert(initializer._getter != nullptr);
1778 assert(initializer._setter != nullptr);
1779
1780 this->SetOwner(initializer._owner);
1781 this->_getter = reinterpret_cast<void *>(initializer._getter);
1782 this->_setter = reinterpret_cast<void *>(initializer._setter);
1783 }
1784
1788 explicit Property(const StaticPropertyInitializer<T> &initializer)
1789 {
1790 assert(initializer._getter != nullptr);
1791 assert(initializer._setter != nullptr);
1792
1793 this->SetOwner(nullptr);
1794 this->_getter = reinterpret_cast<void *>(initializer._getter);
1795 this->_setter = reinterpret_cast<void *>(initializer._setter);
1796 }
1797
1801 T GetterImpl() const
1802 {
1803 if (this->IsStatic()) {
1804 return reinterpret_cast<TStaticGetter>(this->_getter)();
1805 } else {
1806 return reinterpret_cast<TGetter>(this->_getter)(this->GetOwner());
1807 }
1808 }
1809
1813 void SetterImpl(TSetterParam value) const
1814 {
1815 if (this->IsStatic()) {
1816 reinterpret_cast<TStaticSetter>(this->_setter)(value);
1817 } else {
1818 reinterpret_cast<TSetter>(this->_setter)(this->GetOwner(), value);
1819 }
1820 }
1821 };
1822
1826 template <typename T>
1827 class ReadOnlyProperty : public PropertyBase<T, ReadOnlyProperty<T>>
1828 {
1829 public:
1831 using TValue = typename TBase::TValue;
1832 using TSetterParam = typename TBase::TSetterParam;
1833 using TGetter = T (*)(void *);
1834 using TStaticGetter = T (*)();
1835
1836 private:
1840 void *_getter;
1841
1842 public:
1846 template <typename TOwner>
1848 {
1849 assert(initializer._owner != nullptr);
1850 assert(initializer._getter != nullptr);
1851
1852 this->SetOwner(initializer._owner);
1853 this->_getter = reinterpret_cast<void *>(initializer._getter);
1854 }
1855
1860 {
1861 assert(initializer._getter != nullptr);
1862
1863 this->SetOwner(nullptr);
1864 this->_getter = reinterpret_cast<void *>(initializer._getter);
1865 }
1866
1870 T GetterImpl() const
1871 {
1872 if (this->IsStatic()) {
1873 return reinterpret_cast<TStaticGetter>(this->_getter)();
1874 } else {
1875 return reinterpret_cast<TGetter>(this->_getter)(this->GetOwner());
1876 }
1877 }
1878 };
1879
1883 template <typename T>
1884 class WriteOnlyProperty : public PropertyBase<T, WriteOnlyProperty<T>>
1885 {
1886 public:
1888 using TValue = typename TBase::TValue;
1889 using TSetterParam = typename TBase::TSetterParam;
1890 using TSetter = void (*)(void *, TSetterParam);
1891 using TStaticSetter = void (*)(TSetterParam);
1892
1893 private:
1897 void *_setter;
1898
1899 public:
1903 using TBase::operator=;
1904
1908 template <typename TOwner>
1910 {
1911 assert(initializer._owner != nullptr);
1912 assert(initializer._setter != nullptr);
1913
1914 this->SetOwner(initializer._owner);
1915 this->_setter = reinterpret_cast<void *>(initializer._setter);
1916 }
1917
1922 {
1923 assert(initializer._setter != nullptr);
1924
1925 this->SetOwner(nullptr);
1926 this->_setter = reinterpret_cast<void *>(initializer._setter);
1927 }
1928
1932 void SetterImpl(TSetterParam value) const
1933 {
1934 if (this->IsStatic()) {
1935 reinterpret_cast<TStaticSetter>(this->_setter)(value);
1936 } else {
1937 reinterpret_cast<TSetter>(this->_setter)(this->GetOwner(), value);
1938 }
1939 }
1940 };
1941}
1942
1943/*================================================================================*/
1944
1949#include <string>
1950
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>
1955
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>
1960
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