#include "postgres.h"
#include "catalog/pg_type.h"
#include "_int.h"
Go to the source code of this file.
Functions | |
bool | inner_int_contains (ArrayType *a, ArrayType *b) |
bool | inner_int_overlap (ArrayType *a, ArrayType *b) |
ArrayType * | inner_int_union (ArrayType *a, ArrayType *b) |
ArrayType * | inner_int_inter (ArrayType *a, ArrayType *b) |
void | rt__int_size (ArrayType *a, float *size) |
bool | isort (int32 *a, int len) |
ArrayType * | new_intArrayType (int num) |
ArrayType * | resize_intArrayType (ArrayType *a, int num) |
ArrayType * | copy_intArrayType (ArrayType *a) |
int | internal_size (int *a, int len) |
ArrayType * | _int_unique (ArrayType *r) |
void | gensign (BITVEC sign, int *a, int len) |
int32 | intarray_match_first (ArrayType *a, int32 elem) |
ArrayType * | intarray_add_elem (ArrayType *a, int32 elem) |
ArrayType * | intarray_concat_arrays (ArrayType *a, ArrayType *b) |
ArrayType * | int_to_intset (int32 n) |
int | compASC (const void *a, const void *b) |
int | compDESC (const void *a, const void *b) |
Definition at line 293 of file _int_tool.c.
References ARRNELEMS, ARRPTR, and resize_intArrayType().
Referenced by g_int_union(), inner_int_union(), intset_subtract(), intset_union_elem(), and uniq().
{ int *tmp, *dr, *data; int num = ARRNELEMS(r); if (num < 2) return r; data = tmp = dr = ARRPTR(r); while (tmp - data < num) { if (*tmp != *dr) *(++dr) = *tmp++; else tmp++; } return resize_intArrayType(r, dr + 1 - ARRPTR(r)); }
int compASC | ( | const void * | a, | |
const void * | b | |||
) |
int compDESC | ( | const void * | a, | |
const void * | b | |||
) |
Definition at line 265 of file _int_tool.c.
References ARRNELEMS, ARRPTR, and new_intArrayType().
Referenced by g_int_picksplit(), and inner_int_union().
void gensign | ( | BITVEC | sign, | |
int * | a, | |||
int | len | |||
) |
Definition at line 13 of file _int_tool.c.
References ARRNELEMS, ARRPTR, i, and TRUE.
Referenced by _int_contains(), and g_int_consistent().
Definition at line 134 of file _int_tool.c.
References ARRISEMPTY, ARRNELEMS, ARRPTR, i, Min, new_intArrayType(), pfree(), and resize_intArrayType().
Referenced by _int_inter(), and g_int_picksplit().
{ ArrayType *r; int na, nb; int *da, *db, *dr; int i, j, k; if (ARRISEMPTY(a) || ARRISEMPTY(b)) return new_intArrayType(0); na = ARRNELEMS(a); nb = ARRNELEMS(b); da = ARRPTR(a); db = ARRPTR(b); r = new_intArrayType(Min(na, nb)); dr = ARRPTR(r); i = j = k = 0; while (i < na && j < nb) { if (da[i] < db[j]) i++; else if (da[i] == db[j]) { if (k == 0 || dr[k - 1] != db[j]) dr[k++] = db[j]; i++; j++; } else j++; } if (k == 0) { pfree(r); return new_intArrayType(0); } else return resize_intArrayType(r, k); }
Definition at line 48 of file _int_tool.c.
References ARRNELEMS, ARRPTR, and i.
Referenced by _int_overlap(), and g_int_consistent().
Definition at line 77 of file _int_tool.c.
References _int_unique(), ARRISEMPTY, ARRNELEMS, ARRPTR, CHECKARRVALID, copy_intArrayType(), i, new_intArrayType(), and resize_intArrayType().
Referenced by _int_union(), g_int_penalty(), and g_int_picksplit().
{ ArrayType *r = NULL; CHECKARRVALID(a); CHECKARRVALID(b); if (ARRISEMPTY(a) && ARRISEMPTY(b)) return new_intArrayType(0); if (ARRISEMPTY(a)) r = copy_intArrayType(b); if (ARRISEMPTY(b)) r = copy_intArrayType(a); if (!r) { int na = ARRNELEMS(a), nb = ARRNELEMS(b); int *da = ARRPTR(a), *db = ARRPTR(b); int i, j, *dr; r = new_intArrayType(na + nb); dr = ARRPTR(r); /* union */ i = j = 0; while (i < na && j < nb) { if (da[i] == db[j]) { *dr++ = da[i++]; j++; } else if (da[i] < db[j]) *dr++ = da[i++]; else *dr++ = db[j++]; } while (i < na) *dr++ = da[i++]; while (j < nb) *dr++ = db[j++]; r = resize_intArrayType(r, dr - ARRPTR(r)); } if (ARRNELEMS(r) > 1) r = _int_unique(r); return r; }
Definition at line 378 of file _int_tool.c.
References ARRPTR, and new_intArrayType().
Referenced by intset().
{ ArrayType *result; int32 *aa; result = new_intArrayType(1); aa = ARRPTR(result); aa[0] = n; return result; }
Definition at line 344 of file _int_tool.c.
References ARRNELEMS, ARRPTR, CHECKARRVALID, and new_intArrayType().
Referenced by intarray_push_elem(), and intset_union_elem().
{ ArrayType *result; int32 *r; int32 c; CHECKARRVALID(a); c = ARRNELEMS(a); result = new_intArrayType(c + 1); r = ARRPTR(result); if (c > 0) memcpy(r, ARRPTR(a), c * sizeof(int32)); r[c] = elem; return result; }
Definition at line 361 of file _int_tool.c.
References ARRNELEMS, ARRPTR, CHECKARRVALID, and new_intArrayType().
Referenced by intarray_push_array().
{ ArrayType *result; int32 ac = ARRNELEMS(a); int32 bc = ARRNELEMS(b); CHECKARRVALID(a); CHECKARRVALID(b); result = new_intArrayType(ac + bc); if (ac) memcpy(ARRPTR(result), ARRPTR(a), ac * sizeof(int32)); if (bc) memcpy(ARRPTR(result) + ac, ARRPTR(b), bc * sizeof(int32)); return result; }
Definition at line 328 of file _int_tool.c.
References ARRNELEMS, ARRPTR, CHECKARRVALID, and i.
Referenced by idx().
{ int32 *aa, c, i; CHECKARRVALID(a); c = ARRNELEMS(a); aa = ARRPTR(a); for (i = 0; i < c; i++) if (aa[i] == elem) return (i + 1); return 0; }
int internal_size | ( | int * | a, | |
int | len | |||
) |
Definition at line 277 of file _int_tool.c.
References i.
Referenced by g_int_decompress().
{ int i, size = 0; for (i = 0; i < len; i += 2) { if (!i || a[i] != a[i - 1]) /* do not count repeated range */ size += a[i + 1] - a[i] + 1; } return size; }
Definition at line 189 of file _int_tool.c.
References cur.
{ int32 cur, prev; int32 *pcur, *pprev, *end; bool r = FALSE; /* * We use a simple insertion sort. While this is O(N^2) in the worst * case, it's quite fast if the input is already sorted or nearly so. * Also, for not-too-large inputs it's faster than more complex methods * anyhow. */ end = a + len; for (pcur = a + 1; pcur < end; pcur++) { cur = *pcur; for (pprev = pcur - 1; pprev >= a; pprev--) { prev = *pprev; if (prev <= cur) { if (prev == cur) r = TRUE; break; } pprev[1] = prev; } pprev[1] = cur; } return r; }
ArrayType* new_intArrayType | ( | int | num | ) |
Definition at line 226 of file _int_tool.c.
References ARR_DIMS, ARR_ELEMTYPE, ARR_LBOUND, ARR_NDIM, ARR_OVERHEAD_NONULLS, ArrayType::dataoffset, palloc0(), and SET_VARSIZE.
Referenced by copy_intArrayType(), g_int_decompress(), g_int_union(), inner_int_inter(), inner_int_union(), int_to_intset(), intarray_add_elem(), intarray_concat_arrays(), intset_subtract(), and subarray().
{ ArrayType *r; int nbytes = ARR_OVERHEAD_NONULLS(1) + sizeof(int) * num; r = (ArrayType *) palloc0(nbytes); SET_VARSIZE(r, nbytes); ARR_NDIM(r) = 1; r->dataoffset = 0; /* marker for no null bitmap */ ARR_ELEMTYPE(r) = INT4OID; ARR_DIMS(r)[0] = num; ARR_LBOUND(r)[0] = 1; return r; }
Definition at line 244 of file _int_tool.c.
References ARR_DATA_OFFSET, ARR_DIMS, ARR_NDIM, ARRNELEMS, i, repalloc(), and SET_VARSIZE.
Referenced by _int_unique(), g_int_compress(), inner_int_inter(), inner_int_union(), intarray_del_elem(), and intset_subtract().
{ int nbytes = ARR_DATA_OFFSET(a) + sizeof(int) * num; int i; if (num == ARRNELEMS(a)) return a; a = (ArrayType *) repalloc(a, nbytes); SET_VARSIZE(a, nbytes); /* usually the array should be 1-D already, but just in case ... */ for (i = 0; i < ARR_NDIM(a); i++) { ARR_DIMS(a)[i] = num; num = 1; } return a; }
void rt__int_size | ( | ArrayType * | a, | |
float * | size | |||
) |
Definition at line 182 of file _int_tool.c.
References ARRNELEMS.
Referenced by g_int_penalty(), and g_int_picksplit().
{ *size = (float) ARRNELEMS(a); }