#pragma once
#include <complex>
#include <fftw3.h>

using namespace std::complex_literals;

#ifndef QUAD_PRECISION

#define FFTW_PLAN fftw_plan
#define FFTW_ALLOC_COMPLEX fftw_alloc_complex
#define FFTW_IMPORT_WISDOM fftw_import_wisdom_from_filename
#define FFTW_EXPORT_WISDOM fftw_export_wisdom_to_filename
#define FFTW_PLAN_DFT_1D fftw_plan_dft_1d
#define FFTW_DESTROY_PLAN fftw_destroy_plan
#define FFTW_FREE fftw_free
#define FFTW_CLEANUP fftw_cleanup
#define FFTW_EXECUTE fftw_execute
#define FFTW_COMPLEX fftw_complex

using Real = double;

#define II 1i

#else

#define FFTW_PLAN fftwl_plan
#define FFTW_ALLOC_COMPLEX fftwl_alloc_complex
#define FFTW_IMPORT_WISDOM fftwl_import_wisdom_from_filename
#define FFTW_EXPORT_WISDOM fftwl_export_wisdom_to_filename
#define FFTW_PLAN_DFT_1D fftwl_plan_dft_1d
#define FFTW_DESTROY_PLAN fftwl_destroy_plan
#define FFTW_FREE fftwl_free
#define FFTW_CLEANUP fftwl_cleanup
#define FFTW_EXECUTE fftwl_execute
#define FFTW_COMPLEX fftwl_complex

using Real = long double;

#define II 1il

#endif

using Complex = std::complex<Real>;