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