pow.h
Go to the documentation of this file.
1 #ifndef cetlib_pow_h
2 #define cetlib_pow_h
3 
4 // ======================================================================
5 //
6 // pow<>(): Minimal-multiply algorithm for integral non-negative powers
7 //
8 // ======================================================================
9 
10 #include "cetlib_except/exception.h"
11 
12 #include <type_traits>
13 
14 namespace cet {
15 
16  template <unsigned N, class T>
17  constexpr T pow(T x);
18 
19  template <class T>
20  constexpr T
22  {
23  return pow<2u>(x);
24  }
25  template <class T>
26  constexpr T
27  cube(T x)
28  {
29  return pow<3u>(x);
30  }
31  template <class T>
32  constexpr T
34  {
35  return pow<4u>(x);
36  }
37 
38  template <class T>
39  constexpr T diff_of_squares(T x, T y);
40 
41  template <class T>
42  constexpr T sum_of_squares(T x, T y);
43 
44  template <class T>
45  constexpr T sum_of_squares(T x, T y, T z);
46 }
47 
48 namespace cet {
49  namespace detail {
50 
51  template <unsigned N, class T, unsigned = N % 2u>
52  struct pow;
53 
54  template <unsigned N, class T>
55  struct pow<N, T, 0u>;
56 
57  template <unsigned N, class T>
58  struct pow<N, T, 1u>;
59 
60  template <class T>
61  struct pow<0u, T, 0u>;
62 
63  template <class T>
64  struct pow<1u, T, 1u>;
65 
66  template <class T>
67  struct pow<2u, T, 0u>;
68  }
69 } // cet::detail
70 
71 // ----------------------------------------------------------------------
72 
73 template <unsigned N, class T>
74 constexpr T
76 {
77  return detail::pow<N, T>()(x);
78 }
79 
80 // ----------------------------------------------------------------------
81 
82 template <unsigned N, class T>
83 struct cet::detail::pow<N, T, 0u> {
84  pow<N / 2u, T> pow_half;
85  constexpr T
87  {
88  return pow_half(x * x);
89  }
90 }; // pow<N,T,0>
91 
92 template <unsigned N, class T>
93 struct cet::detail::pow<N, T, 1u> {
94  pow<N / 2u, T> pow_half;
95  constexpr T
97  {
98  return x * pow_half(x * x);
99  }
100 }; // pow<N,T,1>
101 
102 template <class T>
103 struct cet::detail::pow<0u, T, 0u> {
104  constexpr T
106  {
107  return (x != 0) ?
108  1 :
109  throw cet::exception("cet::pow") << "pow<0>(0) is indeterminate!";
110  }
111 }; // pow<0,T,0>
112 
113 template <class T>
114 struct cet::detail::pow<1u, T, 1u> {
115  constexpr T
117  {
118  return x;
119  }
120 }; // pow<1,T,1>
121 
122 template <class T>
123 struct cet::detail::pow<2u, T, 0u> {
124  constexpr T
126  {
127  return x * x;
128  }
129 }; // pow<2,T,0>
130 
131 // ----------------------------------------------------------------------
132 
133 template <class T>
134 constexpr T
136 {
137  return (x + y) * (x - y);
138 }
139 
140 template <class T>
141 constexpr T
143 {
144  return square(x) + square(y);
145 }
146 
147 template <class T>
148 constexpr T
150 {
151  return square(x) + square(y) + square(z);
152 }
153 
154 // ======================================================================
155 
156 #endif /* cetlib_pow_h */
157 
158 // Local Variables:
159 // mode: c++
160 // End:
constexpr T operator()(T x)
Definition: pow.h:96
pow< N/2u, T > pow_half
Definition: pow.h:84
constexpr T fourth(T x)
Definition: pow.h:33
constexpr T diff_of_squares(T x, T y)
Definition: pow.h:135
constexpr T sum_of_squares(T x, T y)
Definition: pow.h:142
constexpr T pow(T x)
Definition: pow.h:75
constexpr T operator()(T x)
Definition: pow.h:116
::xsd::cxx::tree::exception< char > exception
Definition: Database.h:225
constexpr T square(T x)
Definition: pow.h:21
constexpr T operator()(T x)
Definition: pow.h:105
constexpr T cube(T x)
Definition: pow.h:27
constexpr T operator()(T x)
Definition: pow.h:86
pow< N/2u, T > pow_half
Definition: pow.h:94
z
Definition: test.py:28
double T
Definition: Xdiff_gwt.C:5
constexpr T operator()(T x)
Definition: pow.h:125