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-2024, 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  */
20 static inline size_t
21 qunique(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  */
45 static inline size_t
46 qunique_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:74
int i
Definition: isn.c:73
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