Add automatic unwrapping of Proxy_Function_Impl contained boost::function during functor() construction if possible.
Task #110
This commit is contained in:
parent
5f661fad20
commit
a758c86ba5
@ -87,6 +87,19 @@ namespace chaiscript
|
|||||||
boost::function<Ret (BOOST_PP_ENUM_PARAMS(n, Param)) >
|
boost::function<Ret (BOOST_PP_ENUM_PARAMS(n, Param)) >
|
||||||
build_function_caller_helper(Ret (BOOST_PP_ENUM_PARAMS(n, Param)), const std::vector<std::pair<std::string, Const_Proxy_Function> > &funcs)
|
build_function_caller_helper(Ret (BOOST_PP_ENUM_PARAMS(n, Param)), const std::vector<std::pair<std::string, Const_Proxy_Function> > &funcs)
|
||||||
{
|
{
|
||||||
|
if (funcs.size() == 1)
|
||||||
|
{
|
||||||
|
boost::shared_ptr<const Proxy_Function_Impl<Ret (BOOST_PP_ENUM_PARAMS(n, Param))> > pfi =
|
||||||
|
boost::dynamic_pointer_cast<const Proxy_Function_Impl<Ret (BOOST_PP_ENUM_PARAMS(n, Param))> >
|
||||||
|
(funcs[0].second);
|
||||||
|
if (pfi)
|
||||||
|
{
|
||||||
|
return pfi->internal_function();
|
||||||
|
}
|
||||||
|
// looks like this either wasn't a Proxy_Function_Impl or the types didn't match
|
||||||
|
// we cannot make any other guesses or assumptions really, so continuing
|
||||||
|
}
|
||||||
|
|
||||||
return boost::bind(&function_caller<Ret BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, Param)>, funcs
|
return boost::bind(&function_caller<Ret BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, Param)>, funcs
|
||||||
BOOST_PP_ENUM_TRAILING(n, curry, ~));
|
BOOST_PP_ENUM_TRAILING(n, curry, ~));
|
||||||
}
|
}
|
||||||
|
@ -457,6 +457,11 @@ namespace chaiscript
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boost::function<Func> internal_function() const
|
||||||
|
{
|
||||||
|
return m_f;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual Boxed_Value do_call(const std::vector<Boxed_Value> ¶ms) const
|
virtual Boxed_Value do_call(const std::vector<Boxed_Value> ¶ms) const
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user