17db96d56Sopenharmony_ci#ifndef Py_CPYTHON_DICTOBJECT_H
27db96d56Sopenharmony_ci#  error "this header file must not be included directly"
37db96d56Sopenharmony_ci#endif
47db96d56Sopenharmony_ci
57db96d56Sopenharmony_citypedef struct _dictkeysobject PyDictKeysObject;
67db96d56Sopenharmony_citypedef struct _dictvalues PyDictValues;
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_ci/* The ma_values pointer is NULL for a combined table
97db96d56Sopenharmony_ci * or points to an array of PyObject* for a split table
107db96d56Sopenharmony_ci */
117db96d56Sopenharmony_citypedef struct {
127db96d56Sopenharmony_ci    PyObject_HEAD
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci    /* Number of items in the dictionary */
157db96d56Sopenharmony_ci    Py_ssize_t ma_used;
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ci    /* Dictionary version: globally unique, value change each time
187db96d56Sopenharmony_ci       the dictionary is modified */
197db96d56Sopenharmony_ci    uint64_t ma_version_tag;
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci    PyDictKeysObject *ma_keys;
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ci    /* If ma_values is NULL, the table is "combined": keys and values
247db96d56Sopenharmony_ci       are stored in ma_keys.
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ci       If ma_values is not NULL, the table is split:
277db96d56Sopenharmony_ci       keys are stored in ma_keys and values are stored in ma_values */
287db96d56Sopenharmony_ci    PyDictValues *ma_values;
297db96d56Sopenharmony_ci} PyDictObject;
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyDict_GetItem_KnownHash(PyObject *mp, PyObject *key,
327db96d56Sopenharmony_ci                                       Py_hash_t hash);
337db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyDict_GetItemWithError(PyObject *dp, PyObject *key);
347db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyDict_GetItemIdWithError(PyObject *dp,
357db96d56Sopenharmony_ci                                                  _Py_Identifier *key);
367db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyDict_GetItemStringWithError(PyObject *, const char *);
377db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyDict_SetDefault(
387db96d56Sopenharmony_ci    PyObject *mp, PyObject *key, PyObject *defaultobj);
397db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyDict_SetItem_KnownHash(PyObject *mp, PyObject *key,
407db96d56Sopenharmony_ci                                          PyObject *item, Py_hash_t hash);
417db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyDict_DelItem_KnownHash(PyObject *mp, PyObject *key,
427db96d56Sopenharmony_ci                                          Py_hash_t hash);
437db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyDict_DelItemIf(PyObject *mp, PyObject *key,
447db96d56Sopenharmony_ci                                  int (*predicate)(PyObject *value));
457db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyDict_Next(
467db96d56Sopenharmony_ci    PyObject *mp, Py_ssize_t *pos, PyObject **key, PyObject **value, Py_hash_t *hash);
477db96d56Sopenharmony_ci
487db96d56Sopenharmony_ci/* Get the number of items of a dictionary. */
497db96d56Sopenharmony_ci#define PyDict_GET_SIZE(mp)  (assert(PyDict_Check(mp)),((PyDictObject *)mp)->ma_used)
507db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyDict_Contains_KnownHash(PyObject *, PyObject *, Py_hash_t);
517db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyDict_ContainsId(PyObject *, _Py_Identifier *);
527db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyDict_NewPresized(Py_ssize_t minused);
537db96d56Sopenharmony_ciPyAPI_FUNC(void) _PyDict_MaybeUntrack(PyObject *mp);
547db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyDict_HasOnlyStringKeys(PyObject *mp);
557db96d56Sopenharmony_ciPyAPI_FUNC(Py_ssize_t) _PyDict_SizeOf(PyDictObject *);
567db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyDict_Pop(PyObject *, PyObject *, PyObject *);
577db96d56Sopenharmony_ci#define _PyDict_HasSplitTable(d) ((d)->ma_values != NULL)
587db96d56Sopenharmony_ci
597db96d56Sopenharmony_ci/* Like PyDict_Merge, but override can be 0, 1 or 2.  If override is 0,
607db96d56Sopenharmony_ci   the first occurrence of a key wins, if override is 1, the last occurrence
617db96d56Sopenharmony_ci   of a key wins, if override is 2, a KeyError with conflicting key as
627db96d56Sopenharmony_ci   argument is raised.
637db96d56Sopenharmony_ci*/
647db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyDict_MergeEx(PyObject *mp, PyObject *other, int override);
657db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyDict_SetItemId(PyObject *dp, _Py_Identifier *key, PyObject *item);
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyDict_DelItemId(PyObject *mp, _Py_Identifier *key);
687db96d56Sopenharmony_ciPyAPI_FUNC(void) _PyDict_DebugMallocStats(FILE *out);
697db96d56Sopenharmony_ci
707db96d56Sopenharmony_ci/* _PyDictView */
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_citypedef struct {
737db96d56Sopenharmony_ci    PyObject_HEAD
747db96d56Sopenharmony_ci    PyDictObject *dv_dict;
757db96d56Sopenharmony_ci} _PyDictViewObject;
767db96d56Sopenharmony_ci
777db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyDictView_New(PyObject *, PyTypeObject *);
787db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyDictView_Intersect(PyObject* self, PyObject *other);
79