26 #if VIGRA_DELEGATE_PARAM_COUNT > 0
27 #define VIGRA_DELEGATE_SEPARATOR ,
29 #define VIGRA_DELEGATE_SEPARATOR
33 #define VIGRA_DELEGATE_JOIN_MACRO( X, Y) VIGRA_DELEGATE_DO_JOIN( X, Y )
34 #define VIGRA_DELEGATE_DO_JOIN( X, Y ) VIGRA_DELEGATE_DO_JOIN2(X,Y)
35 #define VIGRA_DELEGATE_DO_JOIN2( X, Y ) X##Y
39 #ifdef VIGRA_DELEGATE_PREFERRED_SYNTAX
40 #define VIGRA_DELEGATE_CLASS_NAME delegate
41 #define VIGRA_DELEGATE_INVOKER_CLASS_NAME delegate_invoker
43 #define VIGRA_DELEGATE_CLASS_NAME VIGRA_DELEGATE_JOIN_MACRO(delegate,VIGRA_DELEGATE_PARAM_COUNT)
44 #define VIGRA_DELEGATE_INVOKER_CLASS_NAME VIGRA_DELEGATE_JOIN_MACRO(delegate_invoker,VIGRA_DELEGATE_PARAM_COUNT)
45 template <
typename R VIGRA_DELEGATE_SEPARATOR VIGRA_DELEGATE_TEMPLATE_PARAMS>
46 class VIGRA_DELEGATE_INVOKER_CLASS_NAME;
49 template <
typename R VIGRA_DELEGATE_SEPARATOR VIGRA_DELEGATE_TEMPLATE_PARAMS>
50 #ifdef VIGRA_DELEGATE_PREFERRED_SYNTAX
51 class VIGRA_DELEGATE_CLASS_NAME<R (VIGRA_DELEGATE_TEMPLATE_ARGS)>
53 class VIGRA_DELEGATE_CLASS_NAME
57 typedef R return_type;
58 #ifdef VIGRA_DELEGATE_PREFERRED_SYNTAX
59 typedef return_type (VIGRA_DELEGATE_CALLTYPE *signature_type)(VIGRA_DELEGATE_TEMPLATE_ARGS);
60 typedef VIGRA_DELEGATE_INVOKER_CLASS_NAME<signature_type> invoker_type;
62 typedef VIGRA_DELEGATE_INVOKER_CLASS_NAME<R VIGRA_DELEGATE_SEPARATOR VIGRA_DELEGATE_TEMPLATE_ARGS> invoker_type;
65 VIGRA_DELEGATE_CLASS_NAME()
70 template <return_type (*TMethod)(VIGRA_DELEGATE_TEMPLATE_ARGS)>
71 static VIGRA_DELEGATE_CLASS_NAME from_function()
73 return from_stub(0, &function_stub<TMethod>);
76 template <
class T, return_type (T::*TMethod)(VIGRA_DELEGATE_TEMPLATE_ARGS)>
77 static VIGRA_DELEGATE_CLASS_NAME from_method(T* object_ptr)
79 return from_stub(object_ptr, &method_stub<T, TMethod>);
82 template <
class T, return_type (T::*TMethod)(VIGRA_DELEGATE_TEMPLATE_ARGS) const>
83 static VIGRA_DELEGATE_CLASS_NAME from_const_method(T
const* object_ptr)
85 return from_stub(const_cast<T*>(object_ptr), &const_method_stub<T, TMethod>);
88 return_type operator()(VIGRA_DELEGATE_PARAMS)
const
90 return (*stub_ptr)(object_ptr VIGRA_DELEGATE_SEPARATOR VIGRA_DELEGATE_ARGS);
93 operator bool ()
const
98 bool operator!()
const
100 return !(
operator bool());
105 typedef return_type (VIGRA_DELEGATE_CALLTYPE *stub_type)(
void* object_ptr VIGRA_DELEGATE_SEPARATOR VIGRA_DELEGATE_PARAMS);
110 static VIGRA_DELEGATE_CLASS_NAME from_stub(
void* object_ptr, stub_type stub_ptr)
112 VIGRA_DELEGATE_CLASS_NAME d;
113 d.object_ptr = object_ptr;
114 d.stub_ptr = stub_ptr;
118 template <return_type (*TMethod)(VIGRA_DELEGATE_TEMPLATE_ARGS)>
119 static return_type VIGRA_DELEGATE_CALLTYPE function_stub(
void* VIGRA_DELEGATE_SEPARATOR VIGRA_DELEGATE_PARAMS)
121 return (TMethod)(VIGRA_DELEGATE_ARGS);
124 template <
class T, return_type (T::*TMethod)(VIGRA_DELEGATE_TEMPLATE_ARGS)>
125 static return_type VIGRA_DELEGATE_CALLTYPE method_stub(
void* object_ptr VIGRA_DELEGATE_SEPARATOR VIGRA_DELEGATE_PARAMS)
127 T* p =
static_cast<T*
>(object_ptr);
128 return (p->*TMethod)(VIGRA_DELEGATE_ARGS);
131 template <
class T, return_type (T::*TMethod)(VIGRA_DELEGATE_TEMPLATE_ARGS) const>
132 static return_type VIGRA_DELEGATE_CALLTYPE const_method_stub(
void* object_ptr VIGRA_DELEGATE_SEPARATOR VIGRA_DELEGATE_PARAMS)
134 T
const* p =
static_cast<T*
>(object_ptr);
135 return (p->*TMethod)(VIGRA_DELEGATE_ARGS);
139 template <
typename R VIGRA_DELEGATE_SEPARATOR VIGRA_DELEGATE_TEMPLATE_PARAMS>
140 #ifdef VIGRA_DELEGATE_PREFERRED_SYNTAX
141 class VIGRA_DELEGATE_INVOKER_CLASS_NAME<R (VIGRA_DELEGATE_TEMPLATE_ARGS)>
143 class VIGRA_DELEGATE_INVOKER_CLASS_NAME
146 VIGRA_DELEGATE_INVOKER_DATA
149 VIGRA_DELEGATE_INVOKER_CLASS_NAME(VIGRA_DELEGATE_PARAMS)
150 #if VIGRA_DELEGATE_PARAM_COUNT > 0
153 VIGRA_DELEGATE_INVOKER_INITIALIZATION_LIST
157 template <
class TDelegate>
158 R operator()(TDelegate d)
const
160 return d(VIGRA_DELEGATE_ARGS);
165 #undef VIGRA_DELEGATE_CLASS_NAME
166 #undef VIGRA_DELEGATE_SEPARATOR
167 #undef VIGRA_DELEGATE_JOIN_MACRO
168 #undef VIGRA_DELEGATE_DO_JOIN
169 #undef VIGRA_DELEGATE_DO_JOIN2