// This file is distributed under the BSD License. // See "license.txt" for details. // Copyright 2009-2011, Jonathan Turner (jonathan@emptycrate.com) // and Jason Turner (jason@emptycrate.com) // http://www.chaiscript.com #include #include #define param(z,n,text) BOOST_PP_CAT(text, BOOST_PP_INC(n)) #ifndef BOOST_PP_IS_ITERATING #ifndef CHAISCRIPT_BIND_FIRST_HPP_ #define CHAISCRIPT_BIND_FIRST_HPP_ #define BOOST_PP_ITERATION_LIMITS ( 0, 8 ) #define BOOST_PP_FILENAME_1 #include BOOST_PP_ITERATE() # endif #else # define n BOOST_PP_ITERATION() # define m BOOST_PP_INC(n) namespace chaiscript { namespace detail { /// \brief Helper function for binding the first parameter of a class method pointer. Used in chaiscript::fun overloads /// that take 1 or 2 parameters to pre-bind to the function. /// /// \param[in] f method pointer to bind /// \param[in] o object to bind as first parameter /// \returns a new std::function object with one fewer parameters than the function passed in. template std::function bind_first(Ret (Class::*f)(BOOST_PP_ENUM_PARAMS(n, Param)), const O &o) { return std::bind(std::mem_fn(f), o BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM(n, param, std::placeholders::_)); } /// \brief Helper function for binding the first parameter of a const class method pointer. Used in chaiscript::fun overloads /// that take 1 or 2 parameters to pre-bind to the function. /// /// \param[in] f method pointer to bind /// \param[in] o object to bind as first parameter /// \returns a new std::function object with one fewer parameters than the function passed in. template std::function bind_first(Ret (Class::*f)(BOOST_PP_ENUM_PARAMS(n, Param)) const, const O &o) { return std::bind(std::mem_fn(f), o BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM(n, param, std::placeholders::_)); } /// \brief Helper function for binding the first parameter of a function pointer. Used in chaiscript::fun overloads /// that take 1 or 2 parameters to pre-bind to the function. /// /// \param[in] f method pointer to bind /// \param[in] o object to bind as first parameter /// \returns a new std::function object with one fewer parameters than the function passed in. template std::function bind_first(Ret (*f)(BOOST_PP_ENUM_PARAMS(m, Param)), const O &o) { return std::bind(f, o BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM(n, param, std::placeholders::_)); } /// \brief Helper function for binding the first parameter of a std::function object. Used in chaiscript::fun overloads /// that take 1 or 2 parameters to pre-bind to the function. /// /// \param[in] f method pointer to bind /// \param[in] o object to bind as first parameter /// \returns a new std::function object with one fewer parameters than the function passed in. template std::function bind_first(const std::function &f, const O &o) { return std::bind(f, o BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM(n, param, std::placeholders::_)); } } } #undef n #undef m #endif