diff options
author | Bruce Momjian | 2003-02-13 05:26:50 +0000 |
---|---|---|
committer | Bruce Momjian | 2003-02-13 05:26:50 +0000 |
commit | 80b3513d5700945447815e80a661c719d3e8f044 (patch) | |
tree | d02aa5f05872cb768ca8744b92448b622724e475 /contrib/cube/cube.c | |
parent | f249daf9b7aef0bf0685efb35c159842e8f6df51 (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.c | 85 |
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; +} |