diff --git a/debug/fpe_win32.cpp b/debug/fpe_win32.cpp index e69de29b..b9c9053f 100644 --- a/debug/fpe_win32.cpp +++ b/debug/fpe_win32.cpp @@ -0,0 +1,71 @@ +#include "./fpe.hpp" + +#undef __STRICT_ANSI__ + +#include + +//#pragma fenv_access (on) + + +using cruft::debug::fpe::scoped_reset; + + +/////////////////////////////////////////////////////////////////////////////// +void +cruft::debug::fpe::enable (void) +{ + unsigned int current; + (void)current; + _controlfp_s (¤t, _MCW_EM, _EM_INVALID | _EM_ZERODIVIDE); +} + + +//----------------------------------------------------------------------------- +void +cruft::debug::fpe::disable (void) +{ + unsigned int current; + (void)current; + _controlfp_s (¤t, 0, _EM_INVALID | _EM_ZERODIVIDE); +} + + +//----------------------------------------------------------------------------- +bool cruft::debug::fpe::value (void) +{ + unsigned current; + _controlfp_s (¤t, _EM_INVALID, 0); + return current; +} + + +//----------------------------------------------------------------------------- +bool cruft::debug::fpe::value (bool val) +{ + if (val) + enable (); + else + disable (); + return val; +} + + +/////////////////////////////////////////////////////////////////////////////// +scoped_reset::scoped_reset () + : m_prev (value ()) +{ } + + +//----------------------------------------------------------------------------- +scoped_reset::scoped_reset (bool _value) + : scoped_reset () +{ + value (_value); +} + + +//----------------------------------------------------------------------------- +scoped_reset::~scoped_reset () +{ + value (m_prev); +}