constexpr typename std::enable_if<N==N_2*2,recarr<T,N>>::type fft_helper(recarr<T,N> v, recarr<T,N_2> rofu) { return cat(zipWith(sum<T>,fft_helper(condense(v), condense(rofu)), zipWith(product<T>,fft_helper(condense(cshift1(v)), condense(rofu)), rofu)), zipWith(sub<T>,fft_helper(condense(v), condense(rofu)), zipWith(product<T>,fft_helper(condense(cshift1(v)), condense(rofu)), rofu))); }
constexpr typename enable_if<sizeof...(Ts)==(2*sizeof...(Us)),tuple<Ts...>>::type fft_helper(tuple<Ts...> v, tuple<Us...> rofu) { typedef typename pack_head<Ts...>::type T; // T is usually cx<double> return cat(zipWith(sum<T>,fft_helper(condense(v), condense(rofu)), zipWith(product<T>,fft_helper(condense(cshift1(v)), condense(rofu)), rofu)), zipWith(sub<T>,fft_helper(condense(v), condense(rofu)), zipWith(product<T>,fft_helper(condense(cshift1(v)), condense(rofu)), rofu))); }
void cshift1_4 (gfc_array_char * ret, const gfc_array_char * array, const gfc_array_i4 * h, const GFC_INTEGER_4 * pwhich) { cshift1 (ret, array, h, pwhich, GFC_DESCRIPTOR_SIZE (array)); }
void cshift1_4_char (gfc_array_char * ret, GFC_INTEGER_4 ret_length __attribute__((unused)), const gfc_array_char * array, const gfc_array_i4 * h, const GFC_INTEGER_4 * pwhich, GFC_INTEGER_4 array_length) { cshift1 (ret, array, h, pwhich, array_length); }