diff options
Diffstat (limited to 'src/backend/utils/adt/arrayutils.c')
-rw-r--r-- | src/backend/utils/adt/arrayutils.c | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/backend/utils/adt/arrayutils.c b/src/backend/utils/adt/arrayutils.c new file mode 100644 index 00000000000..9a16b950f2b --- /dev/null +++ b/src/backend/utils/adt/arrayutils.c @@ -0,0 +1,111 @@ +/*------------------------------------------------------------------------- + * + * arrayutils.c-- + * This file contains some support routines required for array functions. + * + * Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * $Header: /cvsroot/pgsql/src/backend/utils/adt/arrayutils.c,v 1.1.1.1 1996/07/09 06:22:03 scrappy Exp $ + * + *------------------------------------------------------------------------- + */ + +#define WEAK_C_OPTIMIZER + +#include "c.h" + +int +GetOffset(int n, int dim[], int lb[], int indx[]) +{ + int i, scale, offset; + for (i = n-1, scale = 1, offset = 0; i >= 0; scale*=dim[i--]) + offset += (indx[i] - lb[i])*scale; + return offset ; +} + +int +getNitems(int n, int a[]) +{ + int i, ret; + for (i = 0, ret = 1; i < n; ret *= a[i++]); + if (n == 0) ret = 0; + return ret; +} + +int +compute_size(int st[], int endp[], int n, int base) +{ + int i, ret; + for (i = 0, ret = base; i < n; i++) + ret *= (endp[i] - st[i] + 1); + return ret; +} + +void +mda_get_offset_values(int n, int dist[], int PC[], int span[]) +{ + int i, j; + for (j = n-2, dist[n-1]=0; j >= 0; j--) + for (i = j+1, dist[j] = PC[j]-1; i < n; + dist[j] -= (span[i] - 1)*PC[i], i++); +} + +void +mda_get_range(int n, int span[], int st[], int endp[]) +{ + int i; + for (i= 0; i < n; i++) + span[i] = endp[i] - st[i] + 1; +} + +void +mda_get_prod(int n, int range[], int P[]) +{ + int i; + for (i= n-2, P[n-1] = 1; i >= 0; i--) + P[i] = P[i+1] * range[i + 1]; +} + +int +tuple2linear(int n, int tup[], int scale[]) +{ + int i, lin; + for (i= lin = 0; i < n; i++) + lin += tup[i]*scale[i]; + return lin; +} + +void +array2chunk_coord(int n, int C[], int a_coord[], int c_coord[]) +{ + int i; + for (i= 0; i < n; i++) + c_coord[i] = a_coord[i]/C[i]; +} + +/*----------------------------------------------------------------------------- + generates the tuple that is lexicographically one greater than the current + n-tuple in "curr", with the restriction that the i-th element of "curr" is + less than the i-th element of "span". + RETURNS 0 if no next tuple exists + 1 otherwise + -----------------------------------------------------------------------------*/ +int +next_tuple(int n, int curr[], int span[]) +{ + int i; + + if (!n) return(-1); + curr[n-1] = (curr[n-1]+1)%span[n-1]; + for (i = n-1; i*(!curr[i]); i--) + curr[i-1] = (curr[i-1]+1)%span[i-1]; + + if (i) + return(i); + if (curr[0]) + return(0); + return(-1); +} + |