Mini Shell
#ifndef IMMUTABLES_MAP_H
#define IMMUTABLES_MAP_H
#include <stdint.h>
#include "Python.h"
#define _Py_HAMT_MAX_TREE_DEPTH 7
#define Map_Check(o) (Py_TYPE(o) == &_Map_Type)
#define MapMutation_Check(o) (Py_TYPE(o) == &_MapMutation_Type)
/* Abstract tree node. */
typedef struct {
PyObject_HEAD
} MapNode;
#define _MapCommonFields(pref) \
PyObject_HEAD \
MapNode *pref##_root; \
PyObject *pref##_weakreflist; \
Py_ssize_t pref##_count;
/* Base mapping struct; used in methods shared between
MapObject and MapMutationObject types. */
typedef struct {
_MapCommonFields(b)
} BaseMapObject;
/* An HAMT immutable mapping collection. */
typedef struct {
_MapCommonFields(h)
Py_hash_t h_hash;
} MapObject;
/* MapMutation object (returned from `map.mutate()`.) */
typedef struct {
_MapCommonFields(m)
uint64_t m_mutid;
} MapMutationObject;
/* 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 {
MapNode *i_nodes[_Py_HAMT_MAX_TREE_DEPTH];
Py_ssize_t i_pos[_Py_HAMT_MAX_TREE_DEPTH];
int8_t i_level;
} MapIteratorState;
/* 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
MapObject *mv_obj;
binaryfunc mv_yield;
PyTypeObject *mv_itertype;
} MapView;
typedef struct {
PyObject_HEAD
MapObject *mi_obj;
binaryfunc mi_yield;
MapIteratorState mi_iter;
} MapIterator;
/* PyTypes */
PyTypeObject _Map_Type;
PyTypeObject _MapMutation_Type;
PyTypeObject _Map_ArrayNode_Type;
PyTypeObject _Map_BitmapNode_Type;
PyTypeObject _Map_CollisionNode_Type;
PyTypeObject _MapKeys_Type;
PyTypeObject _MapValues_Type;
PyTypeObject _MapItems_Type;
PyTypeObject _MapKeysIter_Type;
PyTypeObject _MapValuesIter_Type;
PyTypeObject _MapItemsIter_Type;
#endif
Zerion Mini Shell 1.0