FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
cpython/Include/internal/pycore_hamt.h at master · python-emscripten/cpython · GitHub
python-emscripten
cpython
Repository navigation
Code
Pull requests
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
cpython
/
Include
/
internal
/
pycore_hamt.h
Copy path
More file actions
More file actions
Latest commit
History
History
History
116 lines (84 loc) · 3.05 KB
Breadcrumbs
cpython
/
Include
/
internal
/
pycore_hamt.h
Copy path
File metadata and controls
116 lines (84 loc) · 3.05 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#ifndef
Py_INTERNAL_HAMT_H
#define
Py_INTERNAL_HAMT_H
#ifndef
Py_BUILD_CORE
# error
"this header requires Py_BUILD_CORE define"
#endif
#define
_Py_HAMT_MAX_TREE_DEPTH
7
#define
PyHamt_Check
(
o
) Py_IS_TYPE(o, &_PyHamt_Type)
/* Abstract tree node. */
typedef
struct
{
PyObject_HEAD
}
PyHamtNode
;
/* An HAMT immutable mapping collection. */
typedef
struct
{
PyObject_HEAD
PyHamtNode
*
h_root
;
PyObject
*
h_weakreflist
;
Py_ssize_t
h_count
;
}
PyHamtObject
;
/* A struct to hold the state of depth-first traverse of the tree.
HAMT is an immutable collection. Iterators will hold a strong reference
to it, and every node in the HAMT has strong references to its children.
So for iterators, we can implement zero allocations and zero reference
inc/dec depth-first iteration.
- i_nodes: an array of seven pointers to tree nodes
- i_level: the current node in i_nodes
- i_pos: an array of positions within nodes in i_nodes.
*/
typedef
struct
{
PyHamtNode
*
i_nodes
[
_Py_HAMT_MAX_TREE_DEPTH
];
Py_ssize_t
i_pos
[
_Py_HAMT_MAX_TREE_DEPTH
];
int8_t
i_level
;
}
PyHamtIteratorState
;
/* Base iterator object.
Contains the iteration state, a pointer to the HAMT tree,
and a pointer to the 'yield function'. The latter is a simple
function that returns a key/value tuple for the 'Items' iterator,
just a key for the 'Keys' iterator, and a value for the 'Values'
iterator.
*/
typedef
struct
{
PyObject_HEAD
PyHamtObject
*
hi_obj
;
PyHamtIteratorState
hi_iter
;
binaryfunc
hi_yield
;
}
PyHamtIterator
;
PyAPI_DATA
(
PyTypeObject
)
_PyHamt_Type
;
PyAPI_DATA
(
PyTypeObject
)
_PyHamt_ArrayNode_Type
;
PyAPI_DATA
(
PyTypeObject
)
_PyHamt_BitmapNode_Type
;
PyAPI_DATA
(
PyTypeObject
)
_PyHamt_CollisionNode_Type
;
PyAPI_DATA
(
PyTypeObject
)
_PyHamtKeys_Type
;
PyAPI_DATA
(
PyTypeObject
)
_PyHamtValues_Type
;
PyAPI_DATA
(
PyTypeObject
)
_PyHamtItems_Type
;
/* Create a new HAMT immutable mapping. */
PyHamtObject
*
_PyHamt_New
(
void
);
/* Return a new collection based on "o", but with an additional
key/val pair. */
PyHamtObject
*
_PyHamt_Assoc
(
PyHamtObject
*
o
,
PyObject
*
key
,
PyObject
*
val
);
/* Return a new collection based on "o", but without "key". */
PyHamtObject
*
_PyHamt_Without
(
PyHamtObject
*
o
,
PyObject
*
key
);
/* Find "key" in the "o" collection.
Return:
- -1: An error occurred.
- 0: "key" wasn't found in "o".
- 1: "key" is in "o"; "*val" is set to its value (a borrowed ref).
*/
int
_PyHamt_Find
(
PyHamtObject
*
o
,
PyObject
*
key
,
PyObject
*
*
val
);
/* Check if "v" is equal to "w".
Return:
- 0: v != w
- 1: v == w
- -1: An error occurred.
*/
int
_PyHamt_Eq
(
PyHamtObject
*
v
,
PyHamtObject
*
w
);
/* Return the size of "o"; equivalent of "len(o)". */
Py_ssize_t
_PyHamt_Len
(
PyHamtObject
*
o
);
/* Return a Keys iterator over "o". */
PyObject
*
_PyHamt_NewIterKeys
(
PyHamtObject
*
o
);
/* Return a Values iterator over "o". */
PyObject
*
_PyHamt_NewIterValues
(
PyHamtObject
*
o
);
/* Return a Items iterator over "o". */
PyObject
*
_PyHamt_NewIterItems
(
PyHamtObject
*
o
);
int
_PyHamt_Init
(
void
);
void
_PyHamt_Fini
(
void
);
#endif
/* !Py_INTERNAL_HAMT_H */
Back
|
FazBrowse Home
|
New Git URL