108 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// This file is distributed under the BSD License.
 | 
						|
// See "license.txt" for details.
 | 
						|
// Copyright 2009-2012, Jonathan Turner (jonathan@emptycrate.com)
 | 
						|
// Copyright 2009-2016, Jason Turner (jason@emptycrate.com)
 | 
						|
// http://www.chaiscript.com
 | 
						|
 | 
						|
#ifndef CHAISCRIPT_CALLABLE_TRAITS_HPP_
 | 
						|
#define CHAISCRIPT_CALLABLE_TRAITS_HPP_
 | 
						|
 | 
						|
#include <memory>
 | 
						|
 | 
						|
namespace chaiscript {
 | 
						|
  namespace dispatch {
 | 
						|
    namespace detail {
 | 
						|
 | 
						|
      template<typename Class, typename ... Param>
 | 
						|
      struct Constructor
 | 
						|
      {
 | 
						|
        template<typename ... Inner>
 | 
						|
        std::shared_ptr<Class> operator()(Inner&& ... inner) const {
 | 
						|
          return std::make_shared<Class>(std::forward<Inner>(inner)...);
 | 
						|
        }
 | 
						|
      };
 | 
						|
 | 
						|
      template<typename Ret, typename Class, typename ... Param>
 | 
						|
      struct Const_Caller
 | 
						|
      {
 | 
						|
        Const_Caller(Ret (Class::*t_func)(Param...) const) : m_func(t_func) {}
 | 
						|
 | 
						|
        template<typename ... Inner>
 | 
						|
        Ret operator()(const Class &o, Inner&& ... inner) const {
 | 
						|
          return (o.*m_func)(std::forward<Inner>(inner)...);
 | 
						|
        }
 | 
						|
 | 
						|
        Ret (Class::*m_func)(Param...) const;
 | 
						|
      };
 | 
						|
 | 
						|
      template<typename Ret, typename ... Param>
 | 
						|
      struct Fun_Caller
 | 
						|
      {
 | 
						|
        Fun_Caller(Ret( * t_func)(Param...) ) : m_func(t_func) {}
 | 
						|
 | 
						|
        template<typename ... Inner>
 | 
						|
        Ret operator()(Inner&& ... inner) const {
 | 
						|
          return (m_func)(std::forward<Inner>(inner)...);
 | 
						|
        }
 | 
						|
 | 
						|
        Ret(*m_func)(Param...);
 | 
						|
      };
 | 
						|
 | 
						|
      template<typename Ret, typename Class, typename ... Param>
 | 
						|
      struct Caller
 | 
						|
      {
 | 
						|
        Caller(Ret (Class::*t_func)(Param...)) : m_func(t_func) {}
 | 
						|
 | 
						|
        template<typename ... Inner>
 | 
						|
        Ret operator()(Class &o, Inner&& ... inner) const {
 | 
						|
          return (o.*m_func)(std::forward<Inner>(inner)...);
 | 
						|
        }
 | 
						|
 | 
						|
        Ret (Class::*m_func)(Param...);
 | 
						|
      };
 | 
						|
 | 
						|
      template<typename T>
 | 
						|
        struct Arity
 | 
						|
        {
 | 
						|
        };
 | 
						|
 | 
						|
      template<typename Ret, typename ... Params>
 | 
						|
      struct Arity<Ret (Params...)>
 | 
						|
        {
 | 
						|
          static const size_t arity = sizeof...(Params);
 | 
						|
        };
 | 
						|
 | 
						|
 | 
						|
      template<typename T>
 | 
						|
        struct Function_Signature
 | 
						|
        {
 | 
						|
        };
 | 
						|
 | 
						|
      template<typename Ret, typename ... Params>
 | 
						|
      struct Function_Signature<Ret (Params...)>
 | 
						|
        {
 | 
						|
          typedef Ret Return_Type;
 | 
						|
          typedef Ret (Signature)(Params...);
 | 
						|
        };
 | 
						|
 | 
						|
      template<typename Ret, typename T, typename ... Params>
 | 
						|
      struct Function_Signature<Ret (T::*)(Params...) const>
 | 
						|
        {
 | 
						|
          typedef Ret Return_Type;
 | 
						|
          typedef Ret (Signature)(Params...);
 | 
						|
        };
 | 
						|
 | 
						|
 | 
						|
      template<typename T>
 | 
						|
        struct Callable_Traits
 | 
						|
        {
 | 
						|
          typedef typename Function_Signature<decltype(&T::operator())>::Signature Signature;
 | 
						|
          typedef typename Function_Signature<decltype(&T::operator())>::Return_Type Return_Type;
 | 
						|
        };
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
#endif
 | 
						|
 |