138 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C
		
	
	
	
#ifndef HASHTABLE_H
 | 
						|
#define HASHTABLE_H 1
 | 
						|
 | 
						|
#include <dix-config.h>
 | 
						|
#include <X11/Xfuncproto.h>
 | 
						|
#include <X11/Xdefs.h>
 | 
						|
#include "list.h"
 | 
						|
 | 
						|
/** @brief A hashing function.
 | 
						|
 | 
						|
  @param[in/out] cdata  Opaque data that can be passed to HtInit that will
 | 
						|
                        eventually end up here
 | 
						|
  @param[in] ptr        The data to be hashed. The size of the data, if
 | 
						|
                        needed, can be configured via a record that can be
 | 
						|
                        passed via cdata.
 | 
						|
  @param[in] numBits    The number of bits this hash needs to have in the
 | 
						|
                        resulting hash
 | 
						|
 | 
						|
  @return  A numBits-bit hash of the data
 | 
						|
*/
 | 
						|
typedef unsigned (*HashFunc)(void * cdata, const void * ptr, int numBits);
 | 
						|
 | 
						|
/** @brief A comparison function for hashed keys.
 | 
						|
 | 
						|
  @param[in/out] cdata  Opaque data that ca be passed to Htinit that will
 | 
						|
                        eventually end up here
 | 
						|
  @param[in] l          The left side data to be compared
 | 
						|
  @param[in] r          The right side data to be compared
 | 
						|
 | 
						|
  @return -1 if l < r, 0 if l == r, 1 if l > r
 | 
						|
*/
 | 
						|
typedef int (*HashCompareFunc)(void * cdata, const void * l, const void * r);
 | 
						|
 | 
						|
struct HashTableRec;
 | 
						|
 | 
						|
typedef struct HashTableRec *HashTable;
 | 
						|
 | 
						|
/** @brief  A configuration for HtGenericHash */
 | 
						|
typedef struct {
 | 
						|
    int             keySize;
 | 
						|
} HtGenericHashSetupRec, *HtGenericHashSetupPtr;
 | 
						|
 | 
						|
/** @brief  ht_create initializes a hash table for a certain hash table
 | 
						|
            configuration
 | 
						|
 | 
						|
    @param[out] ht       The hash table structure to initialize
 | 
						|
    @param[in] keySize   The key size in bytes
 | 
						|
    @param[in] dataSize  The data size in bytes
 | 
						|
    @param[in] hash      The hash function to use for hashing keys
 | 
						|
    @param[in] compare   The comparison function for hashing keys
 | 
						|
    @param[in] cdata     Opaque data that will be passed to hash and
 | 
						|
                         comparison functions
 | 
						|
*/
 | 
						|
extern _X_EXPORT HashTable ht_create(int             keySize,
 | 
						|
                                     int             dataSize,
 | 
						|
                                     HashFunc        hash,
 | 
						|
                                     HashCompareFunc compare,
 | 
						|
                                     void            *cdata);
 | 
						|
/** @brief  HtDestruct deinitializes the structure. It does not free the
 | 
						|
            memory allocated to HashTableRec
 | 
						|
*/
 | 
						|
extern _X_EXPORT void ht_destroy(HashTable ht);
 | 
						|
 | 
						|
/** @brief  Adds a new key to the hash table. The key will be copied
 | 
						|
            and a pointer to the value will be returned. The data will
 | 
						|
            be initialized with zeroes.
 | 
						|
 | 
						|
  @param[in/out] ht  The hash table
 | 
						|
  @param[key] key    The key. The contents of the key will be copied.
 | 
						|
 | 
						|
  @return On error NULL is returned, otherwise a pointer to the data
 | 
						|
          associated with the newly inserted key.
 | 
						|
 | 
						|
  @note  If dataSize is 0, a pointer to the end of the key may be returned
 | 
						|
         to avoid returning NULL. Obviously the data pointed cannot be
 | 
						|
         modified, as implied by dataSize being 0.
 | 
						|
*/
 | 
						|
extern _X_EXPORT void *ht_add(HashTable ht, const void *key);
 | 
						|
 | 
						|
/** @brief  Removes a key from the hash table along with its
 | 
						|
            associated data, which will be free'd.
 | 
						|
*/
 | 
						|
extern _X_EXPORT void ht_remove(HashTable ht, const void *key);
 | 
						|
 | 
						|
/** @brief  Finds the associated data of a key from the hash table.
 | 
						|
 | 
						|
   @return  If the key cannot be found, the function returns NULL.
 | 
						|
            Otherwise it returns a pointer to the data associated
 | 
						|
            with the key.
 | 
						|
 | 
						|
   @note  If dataSize == 0, this function may return NULL
 | 
						|
          even if the key has been inserted! If dataSize == NULL,
 | 
						|
          use HtMember instead to determine if a key has been
 | 
						|
          inserted.
 | 
						|
*/
 | 
						|
extern _X_EXPORT void *ht_find(HashTable ht, const void *key);
 | 
						|
 | 
						|
/** @brief  A generic hash function */
 | 
						|
extern _X_EXPORT unsigned ht_generic_hash(void *cdata,
 | 
						|
                                          const void *ptr,
 | 
						|
                                          int numBits);
 | 
						|
 | 
						|
/** @brief  A generic comparison function. It compares data byte-wise. */
 | 
						|
extern _X_EXPORT int ht_generic_compare(void *cdata,
 | 
						|
                                        const void *l,
 | 
						|
                                        const void *r);
 | 
						|
 | 
						|
/** @brief  A debugging function that dumps the distribution of the
 | 
						|
            hash table: for each bucket, list the number of elements
 | 
						|
            contained within. */
 | 
						|
extern _X_EXPORT void ht_dump_distribution(HashTable ht);
 | 
						|
 | 
						|
/** @brief  A debugging function that dumps the contents of the hash
 | 
						|
            table: for each bucket, list the elements contained
 | 
						|
            within. */
 | 
						|
extern _X_EXPORT void ht_dump_contents(HashTable ht,
 | 
						|
                                       void (*print_key)(void *opaque, void *key),
 | 
						|
                                       void (*print_value)(void *opaque, void *value),
 | 
						|
                                       void* opaque);
 | 
						|
 | 
						|
/** @brief  A hashing function to be used for hashing resource IDs when
 | 
						|
            used with HashTables. It makes no use of cdata, so that can
 | 
						|
            be NULL. It uses HashXID underneath, and should HashXID be
 | 
						|
            unable to hash the value, it switches into using the generic
 | 
						|
            hash function. */
 | 
						|
extern _X_EXPORT unsigned ht_resourceid_hash(void *cdata,
 | 
						|
                                             const void * data,
 | 
						|
                                             int numBits);
 | 
						|
 | 
						|
/** @brief  A comparison function to be used for comparing resource
 | 
						|
            IDs when used with HashTables. It makes no use of cdata,
 | 
						|
            so that can be NULL. */
 | 
						|
extern _X_EXPORT int ht_resourceid_compare(void *cdata,
 | 
						|
                                           const void *a,
 | 
						|
                                           const void *b);
 | 
						|
 | 
						|
#endif // HASHTABLE_H
 |