PostgreSQL Source Code git master
qunique.h
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * qunique.h
4 * inline array unique functions
5 * Portions Copyright (c) 2019-2025, PostgreSQL Global Development Group
6 *
7 * IDENTIFICATION
8 * src/include/lib/qunique.h
9 *-------------------------------------------------------------------------
10 */
11
12#ifndef QUNIQUE_H
13#define QUNIQUE_H
14
15/*
16 * Remove duplicates from a pre-sorted array, according to a user-supplied
17 * comparator. Usually the array should have been sorted with qsort() using
18 * the same arguments. Return the new size.
19 */
20static inline size_t
21qunique(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 argument
43 * which is passed through, for compatibility with qsort_arg().
44 */
45static inline size_t
46qunique_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 */
static int compare(const void *arg1, const void *arg2)
Definition: geqo_pool.c:145
int j
Definition: isn.c:73
int i
Definition: isn.c:72
void * arg
static size_t qunique(void *array, size_t elements, size_t width, int(*compare)(const void *, const void *))
Definition: qunique.h:21
static size_t qunique_arg(void *array, size_t elements, size_t width, int(*compare)(const void *, const void *, void *), void *arg)
Definition: qunique.h:46