|
6 | 6 | extern "C" { |
7 | 7 | #endif |
8 | 8 |
|
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 | | - |
76 | 9 | PyAPI_DATA(PyTypeObject) PySet_Type; |
77 | 10 | PyAPI_DATA(PyTypeObject) PyFrozenSet_Type; |
78 | 11 | PyAPI_DATA(PyTypeObject) PySetIter_Type; |
@@ -104,6 +37,12 @@ PyAPI_FUNC(Py_ssize_t) PySet_Size(PyObject *anyset); |
104 | 37 | (Py_IS_TYPE(ob, &PySet_Type) || \ |
105 | 38 | PyType_IsSubtype(Py_TYPE(ob), &PySet_Type)) |
106 | 39 |
|
| 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 | + |
107 | 46 | #ifdef __cplusplus |
108 | 47 | } |
109 | 48 | #endif |
|
0 commit comments