@@ -73,8 +73,8 @@ namespace Mirror {
73
73
};
74
74
75
75
MIRROR_API bool PointerConvertible (const TypeInfoCompact& inSrcType, const TypeInfoCompact& inDstType);
76
- MIRROR_API bool PolymorphismConvertible (const TypeInfoCompact& inSrcType, const TypeInfoCompact& inDstType);
77
- MIRROR_API bool Convertible (const TypeInfoCompact& inSrcType, const TypeInfoCompact& inDstType);
76
+ MIRROR_API bool PolymorphismConvertible (const TypeInfoCompact& inSrcType, const TypeInfoCompact& inDstType, bool allowDynamicDownCastNoCheck );
77
+ MIRROR_API bool Convertible (const TypeInfoCompact& inSrcType, const TypeInfoCompact& inDstType, bool allowDynamicDownCastNoCheck );
78
78
79
79
enum class AnyPolicy : uint8_t {
80
80
memoryHolder,
@@ -238,15 +238,13 @@ namespace Mirror {
238
238
const Any& MoveAssign (const Any& inOther) const noexcept ;
239
239
const Any& MoveAssign (Any&& inOther) const noexcept ;
240
240
241
- template <typename T> bool Convertible ();
242
- template <typename T> bool Convertible () const ;
241
+ template <typename T> bool Convertible (bool allowDynamicDownCastNoCheck = false );
242
+ template <typename T> bool Convertible (bool allowDynamicDownCastNoCheck = false ) const ;
243
243
244
- template <typename T> T As ();
245
- template <typename T> T As () const ;
246
- template <Common::CppNotRef T> T* TryAs ();
247
- template <Common::CppNotRef T> T* TryAs () const ;
248
- template <typename B, typename T> T PolyAs ();
249
- template <typename B, typename T> T PolyAs () const ;
244
+ template <typename T> T As (bool allowDynamicDownCastNoCheck = false );
245
+ template <typename T> T As (bool allowDynamicDownCastNoCheck = false ) const ;
246
+ template <Common::CppNotRef T> T* TryAs (bool allowDynamicDownCastNoCheck = false );
247
+ template <Common::CppNotRef T> T* TryAs (bool allowDynamicDownCastNoCheck = false ) const ;
250
248
251
249
template <ValidTemplateView V> bool CanAsTemplateView () const ;
252
250
TemplateViewRttiPtr GetTemplateViewRtti () const ;
@@ -365,7 +363,8 @@ namespace Mirror {
365
363
Argument& operator =(const Any& inAny);
366
364
Argument& operator =(Any&& inAny);
367
365
368
- template <typename T> T As () const ;
366
+ template <typename T> T As (bool allowDynamicDownCastNoCheck = false ) const ;
367
+ template <Common::CppNotRef T> T* TryAs (bool allowDynamicDownCastNoCheck = false ) const ;
369
368
370
369
template <ValidTemplateView V> bool CanAsTemplateView () const ;
371
370
TemplateViewRttiPtr GetTemplateViewRtti () const ;
@@ -822,12 +821,12 @@ namespace Mirror {
822
821
const MemberFunction& GetMemberFunction (const Id& inId) const ;
823
822
Any GetDefaultObject () const ;
824
823
bool IsTransient () const ;
825
-
826
824
Any ConstructDyn (const ArgumentList& arguments) const ;
827
825
Any NewDyn (const ArgumentList& arguments) const ;
828
826
Any InplaceNewDyn (void * ptr, const ArgumentList& arguments) const ;
829
827
void DestructDyn (const Argument& argument) const ;
830
828
void DeleteDyn (const Argument& argument) const ;
829
+ Any Cast (const Argument& objPtrOrRef) const ;
831
830
832
831
private:
833
832
static std::unordered_map<TypeId, Id> typeToIdMap;
@@ -837,14 +836,17 @@ namespace Mirror {
837
836
838
837
using BaseClassGetter = std::function<const Class*()>;
839
838
using InplaceGetter = std::function<Any(void *)>;
839
+ using DefaultObjectCreator = std::function<Any()>;
840
+ using Caster = std::function<Any(const Mirror::Argument&)>;
840
841
841
842
struct ConstructParams {
842
843
Id id;
843
844
const TypeInfo* typeInfo;
844
845
size_t memorySize;
845
846
BaseClassGetter baseClassGetter;
846
847
InplaceGetter inplaceGetter;
847
- std::function<Any()> defaultObjectCreator;
848
+ Caster caster;
849
+ DefaultObjectCreator defaultObjectCreator;
848
850
std::optional<Destructor::ConstructParams> destructorParams;
849
851
std::optional<Constructor::ConstructParams> defaultConstructorParams;
850
852
std::optional<Constructor::ConstructParams> moveConstructorParams;
@@ -853,7 +855,7 @@ namespace Mirror {
853
855
854
856
explicit Class (ConstructParams&& params);
855
857
856
- void CreateDefaultObject (const std::function<Any()> & inCreator);
858
+ void CreateDefaultObject (const DefaultObjectCreator & inCreator);
857
859
Destructor& EmplaceDestructor (Destructor::ConstructParams&& inParams);
858
860
Constructor& EmplaceConstructor (const Id& inId, Constructor::ConstructParams&& inParams);
859
861
Variable& EmplaceStaticVariable (const Id& inId, Variable::ConstructParams&& inParams);
@@ -865,6 +867,7 @@ namespace Mirror {
865
867
size_t memorySize;
866
868
BaseClassGetter baseClassGetter;
867
869
InplaceGetter inplaceGetter;
870
+ Caster caster;
868
871
Any defaultObject;
869
872
std::optional<Destructor> destructor;
870
873
std::unordered_map<Id, Constructor, IdHashProvider> constructors;
@@ -3025,71 +3028,61 @@ namespace Mirror {
3025
3028
}
3026
3029
3027
3030
template <typename T>
3028
- bool Any::Convertible ()
3031
+ bool Any::Convertible (bool allowDynamicDownCastNoCheck )
3029
3032
{
3030
3033
Assert (!IsArray ());
3031
3034
return Mirror::Convertible (
3032
3035
{ Type (), RemoveRefType (), RemovePointerType () },
3033
- { GetTypeInfo<T>(), GetTypeInfo<std::remove_reference_t <T>>(), GetTypeInfo<std::remove_pointer_t <T>>() });
3036
+ { GetTypeInfo<T>(), GetTypeInfo<std::remove_reference_t <T>>(), GetTypeInfo<std::remove_pointer_t <T>>() },
3037
+ allowDynamicDownCastNoCheck);
3034
3038
}
3035
3039
3036
3040
template <typename T>
3037
- bool Any::Convertible () const
3041
+ bool Any::Convertible (bool allowDynamicDownCastNoCheck ) const
3038
3042
{
3039
3043
Assert (!IsArray ());
3040
3044
return Mirror::Convertible (
3041
3045
{ Type (), RemoveRefType (), RemovePointerType () },
3042
- { GetTypeInfo<T>(), GetTypeInfo<std::remove_reference_t <T>>(), GetTypeInfo<std::remove_pointer_t <T>>() });
3046
+ { GetTypeInfo<T>(), GetTypeInfo<std::remove_reference_t <T>>(), GetTypeInfo<std::remove_pointer_t <T>>() },
3047
+ allowDynamicDownCastNoCheck);
3043
3048
}
3044
3049
3045
3050
template <typename T>
3046
- T Any::As ()
3051
+ T Any::As (bool allowDynamicDownCastNoCheck )
3047
3052
{
3048
- Assert (Convertible<T>());
3053
+ Assert (Convertible<T>(allowDynamicDownCastNoCheck ));
3049
3054
return static_cast <T>(*static_cast <std::remove_cvref_t <T>*>(Data ()));
3050
3055
}
3051
3056
3052
3057
template <typename T>
3053
- T Any::As () const
3058
+ T Any::As (bool allowDynamicDownCastNoCheck ) const
3054
3059
{
3055
- Assert (Convertible<T>());
3060
+ Assert (Convertible<T>(allowDynamicDownCastNoCheck ));
3056
3061
return static_cast <T>(*static_cast <std::remove_cvref_t <T>*>(Data ()));
3057
3062
}
3058
3063
3059
3064
template <Common::CppNotRef T>
3060
- T* Any::TryAs ()
3065
+ T* Any::TryAs (bool allowDynamicDownCastNoCheck )
3061
3066
{
3062
3067
Assert (!IsArray ());
3063
3068
const bool convertible = Mirror::Convertible (
3064
3069
{ AddPointerType (), AddPointerType (), RemoveRefType () },
3065
- { GetTypeInfo<T*>(), GetTypeInfo<T*>(), GetTypeInfo<T>() });
3070
+ { GetTypeInfo<T*>(), GetTypeInfo<T*>(), GetTypeInfo<T>() },
3071
+ allowDynamicDownCastNoCheck);
3066
3072
return convertible ? static_cast <std::remove_cvref_t <T>*>(Data ()) : nullptr ;
3067
3073
}
3068
3074
3069
3075
template <Common::CppNotRef T>
3070
- T* Any::TryAs () const
3076
+ T* Any::TryAs (bool allowDynamicDownCastNoCheck ) const
3071
3077
{
3072
3078
Assert (!IsArray ());
3073
3079
const bool convertible = Mirror::Convertible (
3074
3080
{ AddPointerType (), AddPointerType (), RemoveRefType () },
3075
- { GetTypeInfo<T*>(), GetTypeInfo<T*>(), GetTypeInfo<T>() });
3081
+ { GetTypeInfo<T*>(), GetTypeInfo<T*>(), GetTypeInfo<T>() },
3082
+ allowDynamicDownCastNoCheck);
3076
3083
return convertible ? static_cast <std::remove_cvref_t <T>*>(Data ()) : nullptr ;
3077
3084
}
3078
3085
3079
- template <typename B, typename T>
3080
- T Any::PolyAs ()
3081
- {
3082
- Assert (!IsArray ());
3083
- return dynamic_cast <T>(As<B>());
3084
- }
3085
-
3086
- template <typename B, typename T>
3087
- T Any::PolyAs () const
3088
- {
3089
- Assert (!IsArray ());
3090
- return dynamic_cast <T>(As<B>());
3091
- }
3092
-
3093
3086
template <ValidTemplateView V>
3094
3087
bool Any::CanAsTemplateView () const
3095
3088
{
@@ -3160,10 +3153,18 @@ namespace Mirror {
3160
3153
}
3161
3154
3162
3155
template <typename T>
3163
- T Argument::As () const // NOLINT
3156
+ T Argument::As (bool allowDynamicDownCastNoCheck ) const // NOLINT
3164
3157
{
3165
- return Delegate ([](auto && value) -> decltype (auto ) {
3166
- return value.template As <T>();
3158
+ return Delegate ([&](auto && value) -> decltype (auto ) {
3159
+ return value.template As <T>(allowDynamicDownCastNoCheck);
3160
+ });
3161
+ }
3162
+
3163
+ template <Common::CppNotRef T>
3164
+ T* Argument::TryAs (bool allowDynamicDownCastNoCheck) const
3165
+ {
3166
+ return Delegate ([&](auto && value) -> decltype (auto ) {
3167
+ return value.template TryAs <T>(allowDynamicDownCastNoCheck);
3167
3168
});
3168
3169
}
3169
3170
0 commit comments