codekingpro/portable-devtools
114k
1/*-------------------------------------------------------------------------2 *3 * qunique.h4 * inline array unique functions5 * Portions Copyright (c) 2019-2023, PostgreSQL Global Development Group6 *7 * IDENTIFICATION8 * src/include/lib/qunique.h9 *-------------------------------------------------------------------------10 */11 12#ifndef QUNIQUE_H13#define QUNIQUE_H14 15/*16 * Remove duplicates from a pre-sorted array, according to a user-supplied17 * comparator. Usually the array should have been sorted with qsort() using18 * the same arguments. Return the new size.19 */20static inline size_t21qunique(void *array, size_t elements, size_t width,22 int (*compare) (const void *, const void *))23{24 char *bytes = (char *) array;25 size_t i,26 j;27 28 if (elements <= 1)29 return elements;30 31 for (i = 1, j = 0; i < elements; ++i)32 {33 if (compare(bytes + i * width, bytes + j * width) != 0 &&34 ++j != i)35 memcpy(bytes + j * width, bytes + i * width, width);36 }37 38 return j + 1;39}40 41/*42 * Like qunique(), but takes a comparator with an extra user data argument43 * which is passed through, for compatibility with qsort_arg().44 */45static inline size_t46qunique_arg(void *array, size_t elements, size_t width,47 int (*compare) (const void *, const void *, void *),48 void *arg)49{50 char *bytes = (char *) array;51 size_t i,52 j;53 54 if (elements <= 1)55 return elements;56 57 for (i = 1, j = 0; i < elements; ++i)58 {59 if (compare(bytes + i * width, bytes + j * width, arg) != 0 &&60 ++j != i)61 memcpy(bytes + j * width, bytes + i * width, width);62 }63 64 return j + 1;65}66 67#endif /* QUNIQUE_H */68 