#ifdef PARKING_EXPORTS
#define PARKING_API __declspec(dllexport)
#else
#define PARKING_API __declspec(dllimport)
#endif

#define PERROR(a) \
    {             \
        LPVOID lpMsgBuf;                                      \
        FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |        \
                   FORMAT_MESSAGE_FROM_SYSTEM |               \
                   FORMAT_MESSAGE_IGNORE_INSERTS, NULL,       \
                   GetLastError(),                            \
                   MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), \
                   (LPTSTR) &lpMsgBuf,0,NULL );               \
        fprintf(stderr,"%s:%s\n",a,lpMsgBuf);                 \
        LocalFree( lpMsgBuf );                                \
    }       

#define PRIMER_AJUSTE 0
#define SIGUIENTE_AJUSTE 1
#define MEJOR_AJUSTE 2
#define PEOR_AJUSTE 3 

struct estadIsticas
{
    unsigned long n;      // Número de coches atendidos completamente
    double m_longitud;
    double m_t_serv;
    double m_delta_llegada;
    double m_t_espera;
    double m_t_retorno_normalizado;
    double m_tamaNo_cola;
    double m_porc_ocupaciOn_memoria;
};

typedef int  (*TIPO_FUNCION_LLEGADA)(int longitud, long t_serv, long t_llegada, long delta_llegada, int color, unsigned long reloj);
typedef void (*TIPO_FUNCION_SALIDA) (int posicion, int longitud, long t_serv, long t_llegada, long delta_llegada, int color, unsigned long reloj);

#ifdef PARKING_EXPORTS
extern "C" PARKING_API BOOL inicio(TIPO_FUNCION_LLEGADA *f_llegadasP, TIPO_FUNCION_SALIDA  *f_salidasP, LONG intervalo, BOOL d);
extern "C" PARKING_API void aparcar(int fila, int pos_final, int longitud, long t_serv, long t_llegada, long delta_llegada, int color);
extern "C" PARKING_API void desaparcar(int fila, int pos_final, int longitud, int color);
extern "C" PARKING_API bool ocupado(int fila, int posicion);
extern "C" PARKING_API bool fin(void);
extern "C" PARKING_API void poner_estadIsticas(struct estadIsticas *estad_programa);
#endif

typedef BOOL (*TIPO_FUNCION_INICIO)(TIPO_FUNCION_LLEGADA *,TIPO_FUNCION_SALIDA *,LONG,BOOL);
typedef void (*TIPO_FUNCION_APARCAR)(int,int,int,long,long,long,int);
typedef void (*TIPO_FUNCION_DESAPARCAR)(int,int,int,int);
typedef bool (*TIPO_FUNCION_OCUPADO)(int,int);
typedef bool (*TIPO_FUNCION_FIN)(void);
typedef void (*TIPO_FUNCION_PONER_ESTADiSTICAS)(struct estadIsticas *);
