#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();
  }
}