Simplify implementation of bind_first and add some detail namespacing
This commit is contained in:
parent
d946cb7e9d
commit
4e5c972e66
@ -16,50 +16,66 @@
|
|||||||
#include <boost/function.hpp>
|
#include <boost/function.hpp>
|
||||||
#include <boost/bind.hpp>
|
#include <boost/bind.hpp>
|
||||||
#include <boost/ref.hpp>
|
#include <boost/ref.hpp>
|
||||||
|
#include <boost/function_types/result_type.hpp>
|
||||||
|
#include <boost/function_types/function_type.hpp>
|
||||||
|
#include <boost/function_types/parameter_types.hpp>
|
||||||
|
#include <boost/function_types/function_arity.hpp>
|
||||||
|
|
||||||
#define BOOST_PP_ITERATION_LIMITS ( 0, 8 )
|
#define BOOST_PP_ITERATION_LIMITS ( 0, 8 )
|
||||||
#define BOOST_PP_FILENAME_1 <chaiscript/dispatchkit/bind_first.hpp>
|
#define BOOST_PP_FILENAME_1 <chaiscript/dispatchkit/bind_first.hpp>
|
||||||
|
|
||||||
|
namespace chaiscript
|
||||||
|
{
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
template<int, typename T>
|
||||||
|
struct bind_helper
|
||||||
|
{
|
||||||
|
template<typename F, typename V>
|
||||||
|
static boost::function<T> go(const F &f, const V &v)
|
||||||
|
{
|
||||||
|
return boost::function<T>();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
#include BOOST_PP_ITERATE()
|
#include BOOST_PP_ITERATE()
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct pop_front
|
||||||
|
{
|
||||||
|
typedef typename boost::function_types::function_type<
|
||||||
|
typename boost::mpl::push_front<
|
||||||
|
typename boost::mpl::pop_front<typename
|
||||||
|
boost::function_types::parameter_types<T> >::type,
|
||||||
|
typename boost::function_types::result_type<T>::type
|
||||||
|
>::type
|
||||||
|
>::type type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T, typename U>
|
||||||
|
boost::function<typename pop_front<T>::type> bind_first(T t, const U &u)
|
||||||
|
{
|
||||||
|
return bind_helper<boost::function_types::function_arity<T>::value,
|
||||||
|
typename pop_front<T>::type>::go(t, u);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# endif
|
# endif
|
||||||
#else
|
#else
|
||||||
# define n BOOST_PP_ITERATION()
|
# define n BOOST_PP_ITERATION()
|
||||||
# define m BOOST_PP_INC(n)
|
# define m BOOST_PP_INC(n)
|
||||||
|
|
||||||
namespace chaiscript
|
|
||||||
{
|
template<typename T>
|
||||||
|
struct bind_helper<m, T>
|
||||||
template<typename Ret, typename O, typename Class BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, typename Param) >
|
|
||||||
boost::function<Ret (BOOST_PP_ENUM_PARAMS(n, Param))>
|
|
||||||
bind_first(Ret (Class::*f)(BOOST_PP_ENUM_PARAMS(n, Param)), const O &o)
|
|
||||||
{
|
{
|
||||||
return boost::bind(f, o BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM(n, param, _));
|
template<typename F, typename V>
|
||||||
}
|
static boost::function<T> go(const F &f, const V &v)
|
||||||
|
{
|
||||||
|
return boost::bind(f, v BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM(n, param, _));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
template<typename Ret, typename O, typename Class BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, typename Param) >
|
|
||||||
boost::function<Ret (BOOST_PP_ENUM_PARAMS(n, Param))>
|
|
||||||
bind_first(Ret (Class::*f)(BOOST_PP_ENUM_PARAMS(n, Param))const, const O &o)
|
|
||||||
{
|
|
||||||
return boost::bind(f, o BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM(n, param, _));
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Ret,typename O BOOST_PP_COMMA_IF(m) BOOST_PP_ENUM_PARAMS(m, typename Param) >
|
|
||||||
boost::function<Ret (BOOST_PP_ENUM(n, param, Param))>
|
|
||||||
bind_first(Ret (*f)(BOOST_PP_ENUM_PARAMS(m, Param)), const O &o)
|
|
||||||
{
|
|
||||||
return boost::bind(f, o BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM(n, param, _));
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Ret,typename O BOOST_PP_COMMA_IF(m) BOOST_PP_ENUM_PARAMS(m, typename Param) >
|
|
||||||
boost::function<Ret (BOOST_PP_ENUM(n, param, Param))>
|
|
||||||
bind_first(const boost::function<Ret (BOOST_PP_ENUM_PARAMS(m, Param))> &f, const O &o)
|
|
||||||
{
|
|
||||||
return boost::bind(f, o BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM(n, param, _));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -378,7 +378,7 @@ namespace chaiscript
|
|||||||
|
|
||||||
virtual Boxed_Value operator()(const std::vector<Boxed_Value> ¶ms) const
|
virtual Boxed_Value operator()(const std::vector<Boxed_Value> ¶ms) const
|
||||||
{
|
{
|
||||||
return Do_Call<typename boost::function<Func>::result_type>::go(m_f, params);
|
return detail::Do_Call<typename boost::function<Func>::result_type>::go(m_f, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int get_arity() const
|
virtual int get_arity() const
|
||||||
|
@ -44,26 +44,30 @@ namespace chaiscript
|
|||||||
int expected;
|
int expected;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename Ret>
|
namespace detail
|
||||||
struct Do_Call
|
{
|
||||||
{
|
|
||||||
template<typename Fun>
|
|
||||||
static Boxed_Value go(const boost::function<Fun> &fun, const std::vector<Boxed_Value> ¶ms)
|
|
||||||
{
|
|
||||||
return Handle_Return<Ret>::handle(call_func(fun, params));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
template<typename Ret>
|
||||||
struct Do_Call<void>
|
struct Do_Call
|
||||||
{
|
|
||||||
template<typename Fun>
|
|
||||||
static Boxed_Value go(const boost::function<Fun> &fun, const std::vector<Boxed_Value> ¶ms)
|
|
||||||
{
|
{
|
||||||
call_func(fun, params);
|
template<typename Fun>
|
||||||
return Handle_Return<void>::handle();
|
static Boxed_Value go(const boost::function<Fun> &fun, const std::vector<Boxed_Value> ¶ms)
|
||||||
|
{
|
||||||
|
return Handle_Return<Ret>::handle(call_func(fun, params));
|
||||||
|
}
|
||||||
};
|
};
|
||||||
};
|
|
||||||
|
template<>
|
||||||
|
struct Do_Call<void>
|
||||||
|
{
|
||||||
|
template<typename Fun>
|
||||||
|
static Boxed_Value go(const boost::function<Fun> &fun, const std::vector<Boxed_Value> ¶ms)
|
||||||
|
{
|
||||||
|
call_func(fun, params);
|
||||||
|
return Handle_Return<void>::handle();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define BOOST_PP_ITERATION_LIMITS ( 0, 10 )
|
#define BOOST_PP_ITERATION_LIMITS ( 0, 10 )
|
||||||
|
@ -74,13 +74,13 @@ namespace chaiscript
|
|||||||
template<typename T, typename Q>
|
template<typename T, typename Q>
|
||||||
Proxy_Function fun(T t, const Q &q)
|
Proxy_Function fun(T t, const Q &q)
|
||||||
{
|
{
|
||||||
return detail::fun_helper(bind_first(t, q));
|
return detail::fun_helper(detail::bind_first(t, q));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T, typename Q, typename R>
|
template<typename T, typename Q, typename R>
|
||||||
Proxy_Function fun(T t, const Q &q, const R &r)
|
Proxy_Function fun(T t, const Q &q, const R &r)
|
||||||
{
|
{
|
||||||
return detail::fun_helper(bind_first(bind_first(t, q), r));
|
return detail::fun_helper(detail::bind_first(detail::bind_first(t, q), r));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user