Coverage Report

Created: 2025-07-04 06:49

/src/cpython-install/include/python3.15/cpython/setobject.h
Line
Count
Source (jump to first uncovered line)
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
0
static inline Py_ssize_t PySet_GET_SIZE(PyObject *so) {
65
0
#ifdef Py_GIL_DISABLED
66
0
    return _Py_atomic_load_ssize_relaxed(&(_PySet_CAST(so)->used));
67
0
#else
68
0
    return _PySet_CAST(so)->used;
69
0
#endif
70
0
}
71
#define PySet_GET_SIZE(so) PySet_GET_SIZE(_PyObject_CAST(so))