7#ifndef KIS_XSIMD_GENERIC_HPP
8#define KIS_XSIMD_GENERIC_HPP
21template<
typename V,
typename T,
typename A>
25 [](
float i) ->
float {
26 if (std::numeric_limits<V>::min() > i) {
28 }
else if (std::numeric_limits<V>::max() < i) {
31 return static_cast<V
>(i);
38template<
typename T,
typename A>
39inline auto set_zero(
const batch<T, A> &src,
const batch_bool<T, A> &mask)
noexcept
41 return xsimd::select(mask, xsimd::batch<T, A>(0), src);
45template<
typename T,
typename A>
46inline auto set_one(
const batch<T, A> &src,
const batch_bool<T, A> &mask)
noexcept
48 return xsimd::select(mask, xsimd::batch<T, A>(1), src);
56template<
typename T,
typename T2>
60 [&](
size_t i,
typename T::value_type) {
61 return static_cast<typename T::value_type
>(src[i]);
71template<
typename T,
typename A>
74 using T_v = batch<T, A>;
80template<
size_t value,
size_t... values>
81constexpr typename std::enable_if<
sizeof...(values) == 0,
size_t>::type
max()
87template<
size_t value,
size_t... values>
88constexpr typename std::enable_if<
sizeof...(values) != 0,
size_t>::type
max()
90 return std::max(
value, max<values...>());
95template<
typename T,
typename A>
106 return xsimd::aligned_free(
const_cast<T *
>(ptr));
116inline std::pair<V, V>
interleave(
const V &a,
const V &b)
noexcept
118 return {xsimd::zip_lo(a, b), xsimd::zip_hi(a, b)};
125template<
typename T,
typename A>
126inline batch<T, A>
pow2 (batch<T, A>
const& self)
noexcept
131#if XSIMD_VERSION_MAJOR <= 10
133template <
class B,
class T,
class A>
136 return bitwise_cast<batch<B, A>>(x);
141template <
class B,
class T,
class A>
144 return bitwise_cast<B>(x);
float value(const T *src, size_t ch)
batch< T, A > apply_with_index_and_value(F &&func, batch< T, A > const &self) noexcept
batch< T, A > apply_with_value(F &&func, batch< T, A > const &self) noexcept
std::pair< V, V > interleave(const V &a, const V &b) noexcept
T * vector_aligned_malloc(size_t sz) noexcept
auto set_one(const batch< T, A > &src, const batch_bool< T, A > &mask) noexcept
batch< T, A > pow2(batch< T, A > const &self) noexcept
auto set_zero(const batch< T, A > &src, const batch_bool< T, A > &mask) noexcept
constexpr std::enable_if< sizeof...(values)==0, size_t >::type max()
void vector_aligned_free(const T *ptr) noexcept
T * aligned_malloc(size_t size) noexcept
batch< T, A > truncate_to_type(xsimd::batch< T, A > const &self) noexcept
batch< B, A > bitwise_cast_compat(batch< T, A > const &x) noexcept
T load_and_extend(const T2 *src) noexcept