#ifndef ft_sl_DECL_H
#define ft_sl_DECL_H

#define MAXSWAPBUF 2
#define MAXSWAPNO  8
#define MAXREXNO   1

// --- TYPES --- //

#include "dpcm.h"

// rangetype : RangeOne

// rangetype : RangeNP

// rangetype : Range3D

// datatype : Setup

// datatype : Checksums

// datatype : Int

// datatype : Bool

// datatype : Cplx

// datatype : Vector3Dcplx

// datatype : ArrayCplx

typedef Partition<RangeOne> PartOne;

typedef Partition<RangeNP> PartNP;

typedef Swap<RangeOne> SwapOne;

typedef Swap<RangeNP> SwapNP;

typedef Partition<Range3D> PartRange3D;

typedef MPartition<Range3D> MPartRange3D;

typedef MSwap<Range3D> MSwapRange3D;


// --- FUNCTIONS --- //

void fft (Vector3Dcplx &A, 
          Vector3Dcplx &D, Env &env);

void ifft (Vector3Dcplx &A, 
           Vector3Dcplx &D, Env &env);

void checksum (Int &iter, Vector3Dcplx &x, Checksums &cksum, PartRange3D &dom, 
               Checksums &cksum2, Env &env);

void mainloop (
               Bool &success, Env &env);

void evolve (Setup &sp, Int &idx, Vector3Dcplx &u0, Range3D &dom, 
             Vector3Dcplx &u1);

void cffts1 (Setup &sp, Int &dir, Vector3Dcplx &A, Range3D &dom 
             /* Vector3Dcplx &A* */);

void cffts2 (Setup &sp, Int &dir, Vector3Dcplx &A, Range3D &dom 
             /* Vector3Dcplx &A* */);

void cffts3 (Setup &sp, Int &dir, Vector3Dcplx &A, Range3D &dom 
             /* Vector3Dcplx &A* */);

void sumproc (ArrayCplx &arr, RangeNP &ra, 
              Cplx &res);

void checksum_dom (Vector3Dcplx &x, Range3D &dom, 
                   Cplx &res);

void checksum_set (Setup &sp, Cplx &res, Int &iter, Checksums &cksum 
                   /* Checksums &cksum* */);

void init_checksums (Setup &sp, 
                     Checksums &cks);

void compute_init_cond (Setup &sp, Range3D &dom, 
                        Vector3Dcplx &u0);

void econd (Int &max, Int &idx, 
            Int &cond);

void verify (Setup &sp, Checksums &cks, 
             Bool &success);


#endif // ft_sl_DECL_H

