| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 9e2ca17 commit f9b3b58
4 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -30,32 +30,13 @@ typedef struct { | |||
| 30 | 30 | _Py_slist_item_t _Py_slist_item; | |
| 31 | 31 | ||
| 32 | 32 | Py_uhash_t key_hash; | |
| 33 | - | ||
| 34 | - /* key (key_size bytes) and then data (data_size bytes) follows */ | ||
| 33 | + void *key; | ||
| 34 | + /* data (data_size bytes) follows */ | ||
| 35 | 35 | } _Py_hashtable_entry_t; | |
| 36 | 36 | ||
| 37 | - #define _Py_HASHTABLE_ENTRY_PKEY(ENTRY) \ | ||
| 38 | - ((const void *)((char *)(ENTRY) \ | ||
| 39 | - + sizeof(_Py_hashtable_entry_t))) | ||
| 40 | - | ||
| 41 | 37 | #define _Py_HASHTABLE_ENTRY_PDATA(TABLE, ENTRY) \ | |
| 42 | 38 | ((const void *)((char *)(ENTRY) \ | |
| 43 | - + sizeof(_Py_hashtable_entry_t) \ | ||
| 44 | - + (TABLE)->key_size)) | ||
| 45 | - | ||
| 46 | - /* Get a key value from pkey: use memcpy() rather than a pointer dereference | ||
| 47 | - to avoid memory alignment issues. */ | ||
| 48 | - #define _Py_HASHTABLE_READ_KEY(TABLE, PKEY, DST_KEY) \ | ||
| 49 | - do { \ | ||
| 50 | - assert(sizeof(DST_KEY) == (TABLE)->key_size); \ | ||
| 51 | - memcpy(&(DST_KEY), (PKEY), sizeof(DST_KEY)); \ | ||
| 52 | - } while (0) | ||
| 53 | - | ||
| 54 | - #define _Py_HASHTABLE_ENTRY_READ_KEY(TABLE, ENTRY, KEY) \ | ||
| 55 | - do { \ | ||
| 56 | - assert(sizeof(KEY) == (TABLE)->key_size); \ | ||
| 57 | - memcpy(&(KEY), _Py_HASHTABLE_ENTRY_PKEY(ENTRY), sizeof(KEY)); \ | ||
| 58 | - } while (0) | ||
| 39 | + + sizeof(_Py_hashtable_entry_t))) | ||
| 59 | 40 | ||
| 60 | 41 | #define _Py_HASHTABLE_ENTRY_READ_DATA(TABLE, ENTRY, DATA) \ | |
| 61 | 42 | do { \ | |
@@ -78,15 +59,12 @@ typedef struct { | |||
| 78 | 59 | struct _Py_hashtable_t; | |
| 79 | 60 | typedef struct _Py_hashtable_t _Py_hashtable_t; | |
| 80 | 61 | ||
| 81 | - typedef Py_uhash_t (*_Py_hashtable_hash_func) (_Py_hashtable_t *ht, | ||
| 82 | - const void *pkey); | ||
| 83 | - typedef int (*_Py_hashtable_compare_func) (_Py_hashtable_t *ht, | ||
| 84 | - const void *pkey, | ||
| 85 | - const _Py_hashtable_entry_t *he); | ||
| 62 | + typedef Py_uhash_t (*_Py_hashtable_hash_func) (const void *key); | ||
| 63 | + typedef int (*_Py_hashtable_compare_func) (const void *key1, const void *key2); | ||
| 86 | 64 | typedef _Py_hashtable_entry_t* (*_Py_hashtable_get_entry_func)(_Py_hashtable_t *ht, | |
| 87 | - const void *pkey); | ||
| 65 | + const void *key); | ||
| 88 | 66 | typedef int (*_Py_hashtable_get_func) (_Py_hashtable_t *ht, | |
| 89 | - const void *pkey, void *data); | ||
| 67 | + const void *key, void *data); | ||
| 90 | 68 | ||
| 91 | 69 | typedef struct { | |
| 92 | 70 | /* allocate a memory block */ | |
@@ -102,7 +80,6 @@ struct _Py_hashtable_t { | |||
| 102 | 80 | size_t num_buckets; | |
| 103 | 81 | size_t entries; /* Total number of entries in the table. */ | |
| 104 | 82 | _Py_slist_t *buckets; | |
| 105 | - size_t key_size; | ||
| 106 | 83 | size_t data_size; | |
| 107 | 84 | ||
| 108 | 85 | _Py_hashtable_get_func get_func; | |
@@ -113,24 +90,19 @@ struct _Py_hashtable_t { | |||
| 113 | 90 | }; | |
| 114 | 91 | ||
| 115 | 92 | /* hash a pointer (void*) */ | |
| 116 | - PyAPI_FUNC(Py_uhash_t) _Py_hashtable_hash_ptr( | ||
| 117 | - struct _Py_hashtable_t *ht, | ||
| 118 | - const void *pkey); | ||
| 93 | + PyAPI_FUNC(Py_uhash_t) _Py_hashtable_hash_ptr(const void *key); | ||
| 119 | 94 | ||
| 120 | 95 | /* comparison using memcmp() */ | |
| 121 | 96 | PyAPI_FUNC(int) _Py_hashtable_compare_direct( | |
| 122 | - _Py_hashtable_t *ht, | ||
| 123 | - const void *pkey, | ||
| 124 | - const _Py_hashtable_entry_t *entry); | ||
| 97 | + const void *key1, | ||
| 98 | + const void *key2); | ||
| 125 | 99 | ||
| 126 | 100 | PyAPI_FUNC(_Py_hashtable_t *) _Py_hashtable_new( | |
| 127 | - size_t key_size, | ||
| 128 | 101 | size_t data_size, | |
| 129 | 102 | _Py_hashtable_hash_func hash_func, | |
| 130 | 103 | _Py_hashtable_compare_func compare_func); | |
| 131 | 104 | ||
| 132 | 105 | PyAPI_FUNC(_Py_hashtable_t *) _Py_hashtable_new_full( | |
| 133 | - size_t key_size, | ||
| 134 | 106 | size_t data_size, | |
| 135 | 107 | size_t init_size, | |
| 136 | 108 | _Py_hashtable_hash_func hash_func, | |
@@ -165,16 +137,15 @@ PyAPI_FUNC(size_t) _Py_hashtable_size(_Py_hashtable_t *ht); | |||
| 165 | 137 | but use _Py_HASHTABLE_SET() and _Py_HASHTABLE_SET_NODATA() macros */ | |
| 166 | 138 | PyAPI_FUNC(int) _Py_hashtable_set( | |
| 167 | 139 | _Py_hashtable_t *ht, | |
| 168 | - size_t key_size, | ||
| 169 | - const void *pkey, | ||
| 140 | + const void *key, | ||
| 170 | 141 | size_t data_size, | |
| 171 | 142 | const void *data); | |
| 172 | 143 | ||
| 173 | 144 | #define _Py_HASHTABLE_SET(TABLE, KEY, DATA) \ | |
| 174 | - _Py_hashtable_set(TABLE, sizeof(KEY), &(KEY), sizeof(DATA), &(DATA)) | ||
| 145 | + _Py_hashtable_set(TABLE, (KEY), sizeof(DATA), &(DATA)) | ||
| 175 | 146 | ||
| 176 | 147 | #define _Py_HASHTABLE_SET_NODATA(TABLE, KEY) \ | |
| 177 | - _Py_hashtable_set(TABLE, sizeof(KEY), &(KEY), 0, NULL) | ||
| 148 | + _Py_hashtable_set(TABLE, (KEY), 0, NULL) | ||
| 178 | 149 | ||
| 179 | 150 | ||
| 180 | 151 | /* Get an entry. | |
@@ -183,43 +154,40 @@ PyAPI_FUNC(int) _Py_hashtable_set( | |||
| 183 | 154 | Don't call directly this function, but use _Py_HASHTABLE_GET_ENTRY() | |
| 184 | 155 | macro */ | |
| 185 | 156 | static inline _Py_hashtable_entry_t * | |
| 186 | - _Py_hashtable_get_entry(_Py_hashtable_t *ht, size_t key_size, const void *pkey) | ||
| 157 | + _Py_hashtable_get_entry(_Py_hashtable_t *ht, const void *key) | ||
| 187 | 158 | { | |
| 188 | - assert(key_size == ht->key_size); | ||
| 189 | - return ht->get_entry_func(ht, pkey); | ||
| 159 | + return ht->get_entry_func(ht, key); | ||
| 190 | 160 | } | |
| 191 | 161 | ||
| 192 | 162 | #define _Py_HASHTABLE_GET_ENTRY(TABLE, KEY) \ | |
| 193 | - _Py_hashtable_get_entry(TABLE, sizeof(KEY), &(KEY)) | ||
| 163 | + _Py_hashtable_get_entry(TABLE, (const void *)(KEY)) | ||
| 194 | 164 | ||
| 195 | 165 | ||
| 196 | 166 | /* Get data from an entry. Copy entry data into data and return 1 if the entry | |
| 197 | 167 | exists, return 0 if the entry does not exist. | |
| 198 | 168 | ||
| 199 | 169 | Don't call directly this function, but use _Py_HASHTABLE_GET() macro */ | |
| 200 | 170 | static inline int | |
| 201 | - _Py_hashtable_get(_Py_hashtable_t *ht, size_t key_size, const void *pkey, | ||
| 171 | + _Py_hashtable_get(_Py_hashtable_t *ht, const void *key, | ||
| 202 | 172 | size_t data_size, void *data) | |
| 203 | 173 | { | |
| 204 | - assert(key_size == ht->key_size); | ||
| 205 | 174 | assert(data_size == ht->data_size); | |
| 206 | - return ht->get_func(ht, pkey, data); | ||
| 175 | + return ht->get_func(ht, key, data); | ||
| 207 | 176 | } | |
| 208 | 177 | ||
| 209 | 178 | #define _Py_HASHTABLE_GET(TABLE, KEY, DATA) \ | |
| 210 | - _Py_hashtable_get(TABLE, sizeof(KEY), &(KEY), sizeof(DATA), &(DATA)) | ||
| 179 | + _Py_hashtable_get(TABLE, (KEY), sizeof(DATA), &(DATA)) | ||
| 211 | 180 | ||
| 212 | 181 | ||
| 213 | 182 | /* Don't call directly this function, but use _Py_HASHTABLE_POP() macro */ | |
| 214 | 183 | PyAPI_FUNC(int) _Py_hashtable_pop( | |
| 215 | 184 | _Py_hashtable_t *ht, | |
| 216 | - size_t key_size, | ||
| 217 | - const void *pkey, | ||
| 185 | + const void *key, | ||
| 218 | 186 | size_t data_size, | |
| 219 | 187 | void *data); | |
| 220 | 188 | ||
| 221 | 189 | #define _Py_HASHTABLE_POP(TABLE, KEY, DATA) \ | |
| 222 | - _Py_hashtable_pop(TABLE, sizeof(KEY), &(KEY), sizeof(DATA), &(DATA)) | ||
| 190 | + _Py_hashtable_pop(TABLE, (KEY), sizeof(DATA), &(DATA)) | ||
| 223 | 191 | ||
| 224 | 192 | ||
| 225 | 193 | #ifdef __cplusplus | |
| Back | FazBrowse Home | New Git URL |
0 commit comments