// This file is distributed under the BSD License. // See "license.txt" for details. // Copyright 2009-2012, Jonathan Turner (jonathan@emptycrate.com) // Copyright 2009-2015, 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 T* get_pointer(T *t) { return t; } template T* get_pointer(const std::reference_wrapper &t) { return &t.get(); } template std::function bind_first(Ret (*f)(P1, Param...), O&& o) { return std::function( [f, o](Param...param) -> Ret { return f(std::forward(o), std::forward(param)...); } ); } template std::function bind_first(Ret (Class::*f)(Param...), O&& o) { return std::function( [f, o](Param...param) -> Ret { return (get_pointer(o)->*f)(std::forward(param)...); } ); } template std::function bind_first(Ret (Class::*f)(Param...) const, O&& o) { return std::function( [f, o](Param...param) -> Ret { return (get_pointer(o)->*f)(std::forward(param)...); } ); } template std::function bind_first(const std::function &f, O&& o) { return std::function( [f, o](Param...param) -> Ret { return f(o, std::forward(param)...); }); } } } #endif