hypot.h
Go to the documentation of this file.
1 #ifndef cetlib_hypot_h
2 #define cetlib_hypot_h
3 
4 // ======================================================================
5 //
6 // hypot: Checked and unchecked Euclidean planar hypotenuse calculations
7 //
8 // ======================================================================
9 
10 #include <cmath>
11 #include <limits>
12 #include <type_traits>
13 #include <utility>
14 
15 // ----------------------------------------------------------------------
16 
17 namespace cet {
18  template <class T>
19  std::enable_if_t<std::is_arithmetic_v<T>, T> hypot(T x, T y);
20 
21  template <class T>
22  std::enable_if_t<std::is_arithmetic_v<T>, T> unchecked_hypot(T x, T y);
23 
24  template <class T>
25  std::enable_if_t<std::is_arithmetic_v<T>, T> checked_hypot(T x, T y);
26 }
27 
28 // ----------------------------------------------------------------------
29 // unchecked_hypot<>:
30 
31 template <class T>
32 inline std::enable_if_t<std::is_arithmetic_v<T>, T>
34 {
35  return std::hypot(x, y);
36 }
37 
38 // ----------------------------------------------------------------------
39 // checked_hypot<>:
40 
41 template <class T>
42 std::enable_if_t<std::is_arithmetic_v<T>, T>
44 {
45 
46  if (std::isinf(x) || std::isinf(y))
47  return std::numeric_limits<T>::infinity();
48  else if (std::isnan(x) || std::isnan(y))
49  return std::numeric_limits<T>::quiet_NaN();
50  else
51  return unchecked_hypot(x, y);
52 
53 } // checked_hypot<>(,)
54 
55 // ----------------------------------------------------------------------
56 // hypot<>:
57 
58 template <class T>
59 inline std::enable_if_t<std::is_arithmetic_v<T>, T>
61 {
62  return checked_hypot(x, y);
63 }
64 
65 // ======================================================================
66 
67 #endif /* cetlib_hypot_h */
68 
69 // Local Variables:
70 // mode: c++
71 // End:
std::enable_if_t< std::is_arithmetic_v< T >, T > checked_hypot(T x, T y)
Definition: hypot.h:43
std::enable_if_t< std::is_arithmetic_v< T >, T > unchecked_hypot(T x, T y)
Definition: hypot.h:33
std::enable_if_t< std::is_arithmetic_v< T >, T > hypot(T x, T y)
Definition: hypot.h:60
list x
Definition: train.py:276