1 /////////////////////////////////////////////////////////////////////////////
2 // Name: cpp/overload.h
3 // Purpose: C++ code to redispatch a function based on function argument
5 // Author: Mattia Barbon
8 // RCS-ID: $Id: overload.h 2737 2010-01-03 19:50:07Z mbarbon $
9 // Copyright: (c) 2002, 2004, 2006-2007, 2010 Mattia Barbon
10 // Licence: This program is free software; you can redistribute it and/or
11 // modify it under the same terms as Perl itself
12 /////////////////////////////////////////////////////////////////////////////
14 #include "cpp/ovl_const.h"
16 #define BEGIN_OVERLOAD() \
21 #define END_OVERLOAD( FUNCTION ) \
24 static const char msg[] = "unable to resolve overloaded method for "; \
25 require_pv( "Carp" ); \
26 const char* argv[3]; argv[0] = msg; argv[1] = #FUNCTION; argv[2] = 0; \
27 call_argv( "Carp::croak", G_VOID|G_DISCARD, (char**) argv ); \
31 #define REDISPATCH( NEW_METHOD_NAME ) \
32 count = call_method( #NEW_METHOD_NAME, GIMME_V ); SPAGAIN
34 #define REDISPATCH_FUNCTION( NEW_METHOD_NAME ) \
35 count = call_pv( #NEW_METHOD_NAME, GIMME_V ); SPAGAIN
37 #define MATCH_VOIDM_REDISP( METHOD ) \
38 else if( items == 1 ) \
39 { REDISPATCH( METHOD ); }
41 #define MATCH_ANY_REDISP( METHOD ) \
43 { REDISPATCH( METHOD ); }
45 #define MATCH_REDISP( PROTO, METHOD ) \
46 else if( wxPli_match_arguments_skipfirst( aTHX_ PROTO, \
48 { REDISPATCH( METHOD ); }
50 #define MATCH_REDISP_COUNT( PROTO, METHOD, REQUIRED ) \
51 else if( wxPli_match_arguments_skipfirst( aTHX_ PROTO, \
53 { REDISPATCH( METHOD ); }
55 #define MATCH_REDISP_COUNT_ALLOWMORE( PROTO, METHOD, REQUIRED ) \
56 else if( wxPli_match_arguments_skipfirst( aTHX_ PROTO, \
58 { REDISPATCH( METHOD ); }
60 /* used for overloading static functions, see GraphicsContext.xs for an example */
61 #define MATCH_REDISP_FUNCTION( PROTO, METHOD ) \
62 else if( wxPli_match_arguments( aTHX_ PROTO, \
64 { REDISPATCH_FUNCTION( METHOD ); }
66 #define MATCH_REDISP_COUNT_FUNCTION( PROTO, METHOD, REQUIRED ) \
67 else if( wxPli_match_arguments( aTHX_ PROTO, \
69 { REDISPATCH_FUNCTION( METHOD ); }
71 #define MATCH_REDISP_COUNT_ALLOWMORE_FUNCTION( PROTO, METHOD, REQUIRED ) \
72 else if( wxPli_match_arguments( aTHX_ PROTO, \
74 { REDISPATCH_FUNCTION( METHOD ); }