LCOV - code coverage report
Current view: top level - Include/cpython - setobject.h (source / functions) Hit Total Coverage
Test: CPython 3.12 LCOV report [commit 5e6661bce9] Lines: 2 2 100.0 %
Date: 2023-03-20 08:15:36 Functions: 1 1 100.0 %
Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : #ifndef Py_CPYTHON_SETOBJECT_H
       2                 :            : #  error "this header file must not be included directly"
       3                 :            : #endif
       4                 :            : 
       5                 :            : /* There are three kinds of entries in the table:
       6                 :            : 
       7                 :            : 1. Unused:  key == NULL and hash == 0
       8                 :            : 2. Dummy:   key == dummy and hash == -1
       9                 :            : 3. Active:  key != NULL and key != dummy and hash != -1
      10                 :            : 
      11                 :            : The hash field of Unused slots is always zero.
      12                 :            : 
      13                 :            : The hash field of Dummy slots are set to -1
      14                 :            : meaning that dummy entries can be detected by
      15                 :            : either entry->key==dummy or by entry->hash==-1.
      16                 :            : */
      17                 :            : 
      18                 :            : #define PySet_MINSIZE 8
      19                 :            : 
      20                 :            : typedef struct {
      21                 :            :     PyObject *key;
      22                 :            :     Py_hash_t hash;             /* Cached hash code of the key */
      23                 :            : } setentry;
      24                 :            : 
      25                 :            : /* The SetObject data structure is shared by set and frozenset objects.
      26                 :            : 
      27                 :            : Invariant for sets:
      28                 :            :  - hash is -1
      29                 :            : 
      30                 :            : Invariants for frozensets:
      31                 :            :  - data is immutable.
      32                 :            :  - hash is the hash of the frozenset or -1 if not computed yet.
      33                 :            : 
      34                 :            : */
      35                 :            : 
      36                 :            : typedef struct {
      37                 :            :     PyObject_HEAD
      38                 :            : 
      39                 :            :     Py_ssize_t fill;            /* Number active and dummy entries*/
      40                 :            :     Py_ssize_t used;            /* Number active entries */
      41                 :            : 
      42                 :            :     /* The table contains mask + 1 slots, and that's a power of 2.
      43                 :            :      * We store the mask instead of the size because the mask is more
      44                 :            :      * frequently needed.
      45                 :            :      */
      46                 :            :     Py_ssize_t mask;
      47                 :            : 
      48                 :            :     /* The table points to a fixed-size smalltable for small tables
      49                 :            :      * or to additional malloc'ed memory for bigger tables.
      50                 :            :      * The table pointer is never NULL which saves us from repeated
      51                 :            :      * runtime null-tests.
      52                 :            :      */
      53                 :            :     setentry *table;
      54                 :            :     Py_hash_t hash;             /* Only used by frozenset objects */
      55                 :            :     Py_ssize_t finger;          /* Search finger for pop() */
      56                 :            : 
      57                 :            :     setentry smalltable[PySet_MINSIZE];
      58                 :            :     PyObject *weakreflist;      /* List of weak references */
      59                 :            : } PySetObject;
      60                 :            : 
      61                 :            : #define _PySet_CAST(so) \
      62                 :            :     (assert(PyAnySet_Check(so)), _Py_CAST(PySetObject*, so))
      63                 :            : 
      64                 :     101228 : static inline Py_ssize_t PySet_GET_SIZE(PyObject *so) {
      65                 :     101228 :     return _PySet_CAST(so)->used;
      66                 :            : }
      67                 :            : #define PySet_GET_SIZE(so) PySet_GET_SIZE(_PyObject_CAST(so))
      68                 :            : 
      69                 :            : PyAPI_DATA(PyObject *) _PySet_Dummy;
      70                 :            : 
      71                 :            : PyAPI_FUNC(int) _PySet_NextEntry(PyObject *set, Py_ssize_t *pos, PyObject **key, Py_hash_t *hash);
      72                 :            : PyAPI_FUNC(int) _PySet_Update(PyObject *set, PyObject *iterable);

Generated by: LCOV version 1.14