Branch data Line data Source code
1 : : #ifndef Py_CPYTHON_DICTOBJECT_H
2 : : # error "this header file must not be included directly"
3 : : #endif
4 : :
5 : : typedef struct _dictkeysobject PyDictKeysObject;
6 : : typedef struct _dictvalues PyDictValues;
7 : :
8 : : /* The ma_values pointer is NULL for a combined table
9 : : * or points to an array of PyObject* for a split table
10 : : */
11 : : typedef struct {
12 : : PyObject_HEAD
13 : :
14 : : /* Number of items in the dictionary */
15 : : Py_ssize_t ma_used;
16 : :
17 : : /* Dictionary version: globally unique, value change each time
18 : : the dictionary is modified */
19 : : #ifdef Py_BUILD_CORE
20 : : uint64_t ma_version_tag;
21 : : #else
22 : : Py_DEPRECATED(3.12) uint64_t ma_version_tag;
23 : : #endif
24 : :
25 : : PyDictKeysObject *ma_keys;
26 : :
27 : : /* If ma_values is NULL, the table is "combined": keys and values
28 : : are stored in ma_keys.
29 : :
30 : : If ma_values is not NULL, the table is split:
31 : : keys are stored in ma_keys and values are stored in ma_values */
32 : : PyDictValues *ma_values;
33 : : } PyDictObject;
34 : :
35 : : PyAPI_FUNC(PyObject *) _PyDict_GetItem_KnownHash(PyObject *mp, PyObject *key,
36 : : Py_hash_t hash);
37 : : PyAPI_FUNC(PyObject *) _PyDict_GetItemWithError(PyObject *dp, PyObject *key);
38 : : PyAPI_FUNC(PyObject *) _PyDict_GetItemIdWithError(PyObject *dp,
39 : : _Py_Identifier *key);
40 : : PyAPI_FUNC(PyObject *) _PyDict_GetItemStringWithError(PyObject *, const char *);
41 : : PyAPI_FUNC(PyObject *) PyDict_SetDefault(
42 : : PyObject *mp, PyObject *key, PyObject *defaultobj);
43 : : PyAPI_FUNC(int) _PyDict_SetItem_KnownHash(PyObject *mp, PyObject *key,
44 : : PyObject *item, Py_hash_t hash);
45 : : PyAPI_FUNC(int) _PyDict_DelItem_KnownHash(PyObject *mp, PyObject *key,
46 : : Py_hash_t hash);
47 : : PyAPI_FUNC(int) _PyDict_DelItemIf(PyObject *mp, PyObject *key,
48 : : int (*predicate)(PyObject *value));
49 : : PyAPI_FUNC(int) _PyDict_Next(
50 : : PyObject *mp, Py_ssize_t *pos, PyObject **key, PyObject **value, Py_hash_t *hash);
51 : :
52 : : /* Get the number of items of a dictionary. */
53 : 359717 : static inline Py_ssize_t PyDict_GET_SIZE(PyObject *op) {
54 : : PyDictObject *mp;
55 : : assert(PyDict_Check(op));
56 : 359717 : mp = _Py_CAST(PyDictObject*, op);
57 : 359717 : return mp->ma_used;
58 : : }
59 : : #define PyDict_GET_SIZE(op) PyDict_GET_SIZE(_PyObject_CAST(op))
60 : :
61 : : PyAPI_FUNC(int) _PyDict_Contains_KnownHash(PyObject *, PyObject *, Py_hash_t);
62 : : PyAPI_FUNC(int) _PyDict_ContainsId(PyObject *, _Py_Identifier *);
63 : : PyAPI_FUNC(PyObject *) _PyDict_NewPresized(Py_ssize_t minused);
64 : : PyAPI_FUNC(void) _PyDict_MaybeUntrack(PyObject *mp);
65 : : PyAPI_FUNC(int) _PyDict_HasOnlyStringKeys(PyObject *mp);
66 : : PyAPI_FUNC(Py_ssize_t) _PyDict_SizeOf(PyDictObject *);
67 : : PyAPI_FUNC(PyObject *) _PyDict_Pop(PyObject *, PyObject *, PyObject *);
68 : : #define _PyDict_HasSplitTable(d) ((d)->ma_values != NULL)
69 : :
70 : : /* Like PyDict_Merge, but override can be 0, 1 or 2. If override is 0,
71 : : the first occurrence of a key wins, if override is 1, the last occurrence
72 : : of a key wins, if override is 2, a KeyError with conflicting key as
73 : : argument is raised.
74 : : */
75 : : PyAPI_FUNC(int) _PyDict_MergeEx(PyObject *mp, PyObject *other, int override);
76 : : PyAPI_FUNC(int) _PyDict_SetItemId(PyObject *dp, _Py_Identifier *key, PyObject *item);
77 : :
78 : : PyAPI_FUNC(int) _PyDict_DelItemId(PyObject *mp, _Py_Identifier *key);
79 : : PyAPI_FUNC(void) _PyDict_DebugMallocStats(FILE *out);
80 : :
81 : : /* _PyDictView */
82 : :
83 : : typedef struct {
84 : : PyObject_HEAD
85 : : PyDictObject *dv_dict;
86 : : } _PyDictViewObject;
87 : :
88 : : PyAPI_FUNC(PyObject *) _PyDictView_New(PyObject *, PyTypeObject *);
89 : : PyAPI_FUNC(PyObject *) _PyDictView_Intersect(PyObject* self, PyObject *other);
90 : :
91 : : /* Dictionary watchers */
92 : :
93 : : #define PY_FOREACH_DICT_EVENT(V) \
94 : : V(ADDED) \
95 : : V(MODIFIED) \
96 : : V(DELETED) \
97 : : V(CLONED) \
98 : : V(CLEARED) \
99 : : V(DEALLOCATED)
100 : :
101 : : typedef enum {
102 : : #define PY_DEF_EVENT(EVENT) PyDict_EVENT_##EVENT,
103 : : PY_FOREACH_DICT_EVENT(PY_DEF_EVENT)
104 : : #undef PY_DEF_EVENT
105 : : } PyDict_WatchEvent;
106 : :
107 : : // Callback to be invoked when a watched dict is cleared, dealloced, or modified.
108 : : // In clear/dealloc case, key and new_value will be NULL. Otherwise, new_value will be the
109 : : // new value for key, NULL if key is being deleted.
110 : : typedef int(*PyDict_WatchCallback)(PyDict_WatchEvent event, PyObject* dict, PyObject* key, PyObject* new_value);
111 : :
112 : : // Register/unregister a dict-watcher callback
113 : : PyAPI_FUNC(int) PyDict_AddWatcher(PyDict_WatchCallback callback);
114 : : PyAPI_FUNC(int) PyDict_ClearWatcher(int watcher_id);
115 : :
116 : : // Mark given dictionary as "watched" (callback will be called if it is modified)
117 : : PyAPI_FUNC(int) PyDict_Watch(int watcher_id, PyObject* dict);
118 : : PyAPI_FUNC(int) PyDict_Unwatch(int watcher_id, PyObject* dict);
|