%module infinity /* C99 defines INFINITY Because INFINITY may be defined by compiler built-ins, we can't use #define. Instead, expose the variable MYINFINITY and then use %rename to make it INFINITY in the scripting language. */ %rename(INFINITY) MYINFINITY; %{ #include /* C99 math.h defines INFINITY. If not available, this is the fallback. */ #if !defined(INFINITY) #if defined(_MSC_VER) union MSVC_EVIL_FLOAT_HACK { unsigned __int8 Bytes[4]; float Value; }; const union MSVC_EVIL_FLOAT_HACK INFINITY_HACK = {{0x00, 0x00, 0x80, 0x7F}}; #define INFINITY (INFINITY_HACK.Value) #define INFINITY_NO_CONST #endif #ifdef __GNUC__ #define INFINITY (__builtin_inf()) #elif defined(__clang__) #if __has_builtin(__builtin_inf) #define INFINITY (__builtin_inf()) #endif #endif #ifndef INFINITY #define INFINITY (1e1000) #endif #endif #ifdef INFINITY_NO_CONST /* To void: error C2099: initializer is not a constant */ double MYINFINITY = 0.0; void initialise_MYINFINITY(void) { MYINFINITY = INFINITY; } #else const double MYINFINITY = INFINITY; void initialise_MYINFINITY(void) { } #endif float use_infinity(float inf_val) { return inf_val; } %} /* This will allow us to bind the real INFINITY value through SWIG via MYINFINITY. Use %rename to fix the name. */ const double MYINFINITY = INFINITY; void initialise_MYINFINITY(void); /* Use of float is intentional because the original bug was in the float conversion due to overflow checking. */ float use_infinity(float inf_val);