2 * contrib/intarray/_int_tool.c
8 #include "catalog/pg_type.h"
13 /* arguments are assumed sorted & unique-ified */
15 inner_int_contains(ArrayType *a, ArrayType *b)
31 while (i < na && j < nb)
35 else if (da[i] == db[j])
42 break; /* db[j] is not in da */
45 return (n == nb) ? true : false;
48 /* arguments are assumed sorted */
50 inner_int_overlap(ArrayType *a, ArrayType *b)
65 while (i < na && j < nb)
69 else if (da[i] == db[j])
79 inner_int_union(ArrayType *a, ArrayType *b)
86 if (ARRISEMPTY(a) && ARRISEMPTY(b))
87 return new_intArrayType(0);
89 r = copy_intArrayType(b);
91 r = copy_intArrayType(a);
95 int na = ARRNELEMS(a),
103 r = new_intArrayType(na + nb);
108 while (i < na && j < nb)
115 else if (da[i] < db[j])
126 r = resize_intArrayType(r, dr - ARRPTR(r));
129 if (ARRNELEMS(r) > 1)
136 inner_int_inter(ArrayType *a, ArrayType *b)
148 if (ARRISEMPTY(a) || ARRISEMPTY(b))
149 return new_intArrayType(0);
155 r = new_intArrayType(Min(na, nb));
159 while (i < na && j < nb)
163 else if (da[i] == db[j])
165 if (k == 0 || dr[k - 1] != db[j])
177 return new_intArrayType(0);
180 return resize_intArrayType(r, k);
184 rt__int_size(ArrayType *a, float *size)
186 *size = (float) ARRNELEMS(a);
189 /* qsort_arg comparison function for isort() */
191 isort_cmp(const void *a, const void *b, void *arg)
193 int32 aval = *((const int32 *) a);
194 int32 bval = *((const int32 *) b);
202 * Report if we have any duplicates. If there are equal keys, qsort must
203 * compare them at some point, else it wouldn't know whether one should go
204 * before or after the other.
206 *((bool *) arg) = true;
210 /* Sort the given data (len >= 2). Return true if any duplicates found */
212 isort(int32 *a, int len)
216 qsort_arg(a, len, sizeof(int32), isort_cmp, (void *) &r);
220 /* Create a new int array with room for "num" elements */
222 new_intArrayType(int num)
227 /* if no elements, return a zero-dimensional array */
231 r = construct_empty_array(INT4OID);
235 nbytes = ARR_OVERHEAD_NONULLS(1) + sizeof(int) * num;
237 r = (ArrayType *) palloc0(nbytes);
239 SET_VARSIZE(r, nbytes);
241 r->dataoffset = 0; /* marker for no null bitmap */
242 ARR_ELEMTYPE(r) = INT4OID;
243 ARR_DIMS(r)[0] = num;
244 ARR_LBOUND(r)[0] = 1;
250 resize_intArrayType(ArrayType *a, int num)
255 /* if no elements, return a zero-dimensional array */
263 if (num == ARRNELEMS(a))
266 nbytes = ARR_DATA_OFFSET(a) + sizeof(int) * num;
268 a = (ArrayType *) repalloc(a, nbytes);
270 SET_VARSIZE(a, nbytes);
271 /* usually the array should be 1-D already, but just in case ... */
272 for (i = 0; i < ARR_NDIM(a); i++)
274 ARR_DIMS(a)[i] = num;
281 copy_intArrayType(ArrayType *a)
284 int n = ARRNELEMS(a);
286 r = new_intArrayType(n);
287 memcpy(ARRPTR(r), ARRPTR(a), n * sizeof(int32));
291 /* num for compressed key */
293 internal_size(int *a, int len)
298 for (i = 0; i < len; i += 2)
300 if (!i || a[i] != a[i - 1]) /* do not count repeated range */
301 size += (int64) (a[i + 1]) - (int64) (a[i]) + 1;
304 if (size > (int64) INT_MAX || size < (int64) INT_MIN)
305 return -1; /* overflow */
309 /* unique-ify elements of r in-place ... r must be sorted already */
311 _int_unique(ArrayType *r)
316 int num = ARRNELEMS(r);
321 data = tmp = dr = ARRPTR(r);
322 while (tmp - data < num)
329 return resize_intArrayType(r, dr + 1 - ARRPTR(r));
333 gensign(BITVEC sign, int *a, int len)
337 /* we assume that the sign vector is previously zeroed */
338 for (i = 0; i < len; i++)
346 intarray_match_first(ArrayType *a, int32 elem)
355 for (i = 0; i < c; i++)
362 intarray_add_elem(ArrayType *a, int32 elem)
370 result = new_intArrayType(c + 1);
373 memcpy(r, ARRPTR(a), c * sizeof(int32));
379 intarray_concat_arrays(ArrayType *a, ArrayType *b)
382 int32 ac = ARRNELEMS(a);
383 int32 bc = ARRNELEMS(b);
387 result = new_intArrayType(ac + bc);
389 memcpy(ARRPTR(result), ARRPTR(a), ac * sizeof(int32));
391 memcpy(ARRPTR(result) + ac, ARRPTR(b), bc * sizeof(int32));
396 int_to_intset(int32 n)
401 result = new_intArrayType(1);
408 compASC(const void *a, const void *b)
410 if (*(const int32 *) a == *(const int32 *) b)
412 return (*(const int32 *) a > *(const int32 *) b) ? 1 : -1;
416 compDESC(const void *a, const void *b)
418 if (*(const int32 *) a == *(const int32 *) b)
420 return (*(const int32 *) a < *(const int32 *) b) ? 1 : -1;