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 | |