// This file is distributed under the BSD License. // See "license.txt" for details. // Copyright 2009-2012, Jonathan Turner (jonathan@emptycrate.com) // and Jason Turner (jason@emptycrate.com) // http://www.chaiscript.com #ifndef CHAISCRIPT_BIND_FIRST_HPP_ #define CHAISCRIPT_BIND_FIRST_HPP_ #include namespace chaiscript { namespace detail { template struct Placeholder { }; template<> struct Placeholder<1> { static decltype(std::placeholders::_1) value() { return std::placeholders::_1; } }; template<> struct Placeholder<2> { static decltype(std::placeholders::_2) value() { return std::placeholders::_2; } }; template<> struct Placeholder<3> { static decltype(std::placeholders::_3) value() { return std::placeholders::_3; } }; template<> struct Placeholder<4> { static decltype(std::placeholders::_4) value() { return std::placeholders::_4; } }; template<> struct Placeholder<5> { static decltype(std::placeholders::_5) value() { return std::placeholders::_5; } }; template<> struct Placeholder<6> { static decltype(std::placeholders::_6) value() { return std::placeholders::_6; } }; template<> struct Placeholder<7> { static decltype(std::placeholders::_7) value() { return std::placeholders::_7; } }; template<> struct Placeholder<8> { static decltype(std::placeholders::_8) value() { return std::placeholders::_8; } }; template<> struct Placeholder<9> { static decltype(std::placeholders::_9) value() { return std::placeholders::_9; } }; template<> struct Placeholder<10> { static decltype(std::placeholders::_10) value() { return std::placeholders::_10; } }; template struct Bind_First { template static std::function bind(F f, InnerParams ... innerparams) { return Bind_First::bind(f, innerparams..., Placeholder::value()); } }; template struct Bind_First<0, maxcount, Sig> { template static std::function bind(F f, InnerParams ... innerparams) { return std::bind(f, innerparams...); } }; template std::function bind_first(Ret (*f)(P1, Param...), O o) { return Bind_First::bind(f, o); } template std::function bind_first(Ret (Class::*f)(Param...), O o) { return Bind_First::bind(f, o); } template std::function bind_first(Ret (Class::*f)(Param...) const, O o) { return Bind_First::bind(f, o); } template std::function bind_first(const std::function &f, O o) { return Bind_First::bind(f, o); } } } #endif