8#include "IComparable.h"
20 template <
typename T,
typename =
void>
32 template <
typename,
typename>
45 : _isBoxedObject(
false)
62 return _isBoxedObject;
71#if defined(SW_DISABLE_REFLECTION)
72 throw std::runtime_error(
"Reflection is disabled, cannot get type index.");
86 ->
typename std::enable_if<std::is_base_of<DynamicObject, T>::value,
bool>::type
88#if defined(SW_DISABLE_REFLECTION)
89 throw std::runtime_error(
"Reflection is disabled, cannot check type.");
91 if (
pout ==
nullptr) {
92 return dynamic_cast<T *
>(
this) !=
nullptr;
94 *
pout =
dynamic_cast<T *
>(
this);
95 return *
pout !=
nullptr;
106 template <
typename T>
110#if defined(SW_DISABLE_REFLECTION)
111 throw std::runtime_error(
"Reflection is disabled, cannot check type.");
113 if (
pout ==
nullptr) {
114 return dynamic_cast<const T *
>(
this) !=
nullptr;
116 *
pout =
dynamic_cast<const T *
>(
this);
117 return *
pout !=
nullptr;
128 template <
typename T>
130 ->
typename std::enable_if<std::is_base_of<DynamicObject, T>::value,
T &>::type
132#if defined(SW_DISABLE_REFLECTION)
133 throw std::runtime_error(
"Reflection is disabled, cannot perform dynamic cast.");
135 return dynamic_cast<T &
>(*this);
145 template <
typename T>
149#if defined(SW_DISABLE_REFLECTION)
150 throw std::runtime_error(
"Reflection is disabled, cannot perform dynamic cast.");
152 return dynamic_cast<const T &
>(*this);
162 template <
typename T>
164 ->
typename std::enable_if<
167 return static_cast<T &
>(*this);
177 template <
typename T>
179 ->
typename std::enable_if<
191 template <
typename T>
196 return static_cast<const T &
>(*this);
206 template <
typename T>
221 template <
typename T>
231 template <
typename T>
241 template <
typename T>
358 virtual void *GetBoxedRawPtr() noexcept
367 virtual const void *GetBoxedRawPtr() const noexcept
378 template <
typename T>
392 template <
typename U,
typename =
void>
409 template <
typename U>
440 : _isRef(
isRef.val), _data()
442 _isBoxedObject =
true;
448 void Release()
noexcept(std::is_nothrow_destructible<T>::value)
460 template <
typename...
Args>
464 new (_data.objbuf)
T(std::forward<Args>(
args)...);
493 template <
typename U>
495 ->
typename std::enable_if<_IsStaticCastable<U, T>::value,
BoxedObject<T>>::type
510 _data.refptr =
other._data.refptr;
512 new (_data.objbuf)
T(
other.Unbox());
524 _data.refptr =
other._data.refptr;
525 other._data.refptr =
nullptr;
527 new (_data.objbuf)
T(std::move(
other.Unbox()));
543 _data.refptr =
other._data.refptr;
545 auto oldPtr = _data.refptr;
547 new (_data.objbuf)
T(
other.Unbox());
557 _data.refptr =
other._data.refptr;
560 Unbox() =
other.Unbox();
578 _data.refptr =
other._data.refptr;
579 other._data.refptr =
nullptr;
581 auto oldPtr = _data.refptr;
583 new (_data.objbuf)
T(std::move(
other.Unbox()));
593 _data.refptr =
other._data.refptr;
595 other._data.refptr =
nullptr;
597 Unbox() = std::move(
other.Unbox());
618 return _isRef && (_data.refptr ==
nullptr);
638 return _isRef ? *_data.refptr : *
reinterpret_cast<T *
>(_data.objbuf);
649 return _isRef ? *_data.refptr : *
reinterpret_cast<const T *
>(_data.objbuf);
657 virtual std::type_index GetBoxedType()
const noexcept override
666 virtual bool IsBoxedPolymorphic() const noexcept
override
668 return std::is_polymorphic<T>::value;
675 virtual void *GetBoxedRawPtr() noexcept
override
677 return _isRef ?
static_cast<void *
>(_data.refptr) : static_cast<void *>(_data.objbuf);
684 virtual const void *GetBoxedRawPtr() const noexcept
override
686 return _isRef ?
static_cast<const void *
>(_data.refptr) : static_cast<const void *>(_data.objbuf);
698 template <
typename T>
700 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && _IsDynamicCastable<DynamicObject *, T *>::value,
bool>::type
702#if defined(SW_DISABLE_REFLECTION)
703 throw std::runtime_error(
"Reflection is disabled, cannot check type.");
705 if (!_isBoxedObject) {
706 if (pout ==
nullptr) {
707 return dynamic_cast<T *
>(
this) !=
nullptr;
709 *pout =
dynamic_cast<T *
>(
this);
710 return *pout !=
nullptr;
713 if (GetBoxedType() ==
typeid(
T)) {
714 if (pout ==
nullptr) {
715 return GetBoxedRawPtr() !=
nullptr;
717 *pout =
static_cast<T *
>(GetBoxedRawPtr());
718 return *pout !=
nullptr;
721 if (pout !=
nullptr) {
736 template <
typename T>
738 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && !_IsDynamicCastable<DynamicObject *, T *>::value,
bool>::type
740#if defined(SW_DISABLE_REFLECTION)
741 throw std::runtime_error(
"Reflection is disabled, cannot check type.");
743 if (!_isBoxedObject) {
744 if (pout !=
nullptr) {
749 if (GetBoxedType() ==
typeid(
T)) {
750 if (pout ==
nullptr) {
751 return GetBoxedRawPtr() !=
nullptr;
753 *pout =
static_cast<T *
>(GetBoxedRawPtr());
754 return *pout !=
nullptr;
757 if (pout !=
nullptr) {
772 template <
typename T>
774 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && _IsDynamicCastable<DynamicObject *, T *>::value,
bool>::type
776#if defined(SW_DISABLE_REFLECTION)
777 throw std::runtime_error(
"Reflection is disabled, cannot check type.");
779 if (!_isBoxedObject) {
780 if (pout ==
nullptr) {
781 return dynamic_cast<const T *
>(
this) !=
nullptr;
783 *pout =
dynamic_cast<const T *
>(
this);
784 return *pout !=
nullptr;
787 if (GetBoxedType() ==
typeid(
T)) {
788 if (pout ==
nullptr) {
789 return GetBoxedRawPtr() !=
nullptr;
791 *pout =
static_cast<const T *
>(GetBoxedRawPtr());
792 return *pout !=
nullptr;
795 if (pout !=
nullptr) {
810 template <
typename T>
812 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && !_IsDynamicCastable<DynamicObject *, T *>::value,
bool>::type
814#if defined(SW_DISABLE_REFLECTION)
815 throw std::runtime_error(
"Reflection is disabled, cannot check type.");
817 if (!_isBoxedObject) {
818 if (pout !=
nullptr) {
823 if (GetBoxedType() ==
typeid(
T)) {
824 if (pout ==
nullptr) {
825 return GetBoxedRawPtr() !=
nullptr;
827 *pout =
static_cast<const T *
>(GetBoxedRawPtr());
828 return *pout !=
nullptr;
831 if (pout !=
nullptr) {
846 template <
typename T>
848 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && _IsDynamicCastable<DynamicObject *, T *>::value,
T &>::type
850#if defined(SW_DISABLE_REFLECTION)
851 throw std::runtime_error(
"Reflection is disabled, cannot perform dynamic cast.");
853 if (!_isBoxedObject) {
854 return dynamic_cast<T &
>(*this);
856 void *rawPtr = GetBoxedRawPtr();
857 if (rawPtr ==
nullptr || GetBoxedType() !=
typeid(
T)) {
858 throw std::bad_cast();
860 return *
static_cast<T *
>(rawPtr);
872 template <
typename T>
874 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && !_IsDynamicCastable<DynamicObject *, T *>::value,
T &>::type
876#if defined(SW_DISABLE_REFLECTION)
877 throw std::runtime_error(
"Reflection is disabled, cannot perform dynamic cast.");
879 if (!_isBoxedObject) {
880 throw std::bad_cast();
882 void *rawPtr = GetBoxedRawPtr();
883 if (rawPtr ==
nullptr || GetBoxedType() !=
typeid(
T)) {
884 throw std::bad_cast();
886 return *
static_cast<T *
>(rawPtr);
898 template <
typename T>
900 -> typename std::enable_if<!std::is_base_of<DynamicObject,
T>::value && _IsDynamicCastable<DynamicObject *,
T *>::value, const
T &>::type
902#if defined(SW_DISABLE_REFLECTION)
903 throw std::runtime_error(
"Reflection is disabled, cannot perform dynamic cast.");
905 if (!_isBoxedObject) {
906 return dynamic_cast<const T &
>(*this);
908 const void *rawPtr = GetBoxedRawPtr();
909 if (rawPtr ==
nullptr || GetBoxedType() !=
typeid(
T)) {
910 throw std::bad_cast();
912 return *
static_cast<const T *
>(rawPtr);
924 template <
typename T>
926 -> typename std::enable_if<!std::is_base_of<DynamicObject,
T>::value && !_IsDynamicCastable<DynamicObject *,
T *>::value, const
T &>::type
928#if defined(SW_DISABLE_REFLECTION)
929 throw std::runtime_error(
"Reflection is disabled, cannot perform dynamic cast.");
931 if (!_isBoxedObject) {
932 throw std::bad_cast();
934 const void *rawPtr = GetBoxedRawPtr();
935 if (rawPtr ==
nullptr || GetBoxedType() !=
typeid(
T)) {
936 throw std::bad_cast();
938 return *
static_cast<const T *
>(rawPtr);
950 template <
typename T>
952 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && _IsStaticCastable<DynamicObject *, T *>::value,
T &>::type
954 if (!_isBoxedObject) {
955 return static_cast<T &
>(*this);
957 return static_cast<BoxedObject<T> &
>(*this).Unbox();
968 template <
typename T>
970 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && !_IsStaticCastable<DynamicObject *, T *>::value,
T &>::type
972 if (!_isBoxedObject) {
973 return DynamicCast<T>();
975 return static_cast<BoxedObject<T> &
>(*this).Unbox();
985 template <
typename T>
987 -> typename std::enable_if<!std::is_base_of<DynamicObject,
T>::value &&
_IsStaticCastable<DynamicObject *,
T *>::value, const
T &>::type
989 if (!_isBoxedObject) {
990 return static_cast<const T &
>(*this);
992 return static_cast<const BoxedObject<T> &
>(*this).Unbox();
1003 template <
typename T>
1005 -> typename std::enable_if<!std::is_base_of<DynamicObject,
T>::value && !
_IsStaticCastable<DynamicObject *,
T *>::value, const
T &>::type
1007 if (!_isBoxedObject) {
1008 return DynamicCast<T>();
1010 return static_cast<const BoxedObject<T> &
>(*this).Unbox();
1044 return std::to_wstring(
value);
1082 template <
typename T,
typename TField>
1085 auto pfunc = &Reflection::GetFieldId<T, TField>;
1094 for (
size_t i = 0;
i <
sizeof(
buffer); ++
i) {
1110 template <
typename T,
typename TRet,
typename...
Args>
1126 template <
typename T,
typename TRet,
typename...
Args>
1141 template <
typename T,
typename TField>
1145 return obj.UnsafeCast<
T>().*
field;
1157 template <
typename T,
typename TProperty>
1164 return (obj.UnsafeCast<
T>().*
prop).Get();
1176 template <
typename T,
typename TProperty>
1193 template <
typename T,
typename TProperty>
1200 (obj.
UnsafeCast<
T>().*
prop).Set(std::forward<typename TProperty::TSetterParam>(value));
1212 template <
typename T,
typename TProperty>
1232 template <
typename T,
typename TFunc,
typename...
Args>
1234 ->
typename std::enable_if<std::is_base_of<DynamicObject, T>::value,
1235 decltype(
method(obj, std::forward<Args>(
args)...))>::type
1238 return method(obj, std::forward<Args>(
args)...);
1251 template <
typename T,
typename TFunc,
typename...
Args>
1253 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value,
1254 decltype(
method(std::declval<DynamicObject &>(), std::forward<Args>(
args)...))>::type
1269 template <
typename T,
typename TField>
1271 ->
typename std::enable_if<std::is_base_of<DynamicObject, T>::value,
TField &>::type
1285 template <
typename T,
typename TField>
1287 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value,
TField &>::type
1302 template <
typename T,
typename TValue>
1304 ->
typename std::enable_if<std::is_base_of<DynamicObject, T>::value, TValue>::type
1318 template <
typename T,
typename TValue>
1320 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value, TValue>::type
1336 template <
typename T,
typename TParam,
typename TValue>
1338 ->
typename std::enable_if<std::is_base_of<DynamicObject, T>::value>::type
1341 setter(obj, std::forward<TValue>(value));
1353 template <
typename T,
typename TParam,
typename TValue>
1355 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value>::type
1366struct std::hash<
sw::FieldId>
1368 size_t operator()(
sw::FieldId fieldId)
const noexcept
1370 return static_cast<size_t>(fieldId.
value);
BoxedObject(const BoxedObject &other) noexcept(std::is_nothrow_copy_constructible< T >::value)
拷贝构造函数
Definition Reflection.h:506
static auto MakeRef(BoxedObject< U > &other) noexcept -> typename std::enable_if< _IsStaticCastable< U, T >::value, BoxedObject< T > >::type
创建引用类型的装箱对象
Definition Reflection.h:494
BoxedObject(BoxedObject &&other) noexcept(std::is_nothrow_move_constructible< T >::value)
移动构造函数
Definition Reflection.h:520
T & Unbox() noexcept
获取装箱对象中的值
Definition Reflection.h:635
static BoxedObject< T > MakeRef(T *ptr) noexcept
创建引用类型的装箱对象
Definition Reflection.h:480
BoxedObject(Args &&...args)
构造值类型的装箱对象
Definition Reflection.h:461
bool HasValue() const noexcept
判断当前装箱对象是否包含有效值
Definition Reflection.h:625
bool IsRef() const noexcept
判断当前装箱对象是否为引用类型
Definition Reflection.h:607
BoxedObject & operator=(BoxedObject &&other)
移动赋值运算符
Definition Reflection.h:571
bool IsNullRef() const noexcept
判断当前装箱对象是否为空引用
Definition Reflection.h:616
virtual ~BoxedObject()
析构函数
Definition Reflection.h:470
const T & Unbox() const noexcept
获取装箱对象中的值
Definition Reflection.h:646
BoxedObject & operator=(const BoxedObject &other)
拷贝赋值运算符
Definition Reflection.h:536
装箱对象模板类声明
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:163
auto IsType(const T **pout=nullptr) const -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value, bool >::type
判断对象是否为指定类型
Definition Reflection.h:107
auto UnsafeCast() -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value &&!_IsStaticCastable< DynamicObject *, T * >::value, T & >::type
将对象不安全地转换为指定类型的引用
Definition Reflection.h:178
auto UnsafeCast() const -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value &&_IsStaticCastable< DynamicObject *, T * >::value, const T & >::type
将对象不安全地转换为指定类型的引用
Definition Reflection.h:192
auto UnsafeCast() const -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value &&!_IsStaticCastable< DynamicObject *, T * >::value, const T & >::type
将对象不安全地转换为指定类型的引用
Definition Reflection.h:207
virtual ~DynamicObject()
析构函数
Definition Reflection.h:52
auto DynamicCast() -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value, T & >::type
将对象动态转换为指定类型的引用
Definition Reflection.h:129
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:146
std::type_index GetType() const
获取对象的类型信息
Definition Reflection.h:69
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:85
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:1067
static auto GetMethod(TRet(T::*method)(Args...)) -> Delegate< TRet(DynamicObject &, Args...)>
获取成员函数的委托
Definition Reflection.h:1111
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:1286
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:1252
static auto GetFieldAccessor(TField T::*field) -> Delegate< TField &(DynamicObject &)>
获取字段的访问器
Definition Reflection.h:1142
static auto GetPropertySetter(TProperty T::*prop) -> typename std::enable_if< _IsWritableProperty< TProperty >::value, Delegate< void(DynamicObject &, typename TProperty::TSetterParam)> >::type
获取属性的Setter委托
Definition Reflection.h:1194
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:1177
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:1319
static FieldId GetFieldId(TField T::*field) noexcept
获取字段的唯一标识符
Definition Reflection.h:1083
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:1303
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:1270
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:1354
static auto GetMethod(TRet(T::*method)(Args...) const) -> Delegate< TRet(DynamicObject &, Args...)>
获取常量成员函数的委托
Definition Reflection.h:1127
static auto GetPropertyGetter(TProperty T::*prop) -> typename std::enable_if< _IsReadableProperty< TProperty >::value, Delegate< typename TProperty::TValue(DynamicObject &)> >::type
获取属性的Getter委托
Definition Reflection.h:1158
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:1337
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:1233
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:1213
Reflection()=delete
静态类,不允许实例化
SimpleWindow框架的顶级命名空间,所有公共类型、控件、枚举和工具函数均定义于此。
Definition Alignment.h:4
_IsExplicitlyConvertable< TFrom, TTo > _IsStaticCastable
用于判断是否可以通过static_cast进行转换
Definition Internal.h:34
表示字段的唯一标识符
Definition Reflection.h:1020
std::wstring ToString() const
获取字段ID的字符串表示形式
Definition Reflection.h:1042
int CompareTo(FieldId other) const
比较字段ID
Definition Reflection.h:1051
uint32_t value
字段ID的数值
Definition Reflection.h:1024
FieldId(uint32_t value)
构造指定值的字段ID
Definition Reflection.h:1034
判断类型是否可以使用dynamic_cast进行转换的辅助模板
Definition Internal.h:40
判断类型是否为属性的辅助模板
Definition Property.h:95
判断类型是否为可读属性的辅助模板
Definition Property.h:133
判断类型是否为可写属性的辅助模板
Definition Property.h:141