%module wrapmacro #ifdef SWIGLUA // lua only has one numeric type, so some overloads shadow each other creating warnings %warnfilter(SWIGWARN_LANG_OVERLOAD_SHADOW) SWIGMACRO_maximum; #endif /* Testing technique for wrapping macros */ %{ #ifdef max #undef max #endif %} /* Here, some macros to wrap */ %inline %{ typedef unsigned short guint16; #define GUINT16_SWAP_LE_BE_CONSTANT(val) ((guint16) ( \ (guint16) ((guint16) (val) >> 8) | \ (guint16) ((guint16) (val) << 8))) /* Don't use max(), it's a builtin function for PHP. */ #define maximum(a,b) ((a) > (b) ? (a) : (b)) %} /* Here, the auxiliary macro to wrap a macro */ %define %wrapmacro(type, name, lparams, lnames) %rename(name) SWIGMACRO_##name; %inline %{ type SWIGMACRO_##name(lparams) { return name(lnames); } %} %enddef #define PLIST(...) __VA_ARGS__ /* Here, wrapping the macros */ %wrapmacro(guint16, GUINT16_SWAP_LE_BE_CONSTANT, guint16 val, val); %wrapmacro(size_t, maximum, PLIST(size_t a, const size_t& b), PLIST(a, b)); %wrapmacro(double, maximum, PLIST(double a, double b), PLIST(a, b)); /* Maybe in the future, a swig directive will make this easier: #define max(a,b) ((a) > (b) ? (a) : (b)) %wrapmacro double max(long a, double b); // target name is 'max' %wrapmacro(max_i) int max(int a, int b); // changes target name to 'max_i'. */ %{ #ifdef max #undef max #endif %}