8#include "IComparable.h"
20 template <
typename T,
typename =
void>
32 template <
typename,
typename>
45 : _isBoxedObject(
false)
62 return _isBoxedObject;
73 return GetBoxedRawPtr() ==
other.GetBoxedRawPtr();
74 return this == &
other;
83#if defined(SW_DISABLE_REFLECTION)
84 throw std::runtime_error(
"Reflection is disabled, cannot get type index.");
98 ->
typename std::enable_if<std::is_base_of<DynamicObject, T>::value,
bool>::type
100#if defined(SW_DISABLE_REFLECTION)
101 throw std::runtime_error(
"Reflection is disabled, cannot check type.");
103 if (
pout ==
nullptr) {
104 return dynamic_cast<T *
>(
this) !=
nullptr;
106 *
pout =
dynamic_cast<T *
>(
this);
107 return *
pout !=
nullptr;
118 template <
typename T>
122#if defined(SW_DISABLE_REFLECTION)
123 throw std::runtime_error(
"Reflection is disabled, cannot check type.");
125 if (
pout ==
nullptr) {
126 return dynamic_cast<const T *
>(
this) !=
nullptr;
128 *
pout =
dynamic_cast<const T *
>(
this);
129 return *
pout !=
nullptr;
140 template <
typename T>
142 ->
typename std::enable_if<std::is_base_of<DynamicObject, T>::value,
T &>::type
144#if defined(SW_DISABLE_REFLECTION)
145 throw std::runtime_error(
"Reflection is disabled, cannot perform dynamic cast.");
147 return dynamic_cast<T &
>(*this);
157 template <
typename T>
161#if defined(SW_DISABLE_REFLECTION)
162 throw std::runtime_error(
"Reflection is disabled, cannot perform dynamic cast.");
164 return dynamic_cast<const T &
>(*this);
174 template <
typename T>
176 ->
typename std::enable_if<
179 return static_cast<T &
>(*this);
189 template <
typename T>
191 ->
typename std::enable_if<
203 template <
typename T>
208 return static_cast<const T &
>(*this);
218 template <
typename T>
233 template <
typename T>
243 template <
typename T>
253 template <
typename T>
370 virtual void *GetBoxedRawPtr() noexcept
379 virtual const void *GetBoxedRawPtr() const noexcept
390 template <
typename T>
404 template <
typename U,
typename =
void>
421 template <
typename U>
452 : _isRef(
isRef.val), _data()
454 _isBoxedObject =
true;
460 void Release()
noexcept(std::is_nothrow_destructible<T>::value)
472 template <
typename...
Args>
476 new (_data.objbuf)
T(std::forward<Args>(
args)...);
495 result._data.refptr = ptr;
505 template <
typename U>
507 ->
typename std::enable_if<_IsStaticCastable<U, T>::value,
BoxedObject<T>>::type
522 _data.refptr =
other._data.refptr;
524 new (_data.objbuf)
T(
other.Unbox());
536 _data.refptr =
other._data.refptr;
537 other._data.refptr =
nullptr;
539 new (_data.objbuf)
T(std::move(
other.Unbox()));
555 _data.refptr =
other._data.refptr;
557 auto oldPtr = _data.refptr;
559 new (_data.objbuf)
T(
other.Unbox());
569 _data.refptr =
other._data.refptr;
572 Unbox() =
other.Unbox();
590 _data.refptr =
other._data.refptr;
591 other._data.refptr =
nullptr;
593 auto oldPtr = _data.refptr;
595 new (_data.objbuf)
T(std::move(
other.Unbox()));
605 _data.refptr =
other._data.refptr;
607 other._data.refptr =
nullptr;
609 Unbox() = std::move(
other.Unbox());
630 return _isRef && (_data.refptr ==
nullptr);
650 return _isRef ? *_data.refptr : *
reinterpret_cast<T *
>(_data.objbuf);
661 return _isRef ? *_data.refptr : *
reinterpret_cast<const T *
>(_data.objbuf);
669 virtual std::type_index GetBoxedType()
const noexcept override
678 virtual bool IsBoxedPolymorphic() const noexcept
override
680 return std::is_polymorphic<T>::value;
687 virtual void *GetBoxedRawPtr() noexcept
override
689 return _isRef ?
static_cast<void *
>(_data.refptr) : static_cast<void *>(_data.objbuf);
696 virtual const void *GetBoxedRawPtr() const noexcept
override
698 return _isRef ?
static_cast<const void *
>(_data.refptr) : static_cast<const void *>(_data.objbuf);
710 template <
typename T>
712 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && _IsDynamicCastable<DynamicObject *, T *>::value,
bool>::type
714#if defined(SW_DISABLE_REFLECTION)
715 throw std::runtime_error(
"Reflection is disabled, cannot check type.");
717 if (!_isBoxedObject) {
718 if (pout ==
nullptr) {
719 return dynamic_cast<T *
>(
this) !=
nullptr;
721 *pout =
dynamic_cast<T *
>(
this);
722 return *pout !=
nullptr;
725 if (GetBoxedType() ==
typeid(
T)) {
726 if (pout ==
nullptr) {
727 return GetBoxedRawPtr() !=
nullptr;
729 *pout =
static_cast<T *
>(GetBoxedRawPtr());
730 return *pout !=
nullptr;
733 if (pout !=
nullptr) {
748 template <
typename T>
750 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && !_IsDynamicCastable<DynamicObject *, T *>::value,
bool>::type
752#if defined(SW_DISABLE_REFLECTION)
753 throw std::runtime_error(
"Reflection is disabled, cannot check type.");
755 if (!_isBoxedObject) {
756 if (pout !=
nullptr) {
761 if (GetBoxedType() ==
typeid(
T)) {
762 if (pout ==
nullptr) {
763 return GetBoxedRawPtr() !=
nullptr;
765 *pout =
static_cast<T *
>(GetBoxedRawPtr());
766 return *pout !=
nullptr;
769 if (pout !=
nullptr) {
784 template <
typename T>
786 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && _IsDynamicCastable<DynamicObject *, T *>::value,
bool>::type
788#if defined(SW_DISABLE_REFLECTION)
789 throw std::runtime_error(
"Reflection is disabled, cannot check type.");
791 if (!_isBoxedObject) {
792 if (pout ==
nullptr) {
793 return dynamic_cast<const T *
>(
this) !=
nullptr;
795 *pout =
dynamic_cast<const T *
>(
this);
796 return *pout !=
nullptr;
799 if (GetBoxedType() ==
typeid(
T)) {
800 if (pout ==
nullptr) {
801 return GetBoxedRawPtr() !=
nullptr;
803 *pout =
static_cast<const T *
>(GetBoxedRawPtr());
804 return *pout !=
nullptr;
807 if (pout !=
nullptr) {
822 template <
typename T>
824 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && !_IsDynamicCastable<DynamicObject *, T *>::value,
bool>::type
826#if defined(SW_DISABLE_REFLECTION)
827 throw std::runtime_error(
"Reflection is disabled, cannot check type.");
829 if (!_isBoxedObject) {
830 if (pout !=
nullptr) {
835 if (GetBoxedType() ==
typeid(
T)) {
836 if (pout ==
nullptr) {
837 return GetBoxedRawPtr() !=
nullptr;
839 *pout =
static_cast<const T *
>(GetBoxedRawPtr());
840 return *pout !=
nullptr;
843 if (pout !=
nullptr) {
858 template <
typename T>
860 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && _IsDynamicCastable<DynamicObject *, T *>::value,
T &>::type
862#if defined(SW_DISABLE_REFLECTION)
863 throw std::runtime_error(
"Reflection is disabled, cannot perform dynamic cast.");
865 if (!_isBoxedObject) {
866 return dynamic_cast<T &
>(*this);
868 void *rawPtr = GetBoxedRawPtr();
869 if (rawPtr ==
nullptr || GetBoxedType() !=
typeid(
T)) {
870 throw std::bad_cast();
872 return *
static_cast<T *
>(rawPtr);
884 template <
typename T>
886 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && !_IsDynamicCastable<DynamicObject *, T *>::value,
T &>::type
888#if defined(SW_DISABLE_REFLECTION)
889 throw std::runtime_error(
"Reflection is disabled, cannot perform dynamic cast.");
891 if (!_isBoxedObject) {
892 throw std::bad_cast();
894 void *rawPtr = GetBoxedRawPtr();
895 if (rawPtr ==
nullptr || GetBoxedType() !=
typeid(
T)) {
896 throw std::bad_cast();
898 return *
static_cast<T *
>(rawPtr);
910 template <
typename T>
912 -> typename std::enable_if<!std::is_base_of<DynamicObject,
T>::value && _IsDynamicCastable<DynamicObject *,
T *>::value, const
T &>::type
914#if defined(SW_DISABLE_REFLECTION)
915 throw std::runtime_error(
"Reflection is disabled, cannot perform dynamic cast.");
917 if (!_isBoxedObject) {
918 return dynamic_cast<const T &
>(*this);
920 const void *rawPtr = GetBoxedRawPtr();
921 if (rawPtr ==
nullptr || GetBoxedType() !=
typeid(
T)) {
922 throw std::bad_cast();
924 return *
static_cast<const T *
>(rawPtr);
936 template <
typename T>
938 -> typename std::enable_if<!std::is_base_of<DynamicObject,
T>::value && !_IsDynamicCastable<DynamicObject *,
T *>::value, const
T &>::type
940#if defined(SW_DISABLE_REFLECTION)
941 throw std::runtime_error(
"Reflection is disabled, cannot perform dynamic cast.");
943 if (!_isBoxedObject) {
944 throw std::bad_cast();
946 const void *rawPtr = GetBoxedRawPtr();
947 if (rawPtr ==
nullptr || GetBoxedType() !=
typeid(
T)) {
948 throw std::bad_cast();
950 return *
static_cast<const T *
>(rawPtr);
962 template <
typename T>
964 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && _IsStaticCastable<DynamicObject *, T *>::value,
T &>::type
966 if (!_isBoxedObject) {
967 return static_cast<T &
>(*this);
969 return static_cast<BoxedObject<T> &
>(*this).Unbox();
980 template <
typename T>
982 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && !_IsStaticCastable<DynamicObject *, T *>::value,
T &>::type
984 if (!_isBoxedObject) {
985 return DynamicCast<T>();
987 return static_cast<BoxedObject<T> &
>(*this).Unbox();
997 template <
typename T>
999 -> typename std::enable_if<!std::is_base_of<DynamicObject,
T>::value &&
_IsStaticCastable<DynamicObject *,
T *>::value, const
T &>::type
1001 if (!_isBoxedObject) {
1002 return static_cast<const T &
>(*this);
1004 return static_cast<const BoxedObject<T> &
>(*this).Unbox();
1015 template <
typename T>
1017 -> typename std::enable_if<!std::is_base_of<DynamicObject,
T>::value && !
_IsStaticCastable<DynamicObject *,
T *>::value, const
T &>::type
1019 if (!_isBoxedObject) {
1020 return DynamicCast<T>();
1022 return static_cast<const BoxedObject<T> &
>(*this).Unbox();
1056 return std::to_wstring(
value);
1094 template <
typename T,
typename TField>
1097 auto pfunc = &Reflection::GetFieldId<T, TField>;
1106 for (
size_t i = 0;
i <
sizeof(
buffer); ++
i) {
1122 template <
typename T,
typename TRet,
typename...
Args>
1138 template <
typename T,
typename TRet,
typename...
Args>
1153 template <
typename T,
typename TField>
1157 return obj.UnsafeCast<
T>().*
field;
1169 template <
typename T,
typename TProperty>
1176 return (obj.UnsafeCast<
T>().*
prop).Get();
1188 template <
typename T,
typename TProperty>
1205 template <
typename T,
typename TProperty>
1212 (obj.
UnsafeCast<
T>().*
prop).Set(std::forward<typename TProperty::TSetterParam>(value));
1224 template <
typename T,
typename TProperty>
1244 template <
typename T,
typename TFunc,
typename...
Args>
1246 ->
typename std::enable_if<std::is_base_of<DynamicObject, T>::value,
1247 decltype(
method(obj, std::forward<Args>(
args)...))>::type
1250 return method(obj, std::forward<Args>(
args)...);
1263 template <
typename T,
typename TFunc,
typename...
Args>
1265 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value,
1266 decltype(
method(std::declval<DynamicObject &>(), std::forward<Args>(
args)...))>::type
1281 template <
typename T,
typename TField>
1283 ->
typename std::enable_if<std::is_base_of<DynamicObject, T>::value,
TField &>::type
1297 template <
typename T,
typename TField>
1299 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value,
TField &>::type
1314 template <
typename T,
typename TValue>
1316 ->
typename std::enable_if<std::is_base_of<DynamicObject, T>::value, TValue>::type
1330 template <
typename T,
typename TValue>
1332 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value, TValue>::type
1348 template <
typename T,
typename TParam,
typename TValue>
1350 ->
typename std::enable_if<std::is_base_of<DynamicObject, T>::value>::type
1353 setter(obj, std::forward<TValue>(value));
1365 template <
typename T,
typename TParam,
typename TValue>
1367 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value>::type
1378struct std::hash<
sw::FieldId>
1380 size_t operator()(
sw::FieldId fieldId)
const noexcept
1382 return static_cast<size_t>(fieldId.
value);
BoxedObject(const BoxedObject &other) noexcept(std::is_nothrow_copy_constructible< T >::value)
拷贝构造函数
Definition Reflection.h:518
static auto MakeRef(BoxedObject< U > &other) noexcept -> typename std::enable_if< _IsStaticCastable< U, T >::value, BoxedObject< T > >::type
创建引用类型的装箱对象
Definition Reflection.h:506
BoxedObject(BoxedObject &&other) noexcept(std::is_nothrow_move_constructible< T >::value)
移动构造函数
Definition Reflection.h:532
T & Unbox() noexcept
获取装箱对象中的值
Definition Reflection.h:647
static BoxedObject< T > MakeRef(T *ptr) noexcept
创建引用类型的装箱对象
Definition Reflection.h:492
BoxedObject(Args &&...args)
构造值类型的装箱对象
Definition Reflection.h:473
bool HasValue() const noexcept
判断当前装箱对象是否包含有效值
Definition Reflection.h:637
bool IsRef() const noexcept
判断当前装箱对象是否为引用类型
Definition Reflection.h:619
BoxedObject & operator=(BoxedObject &&other)
移动赋值运算符
Definition Reflection.h:583
bool IsNullRef() const noexcept
判断当前装箱对象是否为空引用
Definition Reflection.h:628
virtual ~BoxedObject()
析构函数
Definition Reflection.h:482
const T & Unbox() const noexcept
获取装箱对象中的值
Definition Reflection.h:658
BoxedObject & operator=(const BoxedObject &other)
拷贝赋值运算符
Definition Reflection.h:548
装箱对象模板类声明
Definition Reflection.h:21
动态对象基类
Definition Reflection.h:27
auto UnsafeCast() -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value &&_IsStaticCastable< DynamicObject *, T * >::value, T & >::type
将对象不安全地转换为指定类型的引用
Definition Reflection.h:175
auto IsType(const T **pout=nullptr) const -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value, bool >::type
判断对象是否为指定类型
Definition Reflection.h:119
auto UnsafeCast() -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value &&!_IsStaticCastable< DynamicObject *, T * >::value, T & >::type
将对象不安全地转换为指定类型的引用
Definition Reflection.h:190
auto UnsafeCast() const -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value &&_IsStaticCastable< DynamicObject *, T * >::value, const T & >::type
将对象不安全地转换为指定类型的引用
Definition Reflection.h:204
bool ReferenceEquals(const DynamicObject &other) const noexcept
判断与另一DynamicObject是否引用同一对象
Definition Reflection.h:70
auto UnsafeCast() const -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value &&!_IsStaticCastable< DynamicObject *, T * >::value, const T & >::type
将对象不安全地转换为指定类型的引用
Definition Reflection.h:219
virtual ~DynamicObject()
析构函数
Definition Reflection.h:52
auto DynamicCast() -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value, T & >::type
将对象动态转换为指定类型的引用
Definition Reflection.h:141
auto IsType(const T **pout=nullptr) const -> typename std::enable_if<!std::is_base_of< DynamicObject, T >::value &&_IsDynamicCastable< DynamicObject *, T * >::value, bool >::type
判断对象是否为指定类型
auto DynamicCast() const -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value, const T & >::type
将对象动态转换为指定类型的常量引用
Definition Reflection.h:158
std::type_index GetType() const
获取对象的类型信息
Definition Reflection.h:81
auto IsType(T **pout=nullptr) -> typename std::enable_if<!std::is_base_of< DynamicObject, T >::value &&_IsDynamicCastable< DynamicObject *, T * >::value, bool >::type
判断对象是否为指定类型
auto IsType(T **pout=nullptr) -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value, bool >::type
判断对象是否为指定类型
Definition Reflection.h:97
DynamicObject() noexcept
默认构造函数
Definition Reflection.h:44
bool IsBoxedObject() const noexcept
判断对象是否为装箱对象
Definition Reflection.h:60
auto IsType(T **pout=nullptr) -> typename std::enable_if<!std::is_base_of< DynamicObject, T >::value &&!_IsDynamicCastable< DynamicObject *, T * >::value, bool >::type
判断对象是否为指定类型
全序比较接口
Definition IComparable.h:54
为支持ToString方法的类提供统一接口
Definition IToString.h:13
值转换器接口
Definition IValueConverter.h:14
提供反射相关功能
Definition Reflection.h:1079
static auto GetMethod(TRet(T::*method)(Args...)) -> Delegate< TRet(DynamicObject &, Args...)>
获取成员函数的委托
Definition Reflection.h:1123
static auto AccessField(const Delegate< TField &(DynamicObject &)> &accessor, T &obj) -> typename std::enable_if<!std::is_base_of< DynamicObject, T >::value, TField & >::type
访问字段
Definition Reflection.h:1298
static auto InvokeMethod(const Delegate< TFunc > &method, T &obj, Args &&...args) -> typename std::enable_if<!std::is_base_of< DynamicObject, T >::value, decltype(method(std::declval< DynamicObject & >(), std::forward< Args >(args)...))>::type
调用成员函数
Definition Reflection.h:1264
static auto GetFieldAccessor(TField T::*field) -> Delegate< TField &(DynamicObject &)>
获取字段的访问器
Definition Reflection.h:1154
static auto GetPropertySetter(TProperty T::*prop) -> typename std::enable_if< _IsWritableProperty< TProperty >::value, Delegate< void(DynamicObject &, typename TProperty::TSetterParam)> >::type
获取属性的Setter委托
Definition Reflection.h:1206
static auto GetPropertyGetter(TProperty T::*prop) -> typename std::enable_if< _IsProperty< TProperty >::value &&!_IsReadableProperty< TProperty >::value, Delegate< typename TProperty::TValue(DynamicObject &)> >::type
获取属性的Getter委托
Definition Reflection.h:1189
static auto GetProperty(const Delegate< TValue(DynamicObject &)> &getter, T &obj) -> typename std::enable_if<!std::is_base_of< DynamicObject, T >::value, TValue >::type
获取属性值
Definition Reflection.h:1331
static FieldId GetFieldId(TField T::*field) noexcept
获取字段的唯一标识符
Definition Reflection.h:1095
static auto GetProperty(const Delegate< TValue(DynamicObject &)> &getter, T &obj) -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value, TValue >::type
获取属性值
Definition Reflection.h:1315
static auto AccessField(const Delegate< TField &(DynamicObject &)> &accessor, T &obj) -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value, TField & >::type
访问字段
Definition Reflection.h:1282
static auto SetProperty(const Delegate< void(DynamicObject &, TParam)> &setter, T &obj, TValue &&value) -> typename std::enable_if<!std::is_base_of< DynamicObject, T >::value >::type
设置属性值
Definition Reflection.h:1366
static auto GetMethod(TRet(T::*method)(Args...) const) -> Delegate< TRet(DynamicObject &, Args...)>
获取常量成员函数的委托
Definition Reflection.h:1139
static auto GetPropertyGetter(TProperty T::*prop) -> typename std::enable_if< _IsReadableProperty< TProperty >::value, Delegate< typename TProperty::TValue(DynamicObject &)> >::type
获取属性的Getter委托
Definition Reflection.h:1170
static auto SetProperty(const Delegate< void(DynamicObject &, TParam)> &setter, T &obj, TValue &&value) -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value >::type
设置属性值
Definition Reflection.h:1349
static auto InvokeMethod(const Delegate< TFunc > &method, T &obj, Args &&...args) -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value, decltype(method(obj, std::forward< Args >(args)...))>::type
调用成员函数
Definition Reflection.h:1245
static auto GetPropertySetter(TProperty T::*prop) -> typename std::enable_if< _IsProperty< TProperty >::value &&!_IsWritableProperty< TProperty >::value, Delegate< void(DynamicObject &, typename TProperty::TSetterParam)> >::type
获取属性的Setter委托
Definition Reflection.h:1225
Reflection()=delete
静态类,不允许实例化
SimpleWindow框架的顶级命名空间,所有公共类型、控件、枚举和工具函数均定义于此。
Definition Alignment.h:4
_IsExplicitlyConvertable< TFrom, TTo > _IsStaticCastable
用于判断是否可以通过static_cast进行转换
Definition Internal.h:34
表示字段的唯一标识符
Definition Reflection.h:1032
std::wstring ToString() const
获取字段ID的字符串表示形式
Definition Reflection.h:1054
int CompareTo(FieldId other) const
比较字段ID
Definition Reflection.h:1063
uint32_t value
字段ID的数值
Definition Reflection.h:1036
FieldId(uint32_t value)
构造指定值的字段ID
Definition Reflection.h:1046
判断类型是否可以使用dynamic_cast进行转换的辅助模板
Definition Internal.h:40
判断类型是否为属性的辅助模板
Definition Property.h:95
判断类型是否为可读属性的辅助模板
Definition Property.h:133
判断类型是否为可写属性的辅助模板
Definition Property.h:141