#ifndef UTIL_H
#define UTIL_H

#define FALSE 0
#define TRUE  1

// definições usadas para k*(L)
#define SEM_SOLUCAO -1   // não resolvido ainda
#define HOMOGENEO    0   // resolvido com packing homogêneo
#define B1           1   // resolvido usando a subdivisão B1
#define B2           2   // resolvido usando a subdivisão B2
#define B3           3   // resolvido usando a subdivisão B3
#define B4           4   // resolvido usando a subdivisão B4
#define B5           5   // resolvido usando a subdivisão B5
#define B6           6   // resolvido usando a subdivisão B6
#define B7           7   // resolvido usando a subdivisão B7

// tipos
typedef int indice;
typedef int ponto;
typedef short qtde;
typedef short flag;

// macros
#define SWAP(A,B) {ponto C=A;A=B;B=C;}
#define MAX(A,B)  ((A>B) ? (A):(B))

// funções
ponto fechaEmZ( ponto p );

indice q2i( ponto q0, ponto q1, ponto q2, ponto q3 );

qtde R_lim_sup( ponto x, ponto y );
qtde L_lim_sup( ponto *q );
qtde R_lim_inf( ponto x, ponto y );
qtde L_lim_inf( ponto *q );

void normalizar( ponto *q );

void posicaoPadraoB1( ponto *i, ponto *q, ponto *q1, ponto *q2 );
void posicaoPadraoB2( ponto *i, ponto *q, ponto *q1, ponto *q2 );
void posicaoPadraoB3( ponto *i, ponto *q, ponto *q1, ponto *q2 );
void posicaoPadraoB4( ponto *i, ponto *q, ponto *q1, ponto *q2 );
void posicaoPadraoB5( ponto *i, ponto *q, ponto *q1, ponto *q2 );
void posicaoPadraoB6( ponto *i, ponto *q, ponto *q1, ponto *q2 );
void posicaoPadraoB7( ponto *i, ponto *q, ponto *q1, ponto *q2 );

#endif

