#ifndef Py_INTERNAL_HAMT_H #define Py_INTERNAL_HAMT_H #ifndef Py_BUILD_CORE # error "this header requires Py_BUILD_CORE define" #endif /* HAMT tree is shaped by hashes of keys. Every group of 5 bits of a hash denotes the exact position of the key in one level of the tree. Since we're using 32 bit hashes, we can have at most 7 such levels. Although if there are two distinct keys with equal hashes, they will have to occupy the same cell in the 7th level of the tree -- so we'd put them in a "collision" node. Which brings the total possible tree depth to 8. Read more about the actual layout of the HAMT tree in `hamt.c`. This constant is used to define a datastucture for storing iteration state. */ #define _Py_HAMT_MAX_TREE_DEPTH 8 extern PyTypeObject _PyHamt_Type; extern PyTypeObject _PyHamt_ArrayNode_Type; extern PyTypeObject _PyHamt_BitmapNode_Type; extern PyTypeObject _PyHamt_CollisionNode_Type; extern PyTypeObject _PyHamtKeys_Type; extern PyTypeObject _PyHamtValues_Type; extern PyTypeObject _PyHamtItems_Type; /* runtime lifecycle */ void _PyHamt_Fini(PyInterpreterState *); /* other API */ #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; /* 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); #endif /* !Py_INTERNAL_HAMT_H */
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
pycore_abstract.h | File | 611 B | 0644 |
|
pycore_accu.h | File | 1.1 KB | 0644 |
|
pycore_asdl.h | File | 2.96 KB | 0644 |
|
pycore_ast.h | File | 28.63 KB | 0644 |
|
pycore_ast_state.h | File | 6.4 KB | 0644 |
|
pycore_atomic.h | File | 16.58 KB | 0644 |
|
pycore_atomic_funcs.h | File | 2.38 KB | 0644 |
|
pycore_bitutils.h | File | 5.92 KB | 0644 |
|
pycore_blocks_output_buffer.h | File | 8.48 KB | 0644 |
|
pycore_bytes_methods.h | File | 3.3 KB | 0644 |
|
pycore_bytesobject.h | File | 1.39 KB | 0644 |
|
pycore_call.h | File | 3.39 KB | 0644 |
|
pycore_ceval.h | File | 4.31 KB | 0644 |
|
pycore_code.h | File | 15.56 KB | 0644 |
|
pycore_compile.h | File | 1.02 KB | 0644 |
|
pycore_condvar.h | File | 2.77 KB | 0644 |
|
pycore_context.h | File | 1.21 KB | 0644 |
|
pycore_dict.h | File | 5.55 KB | 0644 |
|
pycore_dtoa.h | File | 704 B | 0644 |
|
pycore_emscripten_signal.h | File | 562 B | 0644 |
|
pycore_exceptions.h | File | 842 B | 0644 |
|
pycore_fileutils.h | File | 7.23 KB | 0644 |
|
pycore_floatobject.h | File | 1.28 KB | 0644 |
|
pycore_format.h | File | 480 B | 0644 |
|
pycore_frame.h | File | 7.39 KB | 0644 |
|
pycore_function.h | File | 413 B | 0644 |
|
pycore_gc.h | File | 6.73 KB | 0644 |
|
pycore_genobject.h | File | 1.14 KB | 0644 |
|
pycore_getopt.h | File | 490 B | 0644 |
|
pycore_gil.h | File | 1.53 KB | 0644 |
|
pycore_global_objects.h | File | 1.4 KB | 0644 |
|
pycore_global_strings.h | File | 12.68 KB | 0644 |
|
pycore_hamt.h | File | 3.61 KB | 0644 |
|
pycore_hashtable.h | File | 4.1 KB | 0644 |
|
pycore_import.h | File | 743 B | 0644 |
|
pycore_initconfig.h | File | 5.66 KB | 0644 |
|
pycore_interp.h | File | 6.51 KB | 0644 |
|
pycore_interpreteridobject.h | File | 562 B | 0644 |
|
pycore_list.h | File | 1.32 KB | 0644 |
|
pycore_long.h | File | 3.43 KB | 0644 |
|
pycore_moduleobject.h | File | 1.02 KB | 0644 |
|
pycore_namespace.h | File | 392 B | 0644 |
|
pycore_object.h | File | 9.8 KB | 0644 |
|
pycore_opcode.h | File | 18.54 KB | 0644 |
|
pycore_parser.h | File | 626 B | 0644 |
|
pycore_pathconfig.h | File | 606 B | 0644 |
|
pycore_pyarena.h | File | 2.67 KB | 0644 |
|
pycore_pyerrors.h | File | 2.44 KB | 0644 |
|
pycore_pyhash.h | File | 206 B | 0644 |
|
pycore_pylifecycle.h | File | 3.42 KB | 0644 |
|
pycore_pymath.h | File | 9.21 KB | 0644 |
|
pycore_pymem.h | File | 3.62 KB | 0644 |
|
pycore_pystate.h | File | 4.15 KB | 0644 |
|
pycore_runtime.h | File | 5.85 KB | 0644 |
|
pycore_runtime_init.h | File | 47.94 KB | 0644 |
|
pycore_signal.h | File | 937 B | 0644 |
|
pycore_sliceobject.h | File | 336 B | 0644 |
|
pycore_strhex.h | File | 937 B | 0644 |
|
pycore_structseq.h | File | 580 B | 0644 |
|
pycore_symtable.h | File | 5.51 KB | 0644 |
|
pycore_sysmodule.h | File | 605 B | 0644 |
|
pycore_traceback.h | File | 3.42 KB | 0644 |
|
pycore_tuple.h | File | 2.04 KB | 0644 |
|
pycore_typeobject.h | File | 1.13 KB | 0644 |
|
pycore_ucnhash.h | File | 898 B | 0644 |
|
pycore_unicodeobject.h | File | 1.68 KB | 0644 |
|
pycore_unionobject.h | File | 678 B | 0644 |
|
pycore_warnings.h | File | 740 B | 0644 |
|