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