Skip to content

Commit e367a4b

Browse files
Inverse dependency between xsimd_power and xsimd_scalar
It's good to have xsimd_scalar as standalone as possible.
1 parent e3dbecf commit e367a4b

File tree

2 files changed

+31
-26
lines changed

2 files changed

+31
-26
lines changed

include/xsimd/math/xsimd_power.hpp

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
#include "xsimd_logarithm.hpp"
2020
#include "xsimd_numerical_constant.hpp"
2121

22+
#include "xsimd/math/xsimd_scalar.hpp"
23+
2224
namespace xsimd
2325
{
2426

@@ -85,30 +87,6 @@ namespace xsimd
8587
}
8688
};
8789

88-
template <class T0, class T1>
89-
inline T0
90-
ipow(const T0& t0, const T1& t1)
91-
{
92-
static_assert(std::is_integral<T1>::value, "second argument must be an integer");
93-
T0 a = t0;
94-
T1 b = t1;
95-
bool const recip = b < 0;
96-
T0 r{static_cast<T0>(1)};
97-
while (1)
98-
{
99-
if (b & 1)
100-
{
101-
r *= a;
102-
}
103-
b /= 2;
104-
if (b == 0)
105-
{
106-
break;
107-
}
108-
a *= a;
109-
}
110-
return recip ? 1 / r : r;
111-
}
11290
}
11391

11492
template <class B>

include/xsimd/math/xsimd_scalar.hpp

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,11 +207,38 @@ namespace xsimd
207207
}
208208
#endif
209209

210+
namespace detail {
211+
template <class T0, class T1>
212+
inline T0
213+
ipow(const T0& t0, const T1& t1)
214+
{
215+
static_assert(std::is_integral<T1>::value, "second argument must be an integer");
216+
T0 a = t0;
217+
T1 b = t1;
218+
bool const recip = b < 0;
219+
T0 r{static_cast<T0>(1)};
220+
while (1)
221+
{
222+
if (b & 1)
223+
{
224+
r *= a;
225+
}
226+
b /= 2;
227+
if (b == 0)
228+
{
229+
break;
230+
}
231+
a *= a;
232+
}
233+
return recip ? 1 / r : r;
234+
}
235+
}
236+
210237
template <class T0, class T1>
211238
inline typename std::enable_if<std::is_integral<T1>::value, T0>::type
212239
pow(const T0& t0, const T1& t1)
213240
{
214-
return detail::ipow(t0, t1);
241+
return detail::ipow(t0, t1);
215242
}
216243

217244
template <class T0, class T1>
@@ -226,7 +253,7 @@ namespace xsimd
226253
inline typename std::enable_if<std::is_integral<T1>::value, std::complex<T0>>::type
227254
pow(const std::complex<T0>& t0, const T1& t1)
228255
{
229-
return detail::ipow(t0, t1);
256+
return detail::ipow(t0, t1);
230257
}
231258

232259
template <class T0, class T1>

0 commit comments

Comments
 (0)