ATLAS Offline Software
FPControl.cxx
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration.
3  */
12 #include "CxxUtils/FPControl.h"
13 #include "CxxUtils/features.h"
14 
15 
16 namespace CxxUtils {
17 
18 
24 FPControl::FPControl()
25 {
26  fegetenv (&m_env);
27 }
28 
29 
38 FPControl::~FPControl()
39 {
40  if (m_masked) {
41  feclearexcept (m_masked);
42  }
43  feupdateenv (&m_env);
44 }
45 
46 
50 void FPControl::holdExceptions()
51 {
52  fenv_t tmp;
53  feholdexcept (&tmp);
54  m_masked |= FE_ALL_EXCEPT;
55 }
56 
57 
62 void FPControl::enable ([[maybe_unused]] Exc exc)
63 {
64 #if HAVE_FEENABLEEXCEPT
65  int mask = excToMask (exc);
66  feenableexcept (mask);
67  m_masked &= ~mask;
68 #endif
69 }
70 
71 
76 void FPControl::disable ([[maybe_unused]] Exc exc)
77 {
78 #if HAVE_FEENABLEEXCEPT
79  int mask = excToMask (exc);
80  fedisableexcept (mask);
81  m_masked |= mask;
82 #endif
83 }
84 
85 
90 int FPControl::excToMask (Exc exc)
91 {
92  // A platform isn't required to define all of these...
93 #ifdef FE_ALL_EXCEPT
94  if (CxxUtils::test (exc, Exc::all))
95  return FE_ALL_EXCEPT;
96 #endif
97  int mask = 0;
98 #ifdef FE_DIVBYZERO
99  if (CxxUtils::test (exc, Exc::divbyzero)) mask |= FE_DIVBYZERO;
100 #endif
101 #ifdef FE_INEXACT
102  if (CxxUtils::test (exc, Exc::inexact)) mask |= FE_INEXACT;
103 #endif
104 #ifdef FE_INVALID
105  if (CxxUtils::test (exc, Exc::invalid)) mask |= FE_INVALID;
106 #endif
107 #ifdef FE_OVERFLOW
108  if (CxxUtils::test (exc, Exc::overflow)) mask |= FE_OVERFLOW;
109 #endif
110 #ifdef FE_UNDERFLOW
111  if (CxxUtils::test (exc, Exc::underflow)) mask |= FE_UNDERFLOW;
112 #endif
113  return mask;
114 }
115 
116 
117 } // namespace CxxUtils
118 
features.h
Some additional feature test macros.
Cut::all
@ all
Definition: SUSYToolsAlg.cxx:67
FPControl.h
Helper to control FP exceptions.
python.utils.AtlRunQueryLookup.mask
string mask
Definition: AtlRunQueryLookup.py:460
CxxUtils
Definition: aligned_vector.h:29
DeMoUpdate.tmp
string tmp
Definition: DeMoUpdate.py:1167
CxxUtils::test
constexpr std::enable_if_t< is_bitmask_v< E >, bool > test(E lhs, E rhs)
Convenience function to test bits in a class enum bitmask.
Definition: bitmask.h:270