Age Owner Branch data TLA Line data Source code
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
1620 tmunro@postgresql.or 21 :CBC 139929 : qunique(void *array, size_t elements, size_t width,
22 : : int (*compare) (const void *, const void *))
23 : : {
24 : 139929 : char *bytes = (char *) array;
25 : : size_t i,
26 : : j;
27 : :
28 [ + + ]: 139929 : if (elements <= 1)
29 : 991 : return elements;
30 : :
31 [ + + ]: 5301151 : for (i = 1, j = 0; i < elements; ++i)
32 : : {
1562 noah@leadboat.com 33 [ + + + + ]: 5162213 : if (compare(bytes + i * width, bytes + j * width) != 0 &&
34 : : ++j != i)
35 : 2783897 : memcpy(bytes + j * width, bytes + i * width, width);
36 : : }
37 : :
1620 tmunro@postgresql.or 38 : 138938 : 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 : 2275778 : qunique_arg(void *array, size_t elements, size_t width,
47 : : int (*compare) (const void *, const void *, void *),
48 : : void *arg)
49 : : {
50 : 2275778 : char *bytes = (char *) array;
51 : : size_t i,
52 : : j;
53 : :
54 [ - + ]: 2275778 : if (elements <= 1)
1620 tmunro@postgresql.or 55 :UBC 0 : return elements;
56 : :
1620 tmunro@postgresql.or 57 [ + + ]:CBC 104264487 : for (i = 1, j = 0; i < elements; ++i)
58 : : {
1562 noah@leadboat.com 59 [ + + + + ]: 101988709 : if (compare(bytes + i * width, bytes + j * width, arg) != 0 &&
60 : : ++j != i)
61 : 14982327 : memcpy(bytes + j * width, bytes + i * width, width);
62 : : }
63 : :
1620 tmunro@postgresql.or 64 : 2275778 : return j + 1;
65 : : }
66 : :
67 : : #endif /* QUNIQUE_H */
|