| %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 <math.h> |
| |
| /* 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); |
| |