@@ -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
0 commit comments