diff --git a/include/chaiscript/dispatchkit/boxed_cast.hpp b/include/chaiscript/dispatchkit/boxed_cast.hpp index c27134f..5c51f24 100644 --- a/include/chaiscript/dispatchkit/boxed_cast.hpp +++ b/include/chaiscript/dispatchkit/boxed_cast.hpp @@ -62,7 +62,7 @@ namespace chaiscript /// assert(i == 5); /// \endcode template - typename detail::Cast_Helper::Result_Type boxed_cast(const Boxed_Value &bv, const Dynamic_Cast_Conversions &t_conversions = Dynamic_Cast_Conversions()) + typename detail::Cast_Helper::Result_Type boxed_cast(const Boxed_Value &bv, const Dynamic_Cast_Conversions *t_conversions = nullptr) { try { return detail::Cast_Helper::cast(bv, t_conversions); @@ -76,12 +76,12 @@ namespace chaiscript #pragma warning(disable : 4127) #endif - if (std::is_polymorphic::type>::value) + if (std::is_polymorphic::type>::value && t_conversions) { try { // We will not catch any bad_boxed_dynamic_cast that is thrown, let the user get it // either way, we are not responsible if it doesn't work - return detail::Cast_Helper::cast(t_conversions.boxed_dynamic_cast(bv), t_conversions); + return detail::Cast_Helper::cast(t_conversions->boxed_dynamic_cast(bv), t_conversions); } catch (const chaiscript::detail::exception::bad_any_cast &) { throw exception::bad_boxed_cast(bv.get_type_info(), typeid(Type)); } diff --git a/include/chaiscript/dispatchkit/boxed_cast_helper.hpp b/include/chaiscript/dispatchkit/boxed_cast_helper.hpp index 6991ad8..1852bbf 100644 --- a/include/chaiscript/dispatchkit/boxed_cast_helper.hpp +++ b/include/chaiscript/dispatchkit/boxed_cast_helper.hpp @@ -27,7 +27,7 @@ namespace chaiscript { typedef typename std::reference_wrapper::type > Result_Type; - static Result_Type cast(const Boxed_Value &ob, const Dynamic_Cast_Conversions &) + static Result_Type cast(const Boxed_Value &ob, const Dynamic_Cast_Conversions *) { if (ob.is_ref()) { @@ -69,7 +69,7 @@ namespace chaiscript { typedef const Result * Result_Type; - static Result_Type cast(const Boxed_Value &ob, const Dynamic_Cast_Conversions &) + static Result_Type cast(const Boxed_Value &ob, const Dynamic_Cast_Conversions *) { if (ob.is_ref()) { @@ -98,7 +98,7 @@ namespace chaiscript { typedef Result * Result_Type; - static Result_Type cast(const Boxed_Value &ob, const Dynamic_Cast_Conversions &) + static Result_Type cast(const Boxed_Value &ob, const Dynamic_Cast_Conversions *) { if (ob.is_ref()) { @@ -117,7 +117,7 @@ namespace chaiscript { typedef Result& Result_Type; - static Result_Type cast(const Boxed_Value &ob, const Dynamic_Cast_Conversions &) + static Result_Type cast(const Boxed_Value &ob, const Dynamic_Cast_Conversions *) { if (ob.is_ref()) { @@ -137,7 +137,7 @@ namespace chaiscript { typedef typename std::shared_ptr Result_Type; - static Result_Type cast(const Boxed_Value &ob, const Dynamic_Cast_Conversions &) + static Result_Type cast(const Boxed_Value &ob, const Dynamic_Cast_Conversions *) { return ob.get().cast >(); } @@ -151,7 +151,7 @@ namespace chaiscript { typedef typename std::shared_ptr Result_Type; - static Result_Type cast(const Boxed_Value &ob, const Dynamic_Cast_Conversions &) + static Result_Type cast(const Boxed_Value &ob, const Dynamic_Cast_Conversions *) { if (!ob.get_type_info().is_const()) { @@ -199,7 +199,7 @@ namespace chaiscript { typedef const Boxed_Value & Result_Type; - static Result_Type cast(const Boxed_Value &ob, const Dynamic_Cast_Conversions &) + static Result_Type cast(const Boxed_Value &ob, const Dynamic_Cast_Conversions *) { return ob; } @@ -260,7 +260,7 @@ namespace chaiscript { typedef typename Cast_Helper_Inner::Result_Type Result_Type; - static Result_Type cast(const Boxed_Value &ob, const Dynamic_Cast_Conversions &t_conversions) + static Result_Type cast(const Boxed_Value &ob, const Dynamic_Cast_Conversions *t_conversions) { return Cast_Helper_Inner::cast(ob, t_conversions); } diff --git a/include/chaiscript/dispatchkit/boxed_number.hpp b/include/chaiscript/dispatchkit/boxed_number.hpp index b1d5fc3..b2a11d0 100644 --- a/include/chaiscript/dispatchkit/boxed_number.hpp +++ b/include/chaiscript/dispatchkit/boxed_number.hpp @@ -823,7 +823,7 @@ namespace chaiscript { typedef Boxed_Number Result_Type; - static Result_Type cast(const Boxed_Value &ob, const Dynamic_Cast_Conversions &) + static Result_Type cast(const Boxed_Value &ob, const Dynamic_Cast_Conversions *) { return Boxed_Number(ob); } diff --git a/include/chaiscript/dispatchkit/dispatchkit.hpp b/include/chaiscript/dispatchkit/dispatchkit.hpp index 40e3bf6..b1345fa 100644 --- a/include/chaiscript/dispatchkit/dispatchkit.hpp +++ b/include/chaiscript/dispatchkit/dispatchkit.hpp @@ -401,7 +401,7 @@ namespace chaiscript template typename detail::Cast_Helper::Result_Type boxed_cast(const Boxed_Value &bv) const { - return chaiscript::boxed_cast(bv, m_conversions); + return chaiscript::boxed_cast(bv, &m_conversions); } /** diff --git a/include/chaiscript/dispatchkit/dynamic_cast_conversion.hpp b/include/chaiscript/dispatchkit/dynamic_cast_conversion.hpp index 60737f6..38894a0 100644 --- a/include/chaiscript/dispatchkit/dynamic_cast_conversion.hpp +++ b/include/chaiscript/dispatchkit/dynamic_cast_conversion.hpp @@ -88,7 +88,7 @@ namespace chaiscript if (t_derived.is_const()) { std::shared_ptr data - = std::dynamic_pointer_cast(detail::Cast_Helper >::cast(t_derived, Dynamic_Cast_Conversions())); + = std::dynamic_pointer_cast(detail::Cast_Helper >::cast(t_derived, nullptr)); if (!data) { throw std::bad_cast(); @@ -97,7 +97,7 @@ namespace chaiscript return Boxed_Value(data); } else { std::shared_ptr data - = std::dynamic_pointer_cast(detail::Cast_Helper >::cast(t_derived, Dynamic_Cast_Conversions())); + = std::dynamic_pointer_cast(detail::Cast_Helper >::cast(t_derived, nullptr)); if (!data) { @@ -110,11 +110,11 @@ namespace chaiscript // Pull the reference out of the contained boxed value, which we know is the type we want if (t_derived.is_const()) { - const Derived &d = detail::Cast_Helper::cast(t_derived, Dynamic_Cast_Conversions()); + const Derived &d = detail::Cast_Helper::cast(t_derived, 0); const Base &data = dynamic_cast(d); return Boxed_Value(std::cref(data)); } else { - Derived &d = detail::Cast_Helper::cast(t_derived, Dynamic_Cast_Conversions()); + Derived &d = detail::Cast_Helper::cast(t_derived, 0); Base &data = dynamic_cast(d); return Boxed_Value(std::ref(data)); } diff --git a/include/chaiscript/dispatchkit/function_call.hpp b/include/chaiscript/dispatchkit/function_call.hpp index 0f6b0b0..a104312 100644 --- a/include/chaiscript/dispatchkit/function_call.hpp +++ b/include/chaiscript/dispatchkit/function_call.hpp @@ -29,7 +29,7 @@ namespace chaiscript */ template std::function - functor(const std::vector &funcs, const Dynamic_Cast_Conversions &t_conversions) + functor(const std::vector &funcs, const Dynamic_Cast_Conversions *t_conversions) { FunctionType *p=0; return detail::build_function_caller_helper(p, funcs, t_conversions); @@ -50,7 +50,7 @@ namespace chaiscript */ template std::function - functor(Const_Proxy_Function func, const Dynamic_Cast_Conversions &t_conversions) + functor(Const_Proxy_Function func, const Dynamic_Cast_Conversions *t_conversions) { std::vector funcs; funcs.push_back(func); @@ -63,7 +63,7 @@ namespace chaiscript */ template std::function - functor(const Boxed_Value &bv, const Dynamic_Cast_Conversions &t_conversions) + functor(const Boxed_Value &bv, const Dynamic_Cast_Conversions *t_conversions) { return functor(boxed_cast(bv, t_conversions), t_conversions); } @@ -78,7 +78,7 @@ namespace chaiscript { typedef std::function Result_Type; - static Result_Type cast(const Boxed_Value &ob, const Dynamic_Cast_Conversions &t_conversions) + static Result_Type cast(const Boxed_Value &ob, const Dynamic_Cast_Conversions *t_conversions) { if (ob.get_type_info().bare_equal(user_type())) { @@ -97,7 +97,7 @@ namespace chaiscript { typedef std::function Result_Type; - static Result_Type cast(const Boxed_Value &ob, const Dynamic_Cast_Conversions &t_conversions) + static Result_Type cast(const Boxed_Value &ob, const Dynamic_Cast_Conversions *t_conversions) { if (ob.get_type_info().bare_equal(user_type())) { @@ -116,7 +116,7 @@ namespace chaiscript { typedef std::function Result_Type; - static Result_Type cast(const Boxed_Value &ob, const Dynamic_Cast_Conversions &t_conversions) + static Result_Type cast(const Boxed_Value &ob, const Dynamic_Cast_Conversions *t_conversions) { if (ob.get_type_info().bare_equal(user_type())) { diff --git a/include/chaiscript/dispatchkit/function_call_detail.hpp b/include/chaiscript/dispatchkit/function_call_detail.hpp index 3e650f0..0309d17 100644 --- a/include/chaiscript/dispatchkit/function_call_detail.hpp +++ b/include/chaiscript/dispatchkit/function_call_detail.hpp @@ -74,7 +74,7 @@ namespace chaiscript template - std::function build_function_caller_helper(Ret (Params...), const std::vector &funcs, const Dynamic_Cast_Conversions &t_conversions) + std::function build_function_caller_helper(Ret (Params...), const std::vector &funcs, const Dynamic_Cast_Conversions *t_conversions) { if (funcs.size() == 1) { @@ -90,7 +90,7 @@ namespace chaiscript // we cannot make any other guesses or assumptions really, so continuing } - return std::function(Build_Function_Caller_Helper(funcs, t_conversions)); + return std::function(Build_Function_Caller_Helper(funcs, t_conversions?*t_conversions:Dynamic_Cast_Conversions())); } } } diff --git a/include/chaiscript/dispatchkit/proxy_functions.hpp b/include/chaiscript/dispatchkit/proxy_functions.hpp index fcc8f3e..4455a6f 100644 --- a/include/chaiscript/dispatchkit/proxy_functions.hpp +++ b/include/chaiscript/dispatchkit/proxy_functions.hpp @@ -542,10 +542,10 @@ namespace chaiscript const Boxed_Value &bv = params[0]; if (bv.is_const()) { - const Class *o = boxed_cast(bv, t_conversions); + const Class *o = boxed_cast(bv, &t_conversions); return detail::Handle_Return::type>::handle(o->*m_attr); } else { - Class *o = boxed_cast(bv, t_conversions); + Class *o = boxed_cast(bv, &t_conversions); return detail::Handle_Return::type>::handle(o->*m_attr); } } else { diff --git a/include/chaiscript/dispatchkit/proxy_functions_detail.hpp b/include/chaiscript/dispatchkit/proxy_functions_detail.hpp index abae6cd..94d1704 100644 --- a/include/chaiscript/dispatchkit/proxy_functions_detail.hpp +++ b/include/chaiscript/dispatchkit/proxy_functions_detail.hpp @@ -65,7 +65,7 @@ namespace chaiscript { static void do_try(const std::vector ¶ms, int generation, const Dynamic_Cast_Conversions &t_conversions) { - boxed_cast(params[generation], t_conversions); + boxed_cast(params[generation], &t_conversions); Try_Cast::do_try(params, generation+1, t_conversions); } }; @@ -118,7 +118,7 @@ namespace chaiscript static Ret do_call(const std::function &f, const std::vector &, const Dynamic_Cast_Conversions &t_conversions, InnerParams &&... innerparams) { - return f(boxed_cast(std::forward(innerparams), t_conversions)...); + return f(boxed_cast(std::forward(innerparams), &t_conversions)...); } };