#include <FPEManager.hpp> #include <pastis_config.hpp> #include <rang.hpp> #ifdef PASTIS_HAS_FENV_H #include <fenv.h> #define MANAGED_FPE (FE_DIVBYZERO|FE_INVALID|FE_OVERFLOW|FE_UNDERFLOW) void FPEManager::enable() { std::cout << "FE management: " << rang::style::bold << rang::fgB::green << "enabled" << rang::fg::reset << rang::style::reset << '\n'; ::feenableexcept(MANAGED_FPE); } void FPEManager::disable() { std::cout << "FE management: " << rang::style::bold << rang::fgB::red << "disabled" << rang::fg::reset << rang::style::reset << '\n'; ::fedisableexcept(MANAGED_FPE); } #else // PASTIS_HAS_FENV_H void FPEManager::enable() { std::cout << "FE management: enabled " << rang::fg::red << "[not supported]" << rang::fg::reset << '\n'; } void FPEManager::disable() { std::cout << "FE management: disable " << rang::fg::red << "[not supported]" << rang::fg::reset << '\n'; } #endif // PASTIS_HAS_FENV_H void FPEManager::init(const bool& enable) { if (enable) { FPEManager::enable(); } else { FPEManager::disable(); } }