// 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_CALLABLE_TRAITS_HPP_ #define CHAISCRIPT_CALLABLE_TRAITS_HPP_ #include namespace chaiscript { namespace dispatch { namespace detail { template struct Constructor { template std::shared_ptr operator()(Inner&& ... inner) const { return std::make_shared(std::forward(inner)...); } }; template struct Const_Caller { Const_Caller(Ret (Class::*t_func)(Param...) const) : m_func(t_func) {} template Ret operator()(const Class &o, Inner&& ... inner) const { return (o.*m_func)(std::forward(inner)...); } Ret (Class::*m_func)(Param...) const; }; template struct Caller { Caller(Ret (Class::*t_func)(Param...)) : m_func(t_func) {} template Ret operator()(Class &o, Inner&& ... inner) const { return (o.*m_func)(std::forward(inner)...); } Ret (Class::*m_func)(Param...); }; template struct Function_Signature { template static Ret deduce_ret_type(Function_Signature *); typedef T Signature; typedef Function_Signature *ptr_type; typedef decltype(deduce_ret_type(ptr_type(nullptr))) Return_Type; }; template struct Callable_Traits { template static Function_Signature deduce_sig_type(Ret (T::*)(Param...) const); typedef typename decltype(deduce_sig_type(&T::operator()))::Signature Signature; typedef decltype(deduce_sig_type(&T::operator())) Signature_Object; typedef typename Signature_Object::Return_Type Return_Type; }; } } } #endif