#pragma once

//------------------------- Jikan-config ---------------------------------------------
#define TIMER_ON
#define INCLUDE_GPU_TIMER
#define INCLUDE_MPI
#define INCLUDE_OPEN_MP
#define SAVE_TIME_SERIES

#define OUTPUT_NAME "Jikan-output"
//------------------------------------------------------------------------------------

#ifdef INCLUDE_MPI
        #include <mpi.h>
#endif 

enum TimerMode
{
    NO_SYNC =  0x01,
    MPI_mode =    0x02,
    OpenMP_mode = 0x03,
    CUDA_mode =   0x04,

    MPI_OpenMP       = MPI_mode * OpenMP_mode,
    OpenMP_CUDA      = CUDA_mode * OpenMP_mode,
    MPI_OpenMP_CUDA  = MPI_mode * OpenMP_mode * CUDA_mode,
    MPI_CUDA         = MPI_mode * CUDA_mode,
};

#ifdef __cplusplus
extern "C" {  
#endif         

        void TimerStart(const char* name, const int& mode_t);
        void TimerEnd(const char* name);
        void WriteOutput();
        
#ifdef TIMER_ON
        #define START_JIKAN_TIMER(name, mode_t) TimerStart(name, mode_t);
        #define END_JIKAN_TIMER(name)           TimerEnd(name);
        #define JIKAN_TIMER_OUTPUT() WriteOutput();
#else
        #define START_JIKAN_TIMER(name)
        #define END_JIKAN_TIMER(name)
        #define JIKAN_TIMER_OUTPUT()
#endif 

#ifdef __cplusplus  
} 
#endif