LCOV - code coverage report
Current view: top level - src/include/lib - qunique.h (source / functions) Coverage Total Hit
Test: PostgreSQL 19devel Lines: 100.0 % 16 16
Test Date: 2026-03-03 17:14:48 Functions: 100.0 % 2 2
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /*-------------------------------------------------------------------------
       2              :  *
       3              :  * qunique.h
       4              :  *      inline array unique functions
       5              :  * Portions Copyright (c) 2019-2026, 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       168550 : qunique(void *array, size_t elements, size_t width,
      22              :         int (*compare) (const void *, const void *))
      23              : {
      24       168550 :     char       *bytes = (char *) array;
      25              :     size_t      i,
      26              :                 j;
      27              : 
      28       168550 :     if (elements <= 1)
      29         1245 :         return elements;
      30              : 
      31      6211732 :     for (i = 1, j = 0; i < elements; ++i)
      32              :     {
      33      6044427 :         if (compare(bytes + i * width, bytes + j * width) != 0 &&
      34              :             ++j != i)
      35      3250160 :             memcpy(bytes + j * width, bytes + i * width, width);
      36              :     }
      37              : 
      38       167305 :     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      2562479 : qunique_arg(void *array, size_t elements, size_t width,
      47              :             int (*compare) (const void *, const void *, void *),
      48              :             void *arg)
      49              : {
      50      2562479 :     char       *bytes = (char *) array;
      51              :     size_t      i,
      52              :                 j;
      53              : 
      54      2562479 :     if (elements <= 1)
      55          234 :         return elements;
      56              : 
      57    110574634 :     for (i = 1, j = 0; i < elements; ++i)
      58              :     {
      59    108012389 :         if (compare(bytes + i * width, bytes + j * width, arg) != 0 &&
      60              :             ++j != i)
      61     15683654 :             memcpy(bytes + j * width, bytes + i * width, width);
      62              :     }
      63              : 
      64      2562245 :     return j + 1;
      65              : }
      66              : 
      67              : #endif                          /* QUNIQUE_H */
        

Generated by: LCOV version 2.0-1