#ifndef fft2d_DECL_H
#define fft2d_DECL_H

#define MAXSWAPBUF 1

// --- TYPES --- //

#include "dpcm.h"

// rangetype : RangeOne

// rangetype : RangeNP

// rangetype : Range1D

// rangetype : Range2D

// datatype : Int

// datatype : Config

// datatype : File

// datatype : Vector1Dcplx

// datatype : Vector2Dcplx

typedef Partition<RangeOne> PartOne;

typedef Partition<RangeNP> PartNP;

typedef Swap<RangeOne> SwapOne;

typedef Swap<RangeNP> SwapNP;

typedef Partition<Range1D> PartRange1D;

typedef Partition<Range2D> PartRange2D;

typedef Swap<Range2D> SwapRange2D;


// --- FUNCTIONS --- //

void fft_col (Vector2Dcplx &A, Vector1Dcplx &W, Range2D &col, Range1D &r1, 
              Vector2Dcplx &B);

void fft_row (Vector2Dcplx &A, Vector1Dcplx &W, Range2D &row, Range1D &r1, 
              Vector2Dcplx &B);

void negate_im (Vector2Dcplx &A, Range2D &ra, 
                Vector2Dcplx &B);

void pre_fft (Range1D &r1, 
              Vector1Dcplx &W);

void matrix_read (Config &cfg, Range2D &ra, 
                  Vector2Dcplx &A, Vector2Dcplx &R);

void check_equal (Vector2Dcplx &A, Vector2Dcplx &B, Range2D &ra);

void econd (Config &cfg, Int &idx, 
            Int &cond);

void init (Config &cfg, 
           PartRange2D &row, PartRange2D &col, PartRange1D &r1, File &f);

void test (Config &cfg, 
           Env &env);

void fft2d (Vector2Dcplx &A, Vector1Dcplx &W, SwapRange2D &sw_cr, SwapRange2D &sw_rc, PartRange2D &row, PartRange2D &col, PartRange1D &r1, 
            Vector2Dcplx &B, Env &env);

void ifft2d (Vector2Dcplx &A, Vector1Dcplx &W, SwapRange2D &sw_cr, SwapRange2D &sw_rc, PartRange2D &row, PartRange2D &col, PartRange1D &r1, 
             Vector2Dcplx &B, Env &env);


#endif // fft2d_DECL_H

