Home | History | Annotate | Download | only in Objects
      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