diff --git a/include/chaiscript/dispatchkit/bootstrap.hpp b/include/chaiscript/dispatchkit/bootstrap.hpp index 17352bc..74614f8 100644 --- a/include/chaiscript/dispatchkit/bootstrap.hpp +++ b/include/chaiscript/dispatchkit/bootstrap.hpp @@ -548,9 +548,11 @@ namespace chaiscript m.add(chaiscript::fun(&get_parse_tree), "get_parse_tree"); m.add(chaiscript::base_class()); + m.add(chaiscript::base_class()); m.add(chaiscript::user_type(), "arithmetic_error"); m.add(chaiscript::base_class()); + m.add(chaiscript::base_class()); // chaiscript::bootstrap::standard_library::vector_type > >("AST_NodeVector", m); diff --git a/include/chaiscript/dispatchkit/boxed_cast.hpp b/include/chaiscript/dispatchkit/boxed_cast.hpp index 395cf83..7fbe78d 100644 --- a/include/chaiscript/dispatchkit/boxed_cast.hpp +++ b/include/chaiscript/dispatchkit/boxed_cast.hpp @@ -69,11 +69,11 @@ namespace chaiscript /// assert(i == 5); /// \endcode template - auto boxed_cast(const Boxed_Value &bv, const Type_Conversions_State *t_conversions = nullptr) -> decltype(detail::Cast_Helper::cast(bv, nullptr)) + decltype(auto) boxed_cast(const Boxed_Value &bv, const Type_Conversions_State *t_conversions = nullptr) { if (!t_conversions || bv.get_type_info().bare_equal(user_type()) || (t_conversions && !(*t_conversions)->convertable_type())) { try { - return detail::Cast_Helper::cast(bv, t_conversions); + return(detail::Cast_Helper::cast(bv, t_conversions)); } catch (const chaiscript::detail::exception::bad_any_cast &) { } } @@ -84,11 +84,11 @@ namespace chaiscript 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_type_conversion(t_conversions->saves(), bv), t_conversions); + return(detail::Cast_Helper::cast((*t_conversions)->boxed_type_conversion(t_conversions->saves(), bv), t_conversions)); } catch (...) { try { // try going the other way - return detail::Cast_Helper::cast((*t_conversions)->boxed_type_down_conversion(t_conversions->saves(), bv), t_conversions); + return(detail::Cast_Helper::cast((*t_conversions)->boxed_type_down_conversion(t_conversions->saves(), 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 5178a73..9476e0a 100644 --- a/include/chaiscript/dispatchkit/boxed_cast_helper.hpp +++ b/include/chaiscript/dispatchkit/boxed_cast_helper.hpp @@ -30,18 +30,18 @@ namespace chaiscript } static const void *verify_type(const Boxed_Value &ob, const std::type_info &ti, const void *ptr) { - if (!ob.get_type_info().bare_equal_type_info(ti)) { - throw chaiscript::detail::exception::bad_any_cast(); - } else { + if (ob.get_type_info().bare_equal_type_info(ti)) { return throw_if_null(ptr); + } else { + throw chaiscript::detail::exception::bad_any_cast(); } } static void *verify_type(const Boxed_Value &ob, const std::type_info &ti, void *ptr) { - if (ptr == nullptr || !ob.get_type_info().bare_equal_type_info(ti)) { - throw chaiscript::detail::exception::bad_any_cast(); + if (!ob.is_const() && ob.get_type_info().bare_equal_type_info(ti)) { + return throw_if_null(ptr); } else { - return ptr; + throw chaiscript::detail::exception::bad_any_cast(); } } @@ -242,9 +242,9 @@ namespace chaiscript template struct Cast_Helper { - static auto cast(const Boxed_Value &ob, const Type_Conversions_State *t_conversions) -> decltype(Cast_Helper_Inner::cast(ob, t_conversions)) + static decltype(auto) cast(const Boxed_Value &ob, const Type_Conversions_State *t_conversions) { - return Cast_Helper_Inner::cast(ob, t_conversions); + return(Cast_Helper_Inner::cast(ob, t_conversions)); } }; } diff --git a/include/chaiscript/dispatchkit/dispatchkit.hpp b/include/chaiscript/dispatchkit/dispatchkit.hpp index 1c5809c..b5ed3f7 100644 --- a/include/chaiscript/dispatchkit/dispatchkit.hpp +++ b/include/chaiscript/dispatchkit/dispatchkit.hpp @@ -424,10 +424,10 @@ namespace chaiscript /// \brief casts an object while applying any Dynamic_Conversion available template - auto boxed_cast(const Boxed_Value &bv) const -> decltype(chaiscript::boxed_cast(bv, nullptr)) + decltype(auto) boxed_cast(const Boxed_Value &bv) const { Type_Conversions_State state(m_conversions, m_conversions.conversion_saves()); - return chaiscript::boxed_cast(bv, &state); + return(chaiscript::boxed_cast(bv, &state)); } /// Add a new conversion for upcasting to a base class diff --git a/include/chaiscript/language/chaiscript_engine.hpp b/include/chaiscript/language/chaiscript_engine.hpp index 761bd61..fca14de 100644 --- a/include/chaiscript/language/chaiscript_engine.hpp +++ b/include/chaiscript/language/chaiscript_engine.hpp @@ -690,9 +690,9 @@ namespace chaiscript /// \brief casts an object while applying any Dynamic_Conversion available template - auto boxed_cast(const Boxed_Value &bv) const -> decltype(m_engine.boxed_cast(bv)) + decltype(auto) boxed_cast(const Boxed_Value &bv) const { - return m_engine.boxed_cast(bv); + return(m_engine.boxed_cast(bv)); } diff --git a/include/chaiscript/utility/utility.hpp b/include/chaiscript/utility/utility.hpp index 1ca0dfb..87dd876 100644 --- a/include/chaiscript/utility/utility.hpp +++ b/include/chaiscript/utility/utility.hpp @@ -15,7 +15,7 @@ #include "../chaiscript.hpp" #include "../dispatchkit/proxy_functions.hpp" #include "../dispatchkit/type_info.hpp" -#include "../dispatchkit/operators.hpp" +//#include "../dispatchkit/operators.hpp" namespace chaiscript