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++;
} elseif (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;
}
ArrayType *
inner_int_inter(ArrayType *a, ArrayType *b)
{
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++; elseif (da[i] == db[j])
{ if (k == 0 || dr[k - 1] != db[j])
dr[k++] = db[j];
i++;
j++;
} else
j++;
}
ArrayType *
resize_intArrayType(ArrayType *a, int num)
{ int nbytes; int i;
/* if no elements, return a zero-dimensional array */ if (num <= 0)
{
Assert(num == 0);
a = construct_empty_array(INT4OID); return a;
}
if (num == ARRNELEMS(a)) return a;
nbytes = ARR_DATA_OFFSET(a) + sizeof(int) * num;
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;
}
ArrayType *
copy_intArrayType(ArrayType *a)
{
ArrayType *r; int n = ARRNELEMS(a);
r = new_intArrayType(n);
memcpy(ARRPTR(r), ARRPTR(a), n * sizeof(int32)); return r;
}
/* num for compressed key */ int
internal_size(int *a, int len)
{ int i;
int64 size = 0;
for (i = 0; i < len; i += 2)
{ if (!i || a[i] != a[i - 1]) /* do not count repeated range */
size += (int64) (a[i + 1]) - (int64) (a[i]) + 1;
}
/* unique-ify elements of r in-place ... r must be sorted already */
ArrayType *
_int_unique(ArrayType *r)
{ int num = ARRNELEMS(r); bool ascending = true;
num = qunique_arg(ARRPTR(r), num, sizeof(int), isort_cmp,
&ascending);
return resize_intArrayType(r, num);
}
void
gensign(BITVECP sign, int *a, int len, int siglen)
{ int i;
/* we assume that the sign vector is previously zeroed */ for (i = 0; i < len; i++)
{
HASH(sign, *a, siglen);
a++;
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.