1 #ifndef Py_DICT_COMMON_H
2 #define Py_DICT_COMMON_H
3 
4 typedef struct {
5     /* Cached hash code of me_key. */
6     Py_hash_t me_hash;
7     PyObject *me_key;
8     PyObject *me_value; /* This field is only meaningful for combined tables */
9 } PyDictKeyEntry;
10 
11 /* dict_lookup_func() returns index of entry which can be used like DK_ENTRIES(dk)[index].
12  * -1 when no entry found, -3 when compare raises error.
13  */
14 typedef Py_ssize_t (*dict_lookup_func)
15     (PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject **value_addr);
16 
17 #define DKIX_EMPTY (-1)
18 #define DKIX_DUMMY (-2)  /* Used internally */
19 #define DKIX_ERROR (-3)
20 
21 /* See dictobject.c for actual layout of DictKeysObject */
22 struct _dictkeysobject {
23     Py_ssize_t dk_refcnt;
24 
25     /* Size of the hash table (dk_indices). It must be a power of 2. */
26     Py_ssize_t dk_size;
27 
28     /* Function to lookup in the hash table (dk_indices):
29 
30        - lookdict(): general-purpose, and may return DKIX_ERROR if (and
31          only if) a comparison raises an exception.
32 
33        - lookdict_unicode(): specialized to Unicode string keys, comparison of
34          which can never raise an exception; that function can never return
35          DKIX_ERROR.
36 
37        - lookdict_unicode_nodummy(): similar to lookdict_unicode() but further
38          specialized for Unicode string keys that cannot be the <dummy> value.
39 
40        - lookdict_split(): Version of lookdict() for split tables. */
41     dict_lookup_func dk_lookup;
42 
43     /* Number of usable entries in dk_entries. */
44     Py_ssize_t dk_usable;
45 
46     /* Number of used entries in dk_entries. */
47     Py_ssize_t dk_nentries;
48 
49     /* Actual hash table of dk_size entries. It holds indices in dk_entries,
50        or DKIX_EMPTY(-1) or DKIX_DUMMY(-2).
51 
52        Indices must be: 0 <= indice < USABLE_FRACTION(dk_size).
53 
54        The size in bytes of an indice depends on dk_size:
55 
56        - 1 byte if dk_size <= 0xff (char*)
57        - 2 bytes if dk_size <= 0xffff (int16_t*)
58        - 4 bytes if dk_size <= 0xffffffff (int32_t*)
59        - 8 bytes otherwise (int64_t*)
60 
61        Dynamically sized, SIZEOF_VOID_P is minimum. */
62     char dk_indices[];  /* char is required to avoid strict aliasing. */
63 
64     /* "PyDictKeyEntry dk_entries[dk_usable];" array follows:
65        see the DK_ENTRIES() macro */
66 };
67 
68 #endif
69