Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- template<typename R DELEGATE_COMMA DELEGATE_TEMPLATE_ARGS>
- class delegate<R(DELEGATE_ARG_TYPES)> : public delegate_base
- {
- typedef R (*Wrapper)(void *, void * DELEGATE_COMMA DELEGATE_PROC_ARGS);
- public:
- R operator()(DELEGATE_PROC_ARGS) const
- {
- assert(m_procWrapper);
- Wrapper proc = reinterpret_cast<Wrapper>(m_procWrapper);
- return proc(m_ptr, m_proc DELEGATE_COMMA DELEGATE_ARGS);
- }
- private:
- template<typename T>
- static R wrapperMethod(void *ptr, void *proc_ptr DELEGATE_COMMA DELEGATE_PROC_ARGS)
- {
- typedef R(T::*P)(DELEGATE_ARG_TYPES);
- assert(ptr);
- assert(proc_ptr);
- T *object = static_cast<T*>(ptr);
- P *proc = static_cast<P*>(proc_ptr);
- return (object->**proc)(DELEGATE_ARGS);
- }
- static R wrapperProc(void */*ptr*/, void *proc_ptr DELEGATE_COMMA DELEGATE_PROC_ARGS)
- {
- typedef R(*P)(DELEGATE_ARG_TYPES);
- assert(proc_ptr);
- P proc = reinterpret_cast<P>(proc_ptr);
- return proc(DELEGATE_ARGS);
- }
- public:
- template<typename T>
- static delegate make(T *obj, R(T::*proc)(DELEGATE_ARG_TYPES))
- {
- delegate d;
- d.m_ptr = obj;
- d.m_proc = &proc;
- d.m_procWrapper = reinterpret_cast<void*>(&wrapperMethod<T>);
- return d;
- }
- static delegate make(R(*proc)(DELEGATE_ARG_TYPES))
- {
- delegate d;
- d.m_ptr = 0;
- d.m_proc = reinterpret_cast<void*>(proc);
- d.m_procWrapper = reinterpret_cast<void*>(&wrapperProc);
- return d;
- }
- };
- template<typename R DELEGATE_COMMA DELEGATE_TEMPLATE_ARGS, typename T>
- delegate<R(DELEGATE_ARG_TYPES)> make_delegate(T *obj, R(T::*proc)(DELEGATE_ARG_TYPES))
- {
- return delegate<R(DELEGATE_ARG_TYPES)>::make(obj, proc);
- }
- template<typename R DELEGATE_COMMA DELEGATE_TEMPLATE_ARGS>
- delegate<R(DELEGATE_ARG_TYPES)> make_delegate(R(*proc)(DELEGATE_ARG_TYPES))
- {
- return delegate<R(DELEGATE_ARG_TYPES)>::make(proc);
- }
- #undef DELEGATE_COMMA
- #undef DELEGATE_TEMPLATE_ARGS
- #undef DELEGATE_ARG_TYPES
- #undef DELEGATE_PROC_ARGS
- #undef DELEGATE_ARGS
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement