summaryrefslogtreecommitdiff
path: root/contrib/cube/cube.c
diff options
context:
space:
mode:
authorBruce Momjian2003-02-13 05:26:50 +0000
committerBruce Momjian2003-02-13 05:26:50 +0000
commit80b3513d5700945447815e80a661c719d3e8f044 (patch)
treed02aa5f05872cb768ca8744b92448b622724e475 /contrib/cube/cube.c
parentf249daf9b7aef0bf0685efb35c159842e8f6df51 (diff)
The attached patch provides cube with 4 functions for building cubes
directly from float8 values. (As opposed to converting the values to strings and then parsing the strings.) The functions are: cube(float8) returns cube cube(float8,float8) returns cube cube(cube,float8) returns cube cube(cube,float8,float8) returns cube Bruno Wolff III
Diffstat (limited to 'contrib/cube/cube.c')
-rw-r--r--contrib/cube/cube.c85
1 files changed, 82 insertions, 3 deletions
diff --git a/contrib/cube/cube.c b/contrib/cube/cube.c
index d24d0f55932..b46eb35d3cd 100644
--- a/contrib/cube/cube.c
+++ b/contrib/cube/cube.c
@@ -30,6 +30,13 @@ extern int cube_yyparse();
NDBOX *cube_in(char *str);
NDBOX *cube(text *str);
char *cube_out(NDBOX * cube);
+NDBOX *cube_f8(double *);
+NDBOX *cube_f8_f8(double *, double *);
+NDBOX *cube_c_f8(NDBOX *, double *);
+NDBOX *cube_c_f8_f8(NDBOX *, double *, double *);
+int4 cube_dim(NDBOX * a);
+double *cube_ll_coord(NDBOX * a, int4 n);
+double *cube_ur_coord(NDBOX * a, int4 n);
/*
@@ -73,9 +80,6 @@ bool cube_right(NDBOX * a, NDBOX * b);
bool cube_lt(NDBOX * a, NDBOX * b);
bool cube_gt(NDBOX * a, NDBOX * b);
double *cube_distance(NDBOX * a, NDBOX * b);
-int4 cube_dim(NDBOX * a);
-double *cube_ll_coord(NDBOX * a, int4 n);
-double *cube_ur_coord(NDBOX * a, int4 n);
bool cube_is_point(NDBOX * a);
NDBOX *cube_enlarge(NDBOX * a, double *r, int4 n);
@@ -1226,3 +1230,78 @@ cube_enlarge(NDBOX * a, double *r, int4 n)
}
return result;
}
+
+/* Create a one dimensional box with identical upper and lower coordinates */
+NDBOX *
+cube_f8(double *x1)
+{
+ NDBOX *result;
+ int size;
+ size = offsetof(NDBOX, x[0]) + sizeof(double) * 2;
+ result = (NDBOX *) palloc(size);
+ memset(result, 0, size);
+ result->size = size;
+ result->dim = 1;
+ result->x[0] = *x1;
+ result->x[1] = *x1;
+ return result;
+}
+
+/* Create a one dimensional box */
+NDBOX *
+cube_f8_f8(double *x1, double *x2)
+{
+ NDBOX *result;
+ int size;
+ size = offsetof(NDBOX, x[0]) + sizeof(double) * 2;
+ result = (NDBOX *) palloc(size);
+ memset(result, 0, size);
+ result->size = size;
+ result->dim = 1;
+ result->x[0] = *x1;
+ result->x[1] = *x2;
+ return result;
+}
+
+/* Add a dimension to an existing cube with the same values for the new
+ coordinate */
+NDBOX *
+cube_c_f8(NDBOX *c, double *x1)
+{
+ NDBOX *result;
+ int size;
+ int i;
+ size = offsetof(NDBOX, x[0]) + sizeof(double) * (c->dim + 1) * 2;
+ result = (NDBOX *) palloc(size);
+ memset(result, 0, size);
+ result->size = size;
+ result->dim = c->dim + 1;
+ for (i = 0; i < c->dim; i++) {
+ result->x[i] = c->x[i];
+ result->x[result->dim + i] = c->x[c->dim + i];
+ }
+ result->x[result->dim - 1] = *x1;
+ result->x[2 * result->dim - 1] = *x1;
+ return result;
+}
+
+/* Add a dimension to an existing cube */
+NDBOX *
+cube_c_f8_f8(NDBOX *c, double *x1, double *x2)
+{
+ NDBOX *result;
+ int size;
+ int i;
+ size = offsetof(NDBOX, x[0]) + sizeof(double) * (c->dim + 1) * 2;
+ result = (NDBOX *) palloc(size);
+ memset(result, 0, size);
+ result->size = size;
+ result->dim = c->dim + 1;
+ for (i = 0; i < c->dim; i++) {
+ result->x[i] = c->x[i];
+ result->x[result->dim + i] = c->x[c->dim + i];
+ }
+ result->x[result->dim - 1] = *x1;
+ result->x[2 * result->dim - 1] = *x2;
+ return result;
+}