Advertisement
donkaban

Untitled

Sep 29th, 2015
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.62 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include "js_host.h"
  4.  
  5. template<int ...>         struct seq {};
  6. template<int N, int ...M> struct gen : gen<N - 1, N - 1, M...>  {};
  7. template<int ...N>        struct gen<0, N...> {typedef seq<N...> type;};
  8.  
  9. template <typename T>  struct identity {typedef T type;};
  10.  
  11. // indirect apply lambdas
  12.  
  13. template<typename R, typename ... A , int ...N>
  14. R apply(typename identity<std::function<R(A...)>>::type f, js_State *J, std::tuple<A...>*, seq<N...>)
  15. {
  16.     return f(stack::get<A>(J, N)...);
  17. }
  18. template<typename ... A , int ...N>
  19. void apply(typename identity<std::function<void(A...)>>::type f, js_State *J, std::tuple<A...>*, seq<N...>)
  20. {
  21.     f(stack::get<A>(J, N)...);
  22. }
  23.  
  24. // indirect apply static
  25.  
  26. template<typename R, typename ... A , int ...N>
  27. R apply(R(*f)(A...), js_State *J, std::tuple<A...>*, seq<N...>)
  28. {
  29.     return f(stack::get<A>(J, N)...);
  30. }
  31. template<typename ... A , int ...N>
  32. void apply(void(*f)(A...), js_State *J, std::tuple<A...>*, seq<N...>)
  33. {
  34.     f(stack::get<A>(J, N)...);
  35. }
  36.  
  37. // indirect apply members
  38.  
  39. template<typename R, typename T, typename ... A , int ...N>
  40. R apply(T * instance, R(T::*f)(A...), js_State *J, std::tuple<A...>*, seq<N...>)
  41. {
  42.     return (instance->*f)(stack::get<A>(J, N)...);
  43. }
  44.  
  45. template<typename T, typename ... A , int ...N>
  46. void apply(T * instance, void (T::*f)(A...), js_State *J, std::tuple<A...>*, seq<N...>)
  47. {
  48.     (instance->*f)(stack::get<A>(J, N)...);
  49. }
  50.  
  51. // indirect apply constructor
  52.  
  53. template<typename T, typename ... A , int ...N>
  54. T * constructor(T *, js_State *J, std::tuple<A...>*, seq<N...>)
  55. {
  56.     return new T(stack::get<A>(J, N)...);
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement