| 
									
										
										
										
											2020-05-12 02:42:19 +02:00
										 |  |  | #ifndef Py_INTERNAL_HASHTABLE_H
 | 
					
						
							|  |  |  | #define Py_INTERNAL_HASHTABLE_H
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | extern "C" { | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef Py_BUILD_CORE
 | 
					
						
							|  |  |  | #  error "this header requires Py_BUILD_CORE define"
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2013-11-23 12:27:24 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-21 22:00:58 +01:00
										 |  |  | /* Single linked list */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-23 12:27:24 +01:00
										 |  |  | typedef struct _Py_slist_item_s { | 
					
						
							|  |  |  |     struct _Py_slist_item_s *next; | 
					
						
							|  |  |  | } _Py_slist_item_t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct { | 
					
						
							|  |  |  |     _Py_slist_item_t *head; | 
					
						
							|  |  |  | } _Py_slist_t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define _Py_SLIST_ITEM_NEXT(ITEM) (((_Py_slist_item_t *)ITEM)->next)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define _Py_SLIST_HEAD(SLIST) (((_Py_slist_t *)SLIST)->head)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-21 22:00:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* _Py_hashtable: table entry */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-23 12:27:24 +01:00
										 |  |  | typedef struct { | 
					
						
							|  |  |  |     /* used by _Py_hashtable_t.buckets to link entries */ | 
					
						
							|  |  |  |     _Py_slist_item_t _Py_slist_item; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Py_uhash_t key_hash; | 
					
						
							| 
									
										
										
										
											2020-05-13 02:26:02 +02:00
										 |  |  |     void *key; | 
					
						
							| 
									
										
										
										
											2020-05-13 04:40:30 +02:00
										 |  |  |     void *value; | 
					
						
							| 
									
										
										
										
											2013-11-23 12:27:24 +01:00
										 |  |  | } _Py_hashtable_entry_t; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-21 22:00:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* _Py_hashtable: prototypes */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-23 09:52:13 +01:00
										 |  |  | /* Forward declaration */ | 
					
						
							|  |  |  | struct _Py_hashtable_t; | 
					
						
							| 
									
										
										
										
											2020-05-12 13:31:59 +02:00
										 |  |  | typedef struct _Py_hashtable_t _Py_hashtable_t; | 
					
						
							| 
									
										
										
										
											2016-03-23 09:52:13 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-13 02:26:02 +02:00
										 |  |  | typedef Py_uhash_t (*_Py_hashtable_hash_func) (const void *key); | 
					
						
							|  |  |  | typedef int (*_Py_hashtable_compare_func) (const void *key1, const void *key2); | 
					
						
							| 
									
										
										
										
											2020-05-13 02:50:18 +02:00
										 |  |  | typedef void (*_Py_hashtable_destroy_func) (void *key); | 
					
						
							| 
									
										
										
										
											2020-05-12 13:31:59 +02:00
										 |  |  | typedef _Py_hashtable_entry_t* (*_Py_hashtable_get_entry_func)(_Py_hashtable_t *ht, | 
					
						
							| 
									
										
										
										
											2020-05-13 02:26:02 +02:00
										 |  |  |                                                                const void *key); | 
					
						
							| 
									
										
										
										
											2013-11-23 12:27:24 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2020-05-14 21:55:47 +02:00
										 |  |  |     // Allocate a memory block
 | 
					
						
							| 
									
										
										
										
											2013-11-23 12:27:24 +01:00
										 |  |  |     void* (*malloc) (size_t size); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-14 21:55:47 +02:00
										 |  |  |     // Release a memory block
 | 
					
						
							| 
									
										
										
										
											2013-11-23 12:27:24 +01:00
										 |  |  |     void (*free) (void *ptr); | 
					
						
							|  |  |  | } _Py_hashtable_allocator_t; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-21 22:00:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* _Py_hashtable: table */ | 
					
						
							| 
									
										
										
										
											2020-05-12 13:31:59 +02:00
										 |  |  | struct _Py_hashtable_t { | 
					
						
							| 
									
										
										
										
											2020-05-14 21:55:47 +02:00
										 |  |  |     size_t nentries; // Total number of entries in the table
 | 
					
						
							|  |  |  |     size_t nbuckets; | 
					
						
							| 
									
										
										
										
											2013-11-23 12:27:24 +01:00
										 |  |  |     _Py_slist_t *buckets; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-12 13:31:59 +02:00
										 |  |  |     _Py_hashtable_get_entry_func get_entry_func; | 
					
						
							| 
									
										
										
										
											2013-11-23 12:27:24 +01:00
										 |  |  |     _Py_hashtable_hash_func hash_func; | 
					
						
							|  |  |  |     _Py_hashtable_compare_func compare_func; | 
					
						
							| 
									
										
										
										
											2020-05-13 02:50:18 +02:00
										 |  |  |     _Py_hashtable_destroy_func key_destroy_func; | 
					
						
							| 
									
										
										
										
											2020-05-13 04:40:30 +02:00
										 |  |  |     _Py_hashtable_destroy_func value_destroy_func; | 
					
						
							| 
									
										
										
										
											2013-11-23 12:27:24 +01:00
										 |  |  |     _Py_hashtable_allocator_t alloc; | 
					
						
							| 
									
										
										
										
											2020-05-12 13:31:59 +02:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2013-11-23 12:27:24 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-14 21:55:47 +02:00
										 |  |  | /* Hash a pointer (void*) */ | 
					
						
							| 
									
										
										
										
											2020-05-13 02:26:02 +02:00
										 |  |  | PyAPI_FUNC(Py_uhash_t) _Py_hashtable_hash_ptr(const void *key); | 
					
						
							| 
									
										
										
										
											2016-03-21 22:00:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-14 21:55:47 +02:00
										 |  |  | /* Comparison using memcmp() */ | 
					
						
							| 
									
										
										
										
											2016-03-21 22:00:58 +01:00
										 |  |  | PyAPI_FUNC(int) _Py_hashtable_compare_direct( | 
					
						
							| 
									
										
										
										
											2020-05-13 02:26:02 +02:00
										 |  |  |     const void *key1, | 
					
						
							|  |  |  |     const void *key2); | 
					
						
							| 
									
										
										
										
											2013-11-23 12:27:24 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | PyAPI_FUNC(_Py_hashtable_t *) _Py_hashtable_new( | 
					
						
							|  |  |  |     _Py_hashtable_hash_func hash_func, | 
					
						
							|  |  |  |     _Py_hashtable_compare_func compare_func); | 
					
						
							| 
									
										
										
										
											2016-03-21 22:00:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-23 12:27:24 +01:00
										 |  |  | PyAPI_FUNC(_Py_hashtable_t *) _Py_hashtable_new_full( | 
					
						
							|  |  |  |     _Py_hashtable_hash_func hash_func, | 
					
						
							|  |  |  |     _Py_hashtable_compare_func compare_func, | 
					
						
							| 
									
										
										
										
											2020-05-13 02:50:18 +02:00
										 |  |  |     _Py_hashtable_destroy_func key_destroy_func, | 
					
						
							| 
									
										
										
										
											2020-05-13 04:40:30 +02:00
										 |  |  |     _Py_hashtable_destroy_func value_destroy_func, | 
					
						
							| 
									
										
										
										
											2013-11-23 12:27:24 +01:00
										 |  |  |     _Py_hashtable_allocator_t *allocator); | 
					
						
							| 
									
										
										
										
											2016-03-21 22:00:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | PyAPI_FUNC(void) _Py_hashtable_destroy(_Py_hashtable_t *ht); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-23 12:27:24 +01:00
										 |  |  | PyAPI_FUNC(void) _Py_hashtable_clear(_Py_hashtable_t *ht); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-21 22:00:58 +01:00
										 |  |  | typedef int (*_Py_hashtable_foreach_func) (_Py_hashtable_t *ht, | 
					
						
							| 
									
										
										
										
											2020-05-13 04:40:30 +02:00
										 |  |  |                                            const void *key, const void *value, | 
					
						
							|  |  |  |                                            void *user_data); | 
					
						
							| 
									
										
										
										
											2013-11-23 12:27:24 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-21 22:00:58 +01:00
										 |  |  | /* Call func() on each entry of the hashtable.
 | 
					
						
							|  |  |  |    Iteration stops if func() result is non-zero, in this case it's the result | 
					
						
							|  |  |  |    of the call. Otherwise, the function returns 0. */ | 
					
						
							| 
									
										
										
										
											2013-11-23 12:27:24 +01:00
										 |  |  | PyAPI_FUNC(int) _Py_hashtable_foreach( | 
					
						
							|  |  |  |     _Py_hashtable_t *ht, | 
					
						
							| 
									
										
										
										
											2016-03-21 22:00:58 +01:00
										 |  |  |     _Py_hashtable_foreach_func func, | 
					
						
							| 
									
										
										
										
											2020-05-13 04:40:30 +02:00
										 |  |  |     void *user_data); | 
					
						
							| 
									
										
										
										
											2016-03-21 22:00:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-13 04:40:30 +02:00
										 |  |  | PyAPI_FUNC(size_t) _Py_hashtable_size(const _Py_hashtable_t *ht); | 
					
						
							| 
									
										
										
										
											2013-11-23 12:27:24 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-21 22:00:58 +01:00
										 |  |  | /* Add a new entry to the hash. The key must not be present in the hash table.
 | 
					
						
							| 
									
										
										
										
											2020-05-13 04:40:30 +02:00
										 |  |  |    Return 0 on success, -1 on memory error. */ | 
					
						
							| 
									
										
										
										
											2013-11-23 12:27:24 +01:00
										 |  |  | PyAPI_FUNC(int) _Py_hashtable_set( | 
					
						
							|  |  |  |     _Py_hashtable_t *ht, | 
					
						
							| 
									
										
										
										
											2020-05-13 02:26:02 +02:00
										 |  |  |     const void *key, | 
					
						
							| 
									
										
										
										
											2020-05-13 04:40:30 +02:00
										 |  |  |     void *value); | 
					
						
							| 
									
										
										
										
											2016-03-21 22:00:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Get an entry.
 | 
					
						
							| 
									
										
										
										
											2020-05-13 04:40:30 +02:00
										 |  |  |    Return NULL if the key does not exist. */ | 
					
						
							| 
									
										
										
										
											2020-05-12 13:31:59 +02:00
										 |  |  | static inline _Py_hashtable_entry_t * | 
					
						
							| 
									
										
										
										
											2020-05-13 02:26:02 +02:00
										 |  |  | _Py_hashtable_get_entry(_Py_hashtable_t *ht, const void *key) | 
					
						
							| 
									
										
										
										
											2020-05-12 13:31:59 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2020-05-13 02:26:02 +02:00
										 |  |  |     return ht->get_entry_func(ht, key); | 
					
						
							| 
									
										
										
										
											2020-05-12 13:31:59 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-03-21 22:00:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-13 04:40:30 +02:00
										 |  |  | /* Get value from an entry.
 | 
					
						
							|  |  |  |    Return NULL if the entry is not found. | 
					
						
							| 
									
										
										
										
											2016-03-21 22:00:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-13 04:40:30 +02:00
										 |  |  |    Use _Py_hashtable_get_entry() to distinguish entry value equal to NULL | 
					
						
							|  |  |  |    and entry not found. */ | 
					
						
							| 
									
										
										
										
											2020-05-14 21:55:47 +02:00
										 |  |  | PyAPI_FUNC(void*) _Py_hashtable_get(_Py_hashtable_t *ht, const void *key); | 
					
						
							| 
									
										
										
										
											2016-03-21 22:00:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-14 21:55:47 +02:00
										 |  |  | /* Remove a key and its associated value without calling key and value destroy
 | 
					
						
							|  |  |  |    functions. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Return the removed value if the key was found. | 
					
						
							|  |  |  |    Return NULL if the key was not found. */ | 
					
						
							| 
									
										
										
										
											2020-05-13 04:40:30 +02:00
										 |  |  | PyAPI_FUNC(void*) _Py_hashtable_steal( | 
					
						
							| 
									
										
										
										
											2013-11-23 12:27:24 +01:00
										 |  |  |     _Py_hashtable_t *ht, | 
					
						
							| 
									
										
										
										
											2020-05-13 04:40:30 +02:00
										 |  |  |     const void *key); | 
					
						
							| 
									
										
										
										
											2013-11-23 12:27:24 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-12 02:42:19 +02:00
										 |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2013-11-23 12:27:24 +01:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-05-12 02:42:19 +02:00
										 |  |  | #endif   /* !Py_INTERNAL_HASHTABLE_H */
 |