1 /* contrib/cube/cubedata.h */
2 
3 /*
4  * This limit is pretty arbitrary, but don't make it so large that you
5  * risk overflow in sizing calculations.
6  */
7 #define CUBE_MAX_DIM (100)
8 
9 typedef struct NDBOX
10 {
11 	/* varlena header (do not touch directly!) */
12 	int32		vl_len_;
13 
14 	/*----------
15 	 * Header contains info about NDBOX. For binary compatibility with old
16 	 * versions, it is defined as "unsigned int".
17 	 *
18 	 * Following information is stored:
19 	 *
20 	 *	bits 0-7  : number of cube dimensions;
21 	 *	bits 8-30 : unused, initialize to zero;
22 	 *	bit  31   : point flag. If set, the upper right coordinates are not
23 	 *				stored, and are implicitly the same as the lower left
24 	 *				coordinates.
25 	 *----------
26 	 */
27 	unsigned int header;
28 
29 	/*
30 	 * The lower left coordinates for each dimension come first, followed by
31 	 * upper right coordinates unless the point flag is set.
32 	 */
33 	double		x[FLEXIBLE_ARRAY_MEMBER];
34 } NDBOX;
35 
36 /* NDBOX access macros */
37 #define POINT_BIT			0x80000000
38 #define DIM_MASK			0x7fffffff
39 
40 #define IS_POINT(cube)		( ((cube)->header & POINT_BIT) != 0 )
41 #define SET_POINT_BIT(cube) ( (cube)->header |= POINT_BIT )
42 #define DIM(cube)			( (cube)->header & DIM_MASK )
43 #define SET_DIM(cube, _dim) ( (cube)->header = ((cube)->header & ~DIM_MASK) | (_dim) )
44 
45 #define LL_COORD(cube, i) ( (cube)->x[i] )
46 #define UR_COORD(cube, i) ( IS_POINT(cube) ? (cube)->x[i] : (cube)->x[(i) + DIM(cube)] )
47 
48 #define POINT_SIZE(_dim)	(offsetof(NDBOX, x) + sizeof(double)*(_dim))
49 #define CUBE_SIZE(_dim)		(offsetof(NDBOX, x) + sizeof(double)*(_dim)*2)
50 
51 /* fmgr interface macros */
52 #define DatumGetNDBOXP(x)	((NDBOX *) PG_DETOAST_DATUM(x))
53 #define PG_GETARG_NDBOX_P(x)	DatumGetNDBOXP(PG_GETARG_DATUM(x))
54 #define PG_RETURN_NDBOX_P(x)	PG_RETURN_POINTER(x)
55 
56 /* GiST operator strategy numbers */
57 #define CubeKNNDistanceCoord			15	/* ~> */
58 #define CubeKNNDistanceTaxicab			16	/* <#> */
59 #define CubeKNNDistanceEuclid			17	/* <-> */
60 #define CubeKNNDistanceChebyshev		18	/* <=> */
61 
62 /* in cubescan.l */
63 extern int	cube_yylex(void);
64 extern void cube_yyerror(NDBOX **result, const char *message) pg_attribute_noreturn();
65 extern void cube_scanner_init(const char *str);
66 extern void cube_scanner_finish(void);
67 
68 /* in cubeparse.y */
69 extern int	cube_yyparse(NDBOX **result);
70