Advertisement
Guest User

delegate_impl.i

a guest
Oct 28th, 2013
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.15 KB | None | 0 0
  1. template<typename R DELEGATE_COMMA DELEGATE_TEMPLATE_ARGS>
  2. class delegate<R(DELEGATE_ARG_TYPES)> : public delegate_base
  3. {
  4.     typedef R (*Wrapper)(void *, void * DELEGATE_COMMA DELEGATE_PROC_ARGS);
  5.  
  6. public:
  7.  
  8.     R operator()(DELEGATE_PROC_ARGS) const
  9.     {
  10.         assert(m_procWrapper);
  11.         Wrapper proc = reinterpret_cast<Wrapper>(m_procWrapper);
  12.         return proc(m_ptr, m_proc DELEGATE_COMMA DELEGATE_ARGS);
  13.     }
  14.  
  15. private:
  16.  
  17.     template<typename T>
  18.     static R wrapperMethod(void *ptr, void *proc_ptr DELEGATE_COMMA DELEGATE_PROC_ARGS)
  19.     {
  20.         typedef R(T::*P)(DELEGATE_ARG_TYPES);
  21.  
  22.         assert(ptr);
  23.         assert(proc_ptr);
  24.  
  25.         T *object = static_cast<T*>(ptr);
  26.         P *proc   = static_cast<P*>(proc_ptr);
  27.         return (object->**proc)(DELEGATE_ARGS);
  28.     }
  29.  
  30.     static R wrapperProc(void */*ptr*/, void *proc_ptr DELEGATE_COMMA DELEGATE_PROC_ARGS)
  31.     {
  32.         typedef R(*P)(DELEGATE_ARG_TYPES);
  33.         assert(proc_ptr);
  34.         P proc   = reinterpret_cast<P>(proc_ptr);
  35.         return proc(DELEGATE_ARGS);
  36.     }
  37.  
  38. public:
  39.  
  40.     template<typename T>
  41.     static delegate make(T *obj, R(T::*proc)(DELEGATE_ARG_TYPES))
  42.     {
  43.         delegate d;
  44.         d.m_ptr = obj;
  45.         d.m_proc = &proc;
  46.         d.m_procWrapper = reinterpret_cast<void*>(&wrapperMethod<T>);
  47.         return d;
  48.     }
  49.  
  50.     static delegate make(R(*proc)(DELEGATE_ARG_TYPES))
  51.     {
  52.         delegate d;
  53.         d.m_ptr         = 0;
  54.         d.m_proc        = reinterpret_cast<void*>(proc);
  55.         d.m_procWrapper = reinterpret_cast<void*>(&wrapperProc);
  56.         return d;
  57.     }
  58. };
  59.  
  60. template<typename R DELEGATE_COMMA DELEGATE_TEMPLATE_ARGS, typename T>
  61. delegate<R(DELEGATE_ARG_TYPES)> make_delegate(T *obj, R(T::*proc)(DELEGATE_ARG_TYPES))
  62. {
  63.     return delegate<R(DELEGATE_ARG_TYPES)>::make(obj, proc);
  64. }
  65.  
  66. template<typename R DELEGATE_COMMA DELEGATE_TEMPLATE_ARGS>
  67. delegate<R(DELEGATE_ARG_TYPES)> make_delegate(R(*proc)(DELEGATE_ARG_TYPES))
  68. {
  69.     return delegate<R(DELEGATE_ARG_TYPES)>::make(proc);
  70. }
  71.  
  72. #undef DELEGATE_COMMA
  73. #undef DELEGATE_TEMPLATE_ARGS
  74. #undef DELEGATE_ARG_TYPES
  75. #undef DELEGATE_PROC_ARGS
  76. #undef DELEGATE_ARGS
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement