diff --git a/include/chaiscript/dispatchkit/dispatchkit.hpp b/include/chaiscript/dispatchkit/dispatchkit.hpp index c921649..3ad1410 100644 --- a/include/chaiscript/dispatchkit/dispatchkit.hpp +++ b/include/chaiscript/dispatchkit/dispatchkit.hpp @@ -220,7 +220,7 @@ namespace chaiscript { std::multimap m_functions; std::map m_global_objects; - std::map, Type_Conversion> m_type_conversions; + Type_Converter m_type_converter; Type_Name_Map m_types; std::set m_reserved_words; }; @@ -259,7 +259,7 @@ namespace chaiscript boost::unique_lock l(m_mutex); #endif - m_state.m_type_conversions.insert(std::make_pair(std::make_pair(tc.from(), tc.to()), tc)); + m_state.m_type_converter.add(tc); } /** diff --git a/include/chaiscript/dispatchkit/type_conversion.hpp b/include/chaiscript/dispatchkit/type_conversion.hpp index 35fea9c..68175ff 100644 --- a/include/chaiscript/dispatchkit/type_conversion.hpp +++ b/include/chaiscript/dispatchkit/type_conversion.hpp @@ -171,6 +171,46 @@ namespace chaiscript return Type_Conversion(boost::shared_ptr(new detail::Dynamic_Cast_Conversion())); } + + class Type_Converter + { + public: + bool add(const Type_Conversion &t_tc) + { + return m_conversions.insert(std::make_pair(std::make_pair(t_tc.from(), t_tc.to()), t_tc)).second; + } + + bool empty() + { + return m_conversions.empty(); + } + + Boxed_Value convert(const Boxed_Value &t_bv, const Type_Info &t_to) const + { + if (t_bv.get_type_info().bare_equal(t_to)) + { + return t_bv; + } else { + std::map, Type_Conversion>::const_iterator itr = m_conversions.begin(), + end = m_conversions.end(); + + while (itr != end) + { + if (itr->first.first.bare_equal(t_bv.get_type_info()) + && itr->first.second.bare_equal(t_to)) + { + return itr->second.convert(t_bv); + } + ++itr; + } + + throw bad_boxed_cast("Unable to convert boxed_value"); + } + } + + private: + std::map, Type_Conversion> m_conversions; + }; }