From 913949e92b1145adc9eb674aefa638b074226d67 Mon Sep 17 00:00:00 2001 From: Martin Reinecke Date: Fri, 19 Jul 2019 18:50:32 +0200 Subject: [PATCH] capture constexpr cdim again to work around an MSVC bug --- pocketfft_hdronly.h | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/pocketfft_hdronly.h b/pocketfft_hdronly.h index f507572..8d144c8 100644 --- a/pocketfft_hdronly.h +++ b/pocketfft_hdronly.h @@ -538,7 +538,7 @@ template void pass2 (size_t ido, size_t l1, auto CH = [ch,ido,l1](size_t a, size_t b, size_t c) -> T& { return ch[a+ido*(b+l1*c)]; }; - auto CC = [cc,ido](size_t a, size_t b, size_t c) -> const T& + auto CC = [cc,ido,cdim](size_t a, size_t b, size_t c) -> const T& { return cc[a+ido*(b+cdim*c)]; }; auto WA = [wa, ido](size_t x, size_t i) { return wa[i-1+x*(ido-1)]; }; @@ -592,7 +592,7 @@ template void pass3 (size_t ido, size_t l1, auto CH = [ch,ido,l1](size_t a, size_t b, size_t c) -> T& { return ch[a+ido*(b+l1*c)]; }; - auto CC = [cc,ido](size_t a, size_t b, size_t c) -> const T& + auto CC = [cc,ido,cdim](size_t a, size_t b, size_t c) -> const T& { return cc[a+ido*(b+cdim*c)]; }; auto WA = [wa, ido](size_t x, size_t i) { return wa[i-1+x*(ido-1)]; }; @@ -630,7 +630,7 @@ template void pass4 (size_t ido, size_t l1, auto CH = [ch,ido,l1](size_t a, size_t b, size_t c) -> T& { return ch[a+ido*(b+l1*c)]; }; - auto CC = [cc,ido](size_t a, size_t b, size_t c) -> const T& + auto CC = [cc,ido,cdim](size_t a, size_t b, size_t c) -> const T& { return cc[a+ido*(b+cdim*c)]; }; auto WA = [wa, ido](size_t x, size_t i) { return wa[i-1+x*(ido-1)]; }; @@ -712,7 +712,7 @@ template void pass5 (size_t ido, size_t l1, auto CH = [ch,ido,l1](size_t a, size_t b, size_t c) -> T& { return ch[a+ido*(b+l1*c)]; }; - auto CC = [cc,ido](size_t a, size_t b, size_t c) -> const T& + auto CC = [cc,ido,cdim](size_t a, size_t b, size_t c) -> const T& { return cc[a+ido*(b+cdim*c)]; }; auto WA = [wa, ido](size_t x, size_t i) { return wa[i-1+x*(ido-1)]; }; @@ -786,7 +786,7 @@ template void pass7(size_t ido, size_t l1, auto CH = [ch,ido,l1](size_t a, size_t b, size_t c) -> T& { return ch[a+ido*(b+l1*c)]; }; - auto CC = [cc,ido](size_t a, size_t b, size_t c) -> const T& + auto CC = [cc,ido,cdim](size_t a, size_t b, size_t c) -> const T& { return cc[a+ido*(b+cdim*c)]; }; auto WA = [wa, ido](size_t x, size_t i) { return wa[i-1+x*(ido-1)]; }; @@ -850,7 +850,7 @@ template void pass8 (size_t ido, size_t l1, auto CH = [ch,ido,l1](size_t a, size_t b, size_t c) -> T& { return ch[a+ido*(b+l1*c)]; }; - auto CC = [cc,ido](size_t a, size_t b, size_t c) -> const T& + auto CC = [cc,ido,cdim](size_t a, size_t b, size_t c) -> const T& { return cc[a+ido*(b+cdim*c)]; }; auto WA = [wa, ido](size_t x, size_t i) { return wa[i-1+x*(ido-1)]; }; @@ -978,7 +978,7 @@ template void pass11 (size_t ido, size_t l1, auto CH = [ch,ido,l1](size_t a, size_t b, size_t c) -> T& { return ch[a+ido*(b+l1*c)]; }; - auto CC = [cc,ido](size_t a, size_t b, size_t c) -> const T& + auto CC = [cc,ido,cdim](size_t a, size_t b, size_t c) -> const T& { return cc[a+ido*(b+cdim*c)]; }; auto WA = [wa, ido](size_t x, size_t i) { return wa[i-1+x*(ido-1)]; }; @@ -1297,7 +1297,7 @@ template void radf2 (size_t ido, size_t l1, auto WA = [wa,ido](size_t x, size_t i) { return wa[i+x*(ido-1)]; }; auto CC = [cc,ido,l1](size_t a, size_t b, size_t c) -> const T& { return cc[a+ido*(b+l1*c)]; }; - auto CH = [ch,ido](size_t a, size_t b, size_t c) -> T& + auto CH = [ch,ido,cdim](size_t a, size_t b, size_t c) -> T& { return ch[a+ido*(b+cdim*c)]; }; for (size_t k=0; k void radf3(size_t ido, size_t l1, auto WA = [wa,ido](size_t x, size_t i) { return wa[i+x*(ido-1)]; }; auto CC = [cc,ido,l1](size_t a, size_t b, size_t c) -> const T& { return cc[a+ido*(b+l1*c)]; }; - auto CH = [ch,ido](size_t a, size_t b, size_t c) -> T& + auto CH = [ch,ido,cdim](size_t a, size_t b, size_t c) -> T& { return ch[a+ido*(b+cdim*c)]; }; for (size_t k=0; k void radf4(size_t ido, size_t l1, auto WA = [wa,ido](size_t x, size_t i) { return wa[i+x*(ido-1)]; }; auto CC = [cc,ido,l1](size_t a, size_t b, size_t c) -> const T& { return cc[a+ido*(b+l1*c)]; }; - auto CH = [ch,ido](size_t a, size_t b, size_t c) -> T& + auto CH = [ch,ido,cdim](size_t a, size_t b, size_t c) -> T& { return ch[a+ido*(b+cdim*c)]; }; for (size_t k=0; k void radf5(size_t ido, size_t l1, auto WA = [wa,ido](size_t x, size_t i) { return wa[i+x*(ido-1)]; }; auto CC = [cc,ido,l1](size_t a, size_t b, size_t c) -> const T& { return cc[a+ido*(b+l1*c)]; }; - auto CH = [ch,ido](size_t a, size_t b, size_t c) -> T& + auto CH = [ch,ido,cdim](size_t a, size_t b, size_t c) -> T& { return ch[a+ido*(b+cdim*c)]; }; for (size_t k=0; k void radb2(size_t ido, size_t l1, constexpr size_t cdim=2; auto WA = [wa,ido](size_t x, size_t i) { return wa[i+x*(ido-1)]; }; - auto CC = [cc,ido](size_t a, size_t b, size_t c) -> const T& + auto CC = [cc,ido,cdim](size_t a, size_t b, size_t c) -> const T& { return cc[a+ido*(b+cdim*c)]; }; auto CH = [ch,ido,l1](size_t a, size_t b, size_t c) -> T& { return ch[a+ido*(b+l1*c)]; }; @@ -1660,7 +1660,7 @@ template void radb3(size_t ido, size_t l1, constexpr T0 taur=-0.5, taui=T0(0.8660254037844386467637231707529362L); auto WA = [wa,ido](size_t x, size_t i) { return wa[i+x*(ido-1)]; }; - auto CC = [cc,ido](size_t a, size_t b, size_t c) -> const T& + auto CC = [cc,ido,cdim](size_t a, size_t b, size_t c) -> const T& { return cc[a+ido*(b+cdim*c)]; }; auto CH = [ch,ido,l1](size_t a, size_t b, size_t c) -> T& { return ch[a+ido*(b+l1*c)]; }; @@ -1701,7 +1701,7 @@ template void radb4(size_t ido, size_t l1, constexpr T0 sqrt2=T0(1.414213562373095048801688724209698L); auto WA = [wa,ido](size_t x, size_t i) { return wa[i+x*(ido-1)]; }; - auto CC = [cc,ido](size_t a, size_t b, size_t c) -> const T& + auto CC = [cc,ido,cdim](size_t a, size_t b, size_t c) -> const T& { return cc[a+ido*(b+cdim*c)]; }; auto CH = [ch,ido,l1](size_t a, size_t b, size_t c) -> T& { return ch[a+ido*(b+l1*c)]; }; @@ -1757,7 +1757,7 @@ template void radb5(size_t ido, size_t l1, ti12= T0(0.5877852522924731291687059546390728L); auto WA = [wa,ido](size_t x, size_t i) { return wa[i+x*(ido-1)]; }; - auto CC = [cc,ido](size_t a, size_t b, size_t c) -> const T& + auto CC = [cc,ido,cdim](size_t a, size_t b, size_t c) -> const T& { return cc[a+ido*(b+cdim*c)]; }; auto CH = [ch,ido,l1](size_t a, size_t b, size_t c) -> T& { return ch[a+ido*(b+l1*c)]; }; @@ -2425,6 +2425,8 @@ template class T_dct3 template class T_dct4 { + // even length algorithm from + // https://www.appletonaudio.com/blog/2013/derivation-of-fast-dct-4-algorithm-based-on-dft/ private: size_t N; T_dct2 dct2; -- GitLab