@@ -73,8 +73,8 @@ namespace Mirror {
7373 };
7474
7575 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 );
7878
7979 enum class AnyPolicy : uint8_t {
8080 memoryHolder,
@@ -238,15 +238,13 @@ namespace Mirror {
238238 const Any& MoveAssign (const Any& inOther) const noexcept ;
239239 const Any& MoveAssign (Any&& inOther) const noexcept ;
240240
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 ;
243243
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 ;
250248
251249 template <ValidTemplateView V> bool CanAsTemplateView () const ;
252250 TemplateViewRttiPtr GetTemplateViewRtti () const ;
@@ -365,7 +363,8 @@ namespace Mirror {
365363 Argument& operator =(const Any& inAny);
366364 Argument& operator =(Any&& inAny);
367365
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 ;
369368
370369 template <ValidTemplateView V> bool CanAsTemplateView () const ;
371370 TemplateViewRttiPtr GetTemplateViewRtti () const ;
@@ -822,12 +821,12 @@ namespace Mirror {
822821 const MemberFunction& GetMemberFunction (const Id& inId) const ;
823822 Any GetDefaultObject () const ;
824823 bool IsTransient () const ;
825-
826824 Any ConstructDyn (const ArgumentList& arguments) const ;
827825 Any NewDyn (const ArgumentList& arguments) const ;
828826 Any InplaceNewDyn (void * ptr, const ArgumentList& arguments) const ;
829827 void DestructDyn (const Argument& argument) const ;
830828 void DeleteDyn (const Argument& argument) const ;
829+ Any Cast (const Argument& objPtrOrRef) const ;
831830
832831 private:
833832 static std::unordered_map<TypeId, Id> typeToIdMap;
@@ -837,14 +836,17 @@ namespace Mirror {
837836
838837 using BaseClassGetter = std::function<const Class*()>;
839838 using InplaceGetter = std::function<Any(void *)>;
839+ using DefaultObjectCreator = std::function<Any()>;
840+ using Caster = std::function<Any(const Mirror::Argument&)>;
840841
841842 struct ConstructParams {
842843 Id id;
843844 const TypeInfo* typeInfo;
844845 size_t memorySize;
845846 BaseClassGetter baseClassGetter;
846847 InplaceGetter inplaceGetter;
847- std::function<Any()> defaultObjectCreator;
848+ Caster caster;
849+ DefaultObjectCreator defaultObjectCreator;
848850 std::optional<Destructor::ConstructParams> destructorParams;
849851 std::optional<Constructor::ConstructParams> defaultConstructorParams;
850852 std::optional<Constructor::ConstructParams> moveConstructorParams;
@@ -853,7 +855,7 @@ namespace Mirror {
853855
854856 explicit Class (ConstructParams&& params);
855857
856- void CreateDefaultObject (const std::function<Any()> & inCreator);
858+ void CreateDefaultObject (const DefaultObjectCreator & inCreator);
857859 Destructor& EmplaceDestructor (Destructor::ConstructParams&& inParams);
858860 Constructor& EmplaceConstructor (const Id& inId, Constructor::ConstructParams&& inParams);
859861 Variable& EmplaceStaticVariable (const Id& inId, Variable::ConstructParams&& inParams);
@@ -865,6 +867,7 @@ namespace Mirror {
865867 size_t memorySize;
866868 BaseClassGetter baseClassGetter;
867869 InplaceGetter inplaceGetter;
870+ Caster caster;
868871 Any defaultObject;
869872 std::optional<Destructor> destructor;
870873 std::unordered_map<Id, Constructor, IdHashProvider> constructors;
@@ -3025,71 +3028,61 @@ namespace Mirror {
30253028 }
30263029
30273030 template <typename T>
3028- bool Any::Convertible ()
3031+ bool Any::Convertible (bool allowDynamicDownCastNoCheck )
30293032 {
30303033 Assert (!IsArray ());
30313034 return Mirror::Convertible (
30323035 { 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);
30343038 }
30353039
30363040 template <typename T>
3037- bool Any::Convertible () const
3041+ bool Any::Convertible (bool allowDynamicDownCastNoCheck ) const
30383042 {
30393043 Assert (!IsArray ());
30403044 return Mirror::Convertible (
30413045 { 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);
30433048 }
30443049
30453050 template <typename T>
3046- T Any::As ()
3051+ T Any::As (bool allowDynamicDownCastNoCheck )
30473052 {
3048- Assert (Convertible<T>());
3053+ Assert (Convertible<T>(allowDynamicDownCastNoCheck ));
30493054 return static_cast <T>(*static_cast <std::remove_cvref_t <T>*>(Data ()));
30503055 }
30513056
30523057 template <typename T>
3053- T Any::As () const
3058+ T Any::As (bool allowDynamicDownCastNoCheck ) const
30543059 {
3055- Assert (Convertible<T>());
3060+ Assert (Convertible<T>(allowDynamicDownCastNoCheck ));
30563061 return static_cast <T>(*static_cast <std::remove_cvref_t <T>*>(Data ()));
30573062 }
30583063
30593064 template <Common::CppNotRef T>
3060- T* Any::TryAs ()
3065+ T* Any::TryAs (bool allowDynamicDownCastNoCheck )
30613066 {
30623067 Assert (!IsArray ());
30633068 const bool convertible = Mirror::Convertible (
30643069 { AddPointerType (), AddPointerType (), RemoveRefType () },
3065- { GetTypeInfo<T*>(), GetTypeInfo<T*>(), GetTypeInfo<T>() });
3070+ { GetTypeInfo<T*>(), GetTypeInfo<T*>(), GetTypeInfo<T>() },
3071+ allowDynamicDownCastNoCheck);
30663072 return convertible ? static_cast <std::remove_cvref_t <T>*>(Data ()) : nullptr ;
30673073 }
30683074
30693075 template <Common::CppNotRef T>
3070- T* Any::TryAs () const
3076+ T* Any::TryAs (bool allowDynamicDownCastNoCheck ) const
30713077 {
30723078 Assert (!IsArray ());
30733079 const bool convertible = Mirror::Convertible (
30743080 { AddPointerType (), AddPointerType (), RemoveRefType () },
3075- { GetTypeInfo<T*>(), GetTypeInfo<T*>(), GetTypeInfo<T>() });
3081+ { GetTypeInfo<T*>(), GetTypeInfo<T*>(), GetTypeInfo<T>() },
3082+ allowDynamicDownCastNoCheck);
30763083 return convertible ? static_cast <std::remove_cvref_t <T>*>(Data ()) : nullptr ;
30773084 }
30783085
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-
30933086 template <ValidTemplateView V>
30943087 bool Any::CanAsTemplateView () const
30953088 {
@@ -3160,10 +3153,18 @@ namespace Mirror {
31603153 }
31613154
31623155 template <typename T>
3163- T Argument::As () const // NOLINT
3156+ T Argument::As (bool allowDynamicDownCastNoCheck ) const // NOLINT
31643157 {
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);
31673168 });
31683169 }
31693170
0 commit comments