kfr

Fast, modern C++ DSP framework, FFT, Sample Rate Conversion, FIR/IIR/Biquad Filters (SSE, AVX, AVX-512, ARM NEON)
Log | Files | Refs | README

commit b4e3aa67ebaaef9aa3384ff1a0d8f61e6184fc2c
parent b73e6eddf98763bbbf37c0ff2af9af17c245f397
Author: samuriddle@gmail.com <samuriddle@gmail.com>
Date:   Mon,  8 Aug 2016 01:22:58 +0300

expression_pack: small fixes

Diffstat:
Minclude/kfr/base/operators.hpp | 19+++++++++++--------
1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/include/kfr/base/operators.hpp b/include/kfr/base/operators.hpp @@ -61,10 +61,10 @@ constexpr inline T add(T x) { return x; } -template <typename T1, typename T2, typename... Ts> -constexpr inline common_type<T1, T2, Ts...> add(T1 x, T2 y, Ts... rest) +template <typename T1, typename T2, typename... Ts, typename Tout = common_type<T1, T2, Ts...>> +constexpr inline Tout add(T1 x, T2 y, Ts... rest) { - return x + add(std::forward<T2>(y), std::forward<Ts>(rest)...); + return static_cast<Tout>(x) + static_cast<Tout>(add(std::forward<T2>(y), std::forward<Ts>(rest)...)); } template <typename T> constexpr inline T add(initialvalue<T>) @@ -676,8 +676,10 @@ namespace internal template <typename... E> struct expression_pack : expression<E...>, output_expression { + constexpr static size_t count = sizeof...(E); + expression_pack(E&&... e) : expression<E...>(std::forward<E>(e)...) {} - using value_type = vec<common_type<value_type_of<E>...>, sizeof...(E)>; + using value_type = vec<common_type<value_type_of<E>...>, count>; using size_type = typename expression<E...>::size_type; constexpr size_type size() const noexcept { return expression<E...>::size(); } @@ -687,16 +689,17 @@ struct expression_pack : expression<E...>, output_expression return this->call(fn_packtranspose(), index, x); } template <typename U, size_t N> - KFR_INLINE void operator()(coutput_t, size_t index, const vec<U, N>& x) + KFR_INLINE void operator()(coutput_t, size_t index, const vec<vec<U, count>, N>& x) { - output(index, x, csizeseq<sizeof...(E)>); + output(index, x, csizeseq<count>); } private: template <typename U, size_t N, size_t... indices> - void output(size_t index, const vec<U, N>& x, csizes_t<indices...>) + void output(size_t index, const vec<vec<U, count>, N>& x, csizes_t<indices...>) { - swallow{ (std::get<indices>(this->args)(coutput, index, x[indices]), void(), 0)... }; + const vec<vec<U, N>, count> xx = compcast<vec<U, N>>(transpose<count>(flatten(x))); + swallow{ (std::get<indices>(this->args)(coutput, index, xx[indices]), void(), 0)... }; } }; }