Skip to content

Commit 5c4d1f6

Browse files
authored
bpo-35134: Add Include/cpython/setobject.h header (GH-32384)
1 parent 2390b22 commit 5c4d1f6

File tree

5 files changed

+78
-67
lines changed

5 files changed

+78
-67
lines changed

Include/cpython/setobject.h

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
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_GET_SIZE(so) \
62+
(assert(PyAnySet_Check(so)), (((PySetObject *)(so))->used))
63+
64+
PyAPI_DATA(PyObject *) _PySet_Dummy;
65+
66+
PyAPI_FUNC(int) _PySet_NextEntry(PyObject *set, Py_ssize_t *pos, PyObject **key, Py_hash_t *hash);
67+
PyAPI_FUNC(int) _PySet_Update(PyObject *set, PyObject *iterable);

Include/setobject.h

Lines changed: 6 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -6,73 +6,6 @@
66
extern "C" {
77
#endif
88

9-
#ifndef Py_LIMITED_API
10-
11-
/* There are three kinds of entries in the table:
12-
13-
1. Unused: key == NULL and hash == 0
14-
2. Dummy: key == dummy and hash == -1
15-
3. Active: key != NULL and key != dummy and hash != -1
16-
17-
The hash field of Unused slots is always zero.
18-
19-
The hash field of Dummy slots are set to -1
20-
meaning that dummy entries can be detected by
21-
either entry->key==dummy or by entry->hash==-1.
22-
*/
23-
24-
#define PySet_MINSIZE 8
25-
26-
typedef struct {
27-
PyObject *key;
28-
Py_hash_t hash; /* Cached hash code of the key */
29-
} setentry;
30-
31-
/* The SetObject data structure is shared by set and frozenset objects.
32-
33-
Invariant for sets:
34-
- hash is -1
35-
36-
Invariants for frozensets:
37-
- data is immutable.
38-
- hash is the hash of the frozenset or -1 if not computed yet.
39-
40-
*/
41-
42-
typedef struct {
43-
PyObject_HEAD
44-
45-
Py_ssize_t fill; /* Number active and dummy entries*/
46-
Py_ssize_t used; /* Number active entries */
47-
48-
/* The table contains mask + 1 slots, and that's a power of 2.
49-
* We store the mask instead of the size because the mask is more
50-
* frequently needed.
51-
*/
52-
Py_ssize_t mask;
53-
54-
/* The table points to a fixed-size smalltable for small tables
55-
* or to additional malloc'ed memory for bigger tables.
56-
* The table pointer is never NULL which saves us from repeated
57-
* runtime null-tests.
58-
*/
59-
setentry *table;
60-
Py_hash_t hash; /* Only used by frozenset objects */
61-
Py_ssize_t finger; /* Search finger for pop() */
62-
63-
setentry smalltable[PySet_MINSIZE];
64-
PyObject *weakreflist; /* List of weak references */
65-
} PySetObject;
66-
67-
#define PySet_GET_SIZE(so) (assert(PyAnySet_Check(so)),(((PySetObject *)(so))->used))
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);
73-
74-
#endif /* Section excluded by Py_LIMITED_API */
75-
769
PyAPI_DATA(PyTypeObject) PySet_Type;
7710
PyAPI_DATA(PyTypeObject) PyFrozenSet_Type;
7811
PyAPI_DATA(PyTypeObject) PySetIter_Type;
@@ -104,6 +37,12 @@ PyAPI_FUNC(Py_ssize_t) PySet_Size(PyObject *anyset);
10437
(Py_IS_TYPE(ob, &PySet_Type) || \
10538
PyType_IsSubtype(Py_TYPE(ob), &PySet_Type))
10639

40+
#ifndef Py_LIMITED_API
41+
# define Py_CPYTHON_SETOBJECT_H
42+
# include "cpython/setobject.h"
43+
# undef Py_CPYTHON_SETOBJECT_H
44+
#endif
45+
10746
#ifdef __cplusplus
10847
}
10948
#endif

Makefile.pre.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1551,6 +1551,7 @@ PYTHON_HEADERS= \
15511551
$(srcdir)/Include/cpython/pystate.h \
15521552
$(srcdir)/Include/cpython/pythonrun.h \
15531553
$(srcdir)/Include/cpython/pytime.h \
1554+
$(srcdir)/Include/cpython/setobject.h \
15541555
$(srcdir)/Include/cpython/sysmodule.h \
15551556
$(srcdir)/Include/cpython/traceback.h \
15561557
$(srcdir)/Include/cpython/tupleobject.h \

PCbuild/pythoncore.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@
172172
<ClInclude Include="..\Include\cpython\pystate.h" />
173173
<ClInclude Include="..\Include\cpython\pythonrun.h" />
174174
<ClInclude Include="..\Include\cpython\pytime.h" />
175+
<ClInclude Include="..\Include\cpython\setobject.h" />
175176
<ClInclude Include="..\Include\cpython\sysmodule.h" />
176177
<ClInclude Include="..\Include\cpython\traceback.h" />
177178
<ClInclude Include="..\Include\cpython\tupleobject.h" />

PCbuild/pythoncore.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,9 @@
459459
<ClInclude Include="..\Include\cpython\pythonrun.h">
460460
<Filter>Include\cpython</Filter>
461461
</ClInclude>
462+
<ClInclude Include="..\Include\cpython\setobject.h">
463+
<Filter>Include\cpython</Filter>
464+
</ClInclude>
462465
<ClInclude Include="..\Include\cpython\sysmodule.h">
463466
<Filter>Include\cpython</Filter>
464467
</ClInclude>

0 commit comments

Comments
 (0)