// *****************************************************************************
// File: typedefs.h
// Global types and constants.
// *****************************************************************************

#ifndef __TYPEDEFS
#define __TYPEDEFS

#define DIM		2
#define NAMELEN		256
#define NULL_PAGE	0L
#define NULL_ID         -1L
#define INT_ROOT	0L
#define PERMS		0666
#define RELEPS          0.0005  // Relative epsilon (mainly used in geometr.cc)
#define EPS             0.000001// used in sphere-line & point-line pos determ.
#ifdef  OVERLAY
#define PAGE_SIZE	1024 // Size of node
#else
#define PAGE_SIZE	4096 // Size of node
#endif
#define MAX		((PAGE_SIZE-sizeof(int))/sizeof(r_entry))
#define UNUSED		(PAGE_SIZE - sizeof(int) - MAX*sizeof(r_entry))
#define SMAX		(((PAGE_SIZE - ((DIM+3)*sizeof(short) + sizeof(coord) + sizeof(point)))/sizeof(s_entry)) -1)
#define SUNUSED		((PAGE_SIZE - ((DIM+3)*sizeof(short) + sizeof(coord) + sizeof(point))) - (SMAX+1)*sizeof(s_entry))
#define KMAXL		((PAGE_SIZE-sizeof(int))/sizeof(s_entry))
#define KMAXN		((PAGE_SIZE-sizeof(int))/sizeof(k_entry))
#define KUNUSEDL	(PAGE_SIZE - sizeof(int) - KMAXL*sizeof(s_entry))
#define KUNUSEDN	(PAGE_SIZE - sizeof(int) - KMAXN*sizeof(k_entry))
#ifdef  OVERLAY
#define GROW_PAGES	1024   // Nr of pages the tree is extended
#else
#define GROW_PAGES	(8192/PAGE_SIZE)   // Nr of pages the tree is extended
#endif
                                         // when it becomes too small.

#ifndef PI
#define PI              3.1415926535897932384626434
#endif
#define c_area(x)       (PI*(x)*(x))
#define sqr(x)		((x)*(x))

typedef enum {line, area} otype;
typedef enum {false = 0, true = 1} boolean;
typedef enum {left = 0, right = 1} side_type;
typedef enum {read_data, init_data} node_operation;
typedef enum {LEFT, RIGHT, IN, OUT} line_situation;

typedef float           coord;
typedef coord		point[DIM];
typedef double		double_point[DIM];
typedef double		Matrix33[3][3];
typedef unsigned long	Pixel;

// Used in R-tree for all nodes.
typedef struct r_entry {
   long			id;
   point		mbr[2];
};

// Used in S-tree for all nodes. And used in K-tree for leaf nodes (only).
typedef struct s_entry { 
   long			id;
   point		c;
   coord		r;
};

// Used in K-tree for internal nodes (only).
typedef struct k_entry {
   long                 id[2];	// Pointers to left/right child.
   point                n;	// Definition of parallel left/right
   coord                c[2];	// split hyperplanes.
};

struct object_type {
   otype		type;
   point		*pts;
   int			nrofpoints;
};

#endif
