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);
176 template <
typename T>
178 ->
typename std::enable_if<
190 template <
typename T>
195 return static_cast<const T &
>(*this);
204 template <
typename T>
219 template <
typename T>
229 template <
typename T>
239 template <
typename T>
377 : _isRef(isRef.val), _data()
379 _isBoxedObject =
true;
385 void Release() noexcept(std::is_nothrow_destructible<T>::value)
397 template <
typename... Args>
401 new (_data.objbuf) T(std::forward<Args>(
args)...);
420 result._data.refptr =
ptr;
430 template <
typename U>
432 ->
typename std::enable_if<_IsStaticCastable<U, T>::value,
BoxedObject<T>>::type
435 result._data.refptr =
other.IsNullRef() ?
nullptr :
static_cast<T *
>(&
other.Unbox());
447 _data.refptr =
other._data.refptr;
449 new (_data.objbuf) T(
other.Unbox());
461 _data.refptr =
other._data.refptr;
462 other._data.refptr =
nullptr;
464 new (_data.objbuf) T(std::move(
other.Unbox()));
480 _data.refptr =
other._data.refptr;
482 auto oldPtr = _data.refptr;
484 new (_data.objbuf) T(
other.Unbox());
494 _data.refptr =
other._data.refptr;
497 Unbox() =
other.Unbox();
515 _data.refptr =
other._data.refptr;
516 other._data.refptr =
nullptr;
518 auto oldPtr = _data.refptr;
520 new (_data.objbuf) T(std::move(
other.Unbox()));
530 _data.refptr =
other._data.refptr;
532 other._data.refptr =
nullptr;
534 Unbox() = std::move(
other.Unbox());
555 return _isRef && (_data.refptr ==
nullptr);
575 return _isRef ? *_data.refptr : *
reinterpret_cast<T *
>(_data.objbuf);
586 return _isRef ? *_data.refptr : *
reinterpret_cast<const T *
>(_data.objbuf);
598 template <
typename T>
600 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && _IsDynamicCastable<DynamicObject *, T *>::value,
bool>::type
602#if defined(SW_DISABLE_REFLECTION)
603 throw std::runtime_error(
"Reflection is disabled, cannot check type.");
605 if (!_isBoxedObject) {
606 if (pout ==
nullptr) {
607 return dynamic_cast<T *
>(
this) !=
nullptr;
609 *pout =
dynamic_cast<T *
>(
this);
610 return *pout !=
nullptr;
613 BoxedObject<T> *obj =
nullptr;
615 if (!
IsType(&obj) || obj->IsNullRef()) {
616 if (pout !=
nullptr) {
621 if (pout !=
nullptr) {
622 *pout = &obj->Unbox();
636 template <
typename T>
638 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && !_IsDynamicCastable<DynamicObject *, T *>::value,
bool>::type
640#if defined(SW_DISABLE_REFLECTION)
641 throw std::runtime_error(
"Reflection is disabled, cannot check type.");
643 if (!_isBoxedObject) {
644 if (pout !=
nullptr) {
649 BoxedObject<T> *obj =
nullptr;
651 if (!
IsType(&obj) || obj->IsNullRef()) {
652 if (pout !=
nullptr) {
657 if (pout !=
nullptr) {
658 *pout = &obj->Unbox();
672 template <
typename T>
674 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && _IsDynamicCastable<DynamicObject *, T *>::value,
bool>::type
676#if defined(SW_DISABLE_REFLECTION)
677 throw std::runtime_error(
"Reflection is disabled, cannot check type.");
679 if (!_isBoxedObject) {
680 if (pout ==
nullptr) {
681 return dynamic_cast<const T *
>(
this) !=
nullptr;
683 *pout =
dynamic_cast<const T *
>(
this);
684 return *pout !=
nullptr;
687 const BoxedObject<T> *obj =
nullptr;
689 if (!
IsType(&obj) || obj->IsNullRef()) {
690 if (pout !=
nullptr) {
695 if (pout !=
nullptr) {
696 *pout = &obj->Unbox();
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) {
723 const BoxedObject<T> *obj =
nullptr;
725 if (!
IsType(&obj) || obj->IsNullRef()) {
726 if (pout !=
nullptr) {
731 if (pout !=
nullptr) {
732 *pout = &obj->Unbox();
746 template <
typename T>
748 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && _IsDynamicCastable<DynamicObject *, T *>::value, T &>::type
750#if defined(SW_DISABLE_REFLECTION)
751 throw std::runtime_error(
"Reflection is disabled, cannot perform dynamic cast.");
753 if (!_isBoxedObject) {
754 return dynamic_cast<T &
>(*this);
756 return dynamic_cast<BoxedObject<T> &
>(*this).Unbox();
767 template <
typename T>
769 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && !_IsDynamicCastable<DynamicObject *, T *>::value, T &>::type
771#if defined(SW_DISABLE_REFLECTION)
772 throw std::runtime_error(
"Reflection is disabled, cannot perform dynamic cast.");
774 if (!_isBoxedObject) {
775 throw std::bad_cast();
777 return dynamic_cast<BoxedObject<T> &
>(*this).Unbox();
788 template <
typename T>
790 -> typename std::enable_if<!std::is_base_of<
DynamicObject, T>::value && _IsDynamicCastable<
DynamicObject *, T *>::value, const T &>::type
792#if defined(SW_DISABLE_REFLECTION)
793 throw std::runtime_error(
"Reflection is disabled, cannot perform dynamic cast.");
795 if (!_isBoxedObject) {
796 return dynamic_cast<const T &
>(*this);
798 return dynamic_cast<const BoxedObject<T> &
>(*this).Unbox();
809 template <
typename T>
811 -> typename std::enable_if<!std::is_base_of<
DynamicObject, T>::value && !_IsDynamicCastable<
DynamicObject *, T *>::value, const T &>::type
813#if defined(SW_DISABLE_REFLECTION)
814 throw std::runtime_error(
"Reflection is disabled, cannot perform dynamic cast.");
816 if (!_isBoxedObject) {
817 throw std::bad_cast();
819 return dynamic_cast<const BoxedObject<T> &
>(*this).Unbox();
830 template <
typename T>
832 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && _IsStaticCastable<DynamicObject *, T *>::value, T &>::type
834 if (!_isBoxedObject) {
835 return static_cast<T &
>(*this);
837 return static_cast<BoxedObject<T> &
>(*this).Unbox();
847 template <
typename T>
849 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value && !_IsStaticCastable<DynamicObject *, T *>::value, T &>::type
851 if (!_isBoxedObject) {
852 return DynamicCast<T>();
854 return static_cast<BoxedObject<T> &
>(*this).Unbox();
864 template <
typename T>
866 -> typename std::enable_if<!std::is_base_of<
DynamicObject, T>::value && _IsStaticCastable<
DynamicObject *, T *>::value, const T &>::type
868 if (!_isBoxedObject) {
869 return static_cast<const T &
>(*this);
871 return static_cast<const BoxedObject<T> &
>(*this).Unbox();
881 template <
typename T>
883 -> typename std::enable_if<!std::is_base_of<
DynamicObject, T>::value && !_IsStaticCastable<
DynamicObject *, T *>::value, const T &>::type
885 if (!_isBoxedObject) {
886 return DynamicCast<T>();
888 return static_cast<const BoxedObject<T> &
>(*this).Unbox();
922 return std::to_wstring(value);
931 if (value ==
other.value) {
934 return value <
other.value ? -1 : 1;
960 template <
typename T,
typename TField>
963 auto pfunc = &Reflection::GetFieldId<T, TField>;
972 for (
size_t i = 0;
i <
sizeof(
buffer); ++
i) {
988 template <
typename T,
typename TRet,
typename...
Args>
1004 template <
typename T,
typename TRet,
typename...
Args>
1019 template <
typename T,
typename TField>
1023 return obj.UnsafeCast<T>().*
field;
1035 template <
typename T,
typename TProperty>
1042 return (obj.UnsafeCast<T>().*
prop).Get();
1054 template <
typename T,
typename TProperty>
1071 template <
typename T,
typename TProperty>
1078 (obj.
UnsafeCast<T>().*
prop).Set(std::forward<typename TProperty::TSetterParam>(value));
1090 template <
typename T,
typename TProperty>
1110 template <
typename T,
typename TFunc,
typename...
Args>
1112 ->
typename std::enable_if<std::is_base_of<DynamicObject, T>::value,
1113 decltype(
method(obj, std::forward<Args>(
args)...))>::type
1116 return method(obj, std::forward<Args>(
args)...);
1129 template <
typename T,
typename TFunc,
typename...
Args>
1131 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value,
1132 decltype(
method(std::declval<DynamicObject &>(), std::forward<Args>(
args)...))>::type
1147 template <
typename T,
typename TField>
1149 ->
typename std::enable_if<std::is_base_of<DynamicObject, T>::value,
TField &>::type
1163 template <
typename T,
typename TField>
1165 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value,
TField &>::type
1180 template <
typename T,
typename TValue>
1182 ->
typename std::enable_if<std::is_base_of<DynamicObject, T>::value, TValue>::type
1196 template <
typename T,
typename TValue>
1198 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value, TValue>::type
1214 template <
typename T,
typename TParam,
typename TValue>
1216 ->
typename std::enable_if<std::is_base_of<DynamicObject, T>::value>::type
1219 setter(obj, std::forward<TValue>(value));
1231 template <
typename T,
typename TParam,
typename TValue>
1233 ->
typename std::enable_if<!std::is_base_of<DynamicObject, T>::value>::type
1244struct std::hash<sw::FieldId>
1246 size_t operator()(
sw::FieldId fieldId)
const noexcept
1248 return static_cast<size_t>(fieldId.
value);
BoxedObject(const BoxedObject &other) noexcept(std::is_nothrow_copy_constructible< T >::value)
拷贝构造函数
Definition Reflection.h:443
static auto MakeRef(BoxedObject< U > &other) noexcept -> typename std::enable_if< _IsStaticCastable< U, T >::value, BoxedObject< T > >::type
创建引用类型的装箱对象
Definition Reflection.h:431
BoxedObject(BoxedObject &&other) noexcept(std::is_nothrow_move_constructible< T >::value)
移动构造函数
Definition Reflection.h:457
T & Unbox() noexcept
获取装箱对象中的值
Definition Reflection.h:572
static BoxedObject< T > MakeRef(T *ptr) noexcept
创建引用类型的装箱对象
Definition Reflection.h:417
BoxedObject(Args &&...args)
构造值类型的装箱对象
Definition Reflection.h:398
bool HasValue() const noexcept
判断当前装箱对象是否包含有效值
Definition Reflection.h:562
bool IsRef() const noexcept
判断当前装箱对象是否为引用类型
Definition Reflection.h:544
BoxedObject & operator=(BoxedObject &&other)
移动赋值运算符
Definition Reflection.h:508
bool IsNullRef() const noexcept
判断当前装箱对象是否为空引用
Definition Reflection.h:553
virtual ~BoxedObject()
析构函数
Definition Reflection.h:407
const T & Unbox() const noexcept
获取装箱对象中的值
Definition Reflection.h:583
BoxedObject & operator=(const BoxedObject &other)
拷贝赋值运算符
Definition Reflection.h:473
T * refptr
引用指针
Definition Reflection.h:356
装箱对象模板类声明
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:177
auto UnsafeCast() const -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value &&_IsStaticCastable< DynamicObject *, T * >::value, const T & >::type
将对象不安全地转换为指定类型的引用
Definition Reflection.h:191
auto UnsafeCast() const -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value &&!_IsStaticCastable< DynamicObject *, T * >::value, const T & >::type
将对象不安全地转换为指定类型的引用
Definition Reflection.h:205
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
判断对象是否为指定类型
friend class BoxedObject
允许BoxedObject访问_isBoxedObject成员
Definition Reflection.h:33
auto DynamicCast() const -> typename std::enable_if< std::is_base_of< DynamicObject, T >::value, const T & >::type
将对象动态转换为指定类型的常量引用
Definition Reflection.h:146
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
判断对象是否为指定类型
std::type_index GetTypeIndex() const
获取对象的类型索引
Definition Reflection.h:69
全序比较接口
Definition IComparable.h:54
为支持ToString方法的类提供统一接口
Definition IToString.h:13
值转换器接口
Definition IValueConverter.h:14
提供反射相关功能
Definition Reflection.h:945
static auto GetMethod(TRet(T::*method)(Args...)) -> Delegate< TRet(DynamicObject &, Args...)>
获取成员函数的委托
Definition Reflection.h:989
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:1164
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:1130
static auto GetFieldAccessor(TField T::*field) -> Delegate< TField &(DynamicObject &)>
获取字段的访问器
Definition Reflection.h:1020
static auto GetPropertySetter(TProperty T::*prop) -> typename std::enable_if< _IsWritableProperty< TProperty >::value, Delegate< void(DynamicObject &, typename TProperty::TSetterParam)> >::type
获取属性的Setter委托
Definition Reflection.h:1072
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:1055
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:1197
static FieldId GetFieldId(TField T::*field) noexcept
获取字段的唯一标识符
Definition Reflection.h:961
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:1181
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:1148
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:1232
static auto GetMethod(TRet(T::*method)(Args...) const) -> Delegate< TRet(DynamicObject &, Args...)>
获取常量成员函数的委托
Definition Reflection.h:1005
static auto GetPropertyGetter(TProperty T::*prop) -> typename std::enable_if< _IsReadableProperty< TProperty >::value, Delegate< typename TProperty::TValue(DynamicObject &)> >::type
获取属性的Getter委托
Definition Reflection.h:1036
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:1215
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:1111
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:1091
Reflection()=delete
静态类,不允许实例化
表示字段的唯一标识符
Definition Reflection.h:898
std::wstring ToString() const
获取字段ID的字符串表示形式
Definition Reflection.h:920
int CompareTo(FieldId other) const
比较字段ID
Definition Reflection.h:929
uint32_t value
字段ID的数值
Definition Reflection.h:902
FieldId(uint32_t value)
构造指定值的字段ID
Definition Reflection.h:912
判断类型是否可以使用dynamic_cast进行转换的辅助模板
Definition Internal.h:40
判断类型是否为属性的辅助模板
Definition Property.h:95
判断类型是否为可读属性的辅助模板
Definition Property.h:133
判断类型是否为可写属性的辅助模板
Definition Property.h:141