Initial work towards function variables. Existing dispatch works, but lookup of function variables is still untested

This commit is contained in:
Jason Turner
2009-06-11 00:32:50 +00:00
parent e951356691
commit 600899ad77
3 changed files with 28 additions and 4 deletions

View File

@@ -206,6 +206,16 @@ struct Cast_Helper<Result &>
} }
}; };
template<typename Result>
struct Cast_Helper<typename boost::shared_ptr<Result> >
{
typename boost::shared_ptr<Result> operator()(Boxed_Value ob)
{
return boost::any_cast<boost::shared_ptr<Result> >(ob.get());
}
};
template<> template<>
struct Cast_Helper<Boxed_Value> struct Cast_Helper<Boxed_Value>
{ {

View File

@@ -116,12 +116,26 @@ class BoxedCPP_System
return std::vector<Type_Name_Map::value_type>(m_types.begin(), m_types.end()); return std::vector<Type_Name_Map::value_type>(m_types.begin(), m_types.end());
} }
std::vector<Function_Map::value_type> get_function(const std::string &t_name) const std::vector<std::pair<std::string, Function_Map::mapped_type> >
get_function(const std::string &t_name) const
{ {
std::vector<std::pair<std::string, Function_Map::mapped_type> > funcs;
try {
funcs.insert(funcs.end(),
Function_Map::value_type(
t_name,
Cast_Helper<Function_Map::mapped_type>()(get_object(t_name)))
);
} catch (const std::bad_cast &) {
} catch (const std::range_error &) {
}
std::pair<Function_Map::const_iterator, Function_Map::const_iterator> range std::pair<Function_Map::const_iterator, Function_Map::const_iterator> range
= m_functions.equal_range(t_name); = m_functions.equal_range(t_name);
return std::vector<Function_Map::value_type>(range.first, range.second); funcs.insert(funcs.end(), range.first, range.second);
return funcs;
} }
std::vector<Function_Map::value_type> get_functions() const std::vector<Function_Map::value_type> get_functions() const

View File

@@ -178,10 +178,10 @@ class Proxy_Function_Impl : public Proxy_Function
Func m_f; Func m_f;
}; };
Boxed_Value dispatch(const std::vector<std::pair<const std::string, boost::shared_ptr<Proxy_Function> > > &funcs, Boxed_Value dispatch(const std::vector<std::pair<std::string, boost::shared_ptr<Proxy_Function> > > &funcs,
const std::vector<Boxed_Value> &plist) const std::vector<Boxed_Value> &plist)
{ {
for (std::vector<std::pair<const std::string, boost::shared_ptr<Proxy_Function> > >::const_iterator itr = funcs.begin(); for (std::vector<std::pair<std::string, boost::shared_ptr<Proxy_Function> > >::const_iterator itr = funcs.begin();
itr != funcs.end(); itr != funcs.end();
++itr) ++itr)
{ {