knight/shared/KeHashTable.h
author Nicholas Hastings <skamonkey@gmail.com>
Tue Dec 18 17:58:45 2012 -0500 (2012-12-18)
changeset 3712 ea253cc4fbf6
parent 2541 0352326a1f3f
child 3980 dc7dfcd855dc
permissions -rw-r--r--
Added support for new SPROP_VARINT sendprops.
dvander@2226
     1
#ifndef _INCLUDE_KNIGHT_KE_HASHTABLE_H_
dvander@2226
     2
#define _INCLUDE_KNIGHT_KE_HASHTABLE_H_
dvander@2226
     3
dvander@2226
     4
#include <KeStdTypes.h>
dvander@2226
     5
#include <KnightAllocator.h>
dvander@2226
     6
dvander@2226
     7
namespace Knight
dvander@2226
     8
{
dvander@2226
     9
	class KeHashTable;
dvander@2226
    10
dvander@2226
    11
	/**
dvander@2226
    12
	 * @brief Must generate a hash function given a key.
dvander@2226
    13
	 *
dvander@2226
    14
	 * @param key				Pointer to the key.
dvander@2226
    15
	 * @return					Hash value.
dvander@2226
    16
	 */
dvander@2226
    17
	typedef uint32_t (*KeHashGenerator)(const void *key);
dvander@2226
    18
dvander@2226
    19
	/**
dvander@2226
    20
	 * @brief Must compare two values.
dvander@2226
    21
	 *
dvander@2226
    22
	 * @param val1				First value.
dvander@2226
    23
	 * @param val2				Second value.
dvander@2226
    24
	 * @return					True if equal, false if not.
dvander@2226
    25
	 */
dvander@2226
    26
	typedef bool (*KeHashComparator)(const void *val1, const void *val2);
dvander@2226
    27
dvander@2226
    28
	/**
dvander@2226
    29
	 * @brief Must call the destructor of the given data, and free if necessary.
dvander@2226
    30
	 *
dvander@2226
    31
	 * @param val				Pointer to data.
dvander@2226
    32
	 */
dvander@2226
    33
	typedef void (*KeHashDestructor)(const void *val);
dvander@2226
    34
dvander@2226
    35
	/**
dvander@2226
    36
	 * @brief Must transfer the contents of an object from the source to the destination.
dvander@2226
    37
	 *
dvander@2226
    38
	 * @param dest				Destination address.
dvander@2226
    39
	 * @param source			Source address.
dvander@2226
    40
	 */
dvander@2226
    41
	typedef void (*KeHashCopyCtor)(void *dest, const void *source);
dvander@2226
    42
dvander@2226
    43
	/**
dvander@2226
    44
	 * @brief Contains information about how to process keys and values in a hash table.
dvander@2226
    45
	 */
dvander@2226
    46
	struct KeHashMarshal
dvander@2226
    47
	{
dvander@2226
    48
		size_t bytes;				/**< Bytes of storage needed (0 to use pointers). */
dvander@2226
    49
		KeHashComparator cmp;		/**< Comparator (if NULL, void * comparison used) */
dvander@2226
    50
		KeHashDestructor dtor;		/**< Optional function for performing dtor cleanup. */
dvander@2226
    51
		KeHashCopyCtor ctor;		/**< If bytes != 0, must be a valid function 
dvander@2226
    52
										 (ignored otherwise). */
dvander@2226
    53
	};
dvander@2226
    54
dvander@2226
    55
	/**
dvander@2226
    56
	 * @brief Creates a new hash table structure.
dvander@2226
    57
	 *
dvander@2226
    58
	 * @param bits				Dictates starting number of buckets as a power of two.
dvander@2226
    59
	 *							Pass 0 for the default (which is 4).
dvander@2226
    60
	 * @param key_gen			Key generation function.
dvander@2226
    61
	 * @param key_marshal		Structure detailing how to marshal keys.
dvander@2226
    62
	 * @param vak_marshal		Structure detailing how to marshal values.
dvander@2226
    63
	 * @param nodeAlloc			Node allocator (can be NULL for malloc/free).
dvander@2226
    64
	 * @param keep_free_list	True to keep a free list of nodes, false otherwise.
dvander@2226
    65
	 * @return					New hash table container.
dvander@2226
    66
	 */
dvander@2226
    67
	extern KeHashTable *KE_CreateHashTable(
dvander@2226
    68
		uint32_t bits,
dvander@2226
    69
		KeHashGenerator key_gen,
dvander@2226
    70
		const KeHashMarshal *key_marshal,
dvander@2226
    71
		const KeHashMarshal *val_marshal,
dvander@2226
    72
		ke_allocator_t *nodeAlloc,
dvander@2226
    73
		bool keep_free_list
dvander@2226
    74
		);
dvander@2226
    75
dvander@2226
    76
	/**
dvander@2226
    77
	 * @brief Destroys a hash table.
dvander@2226
    78
	 *
dvander@2226
    79
	 * @param table				Hash table.
dvander@2226
    80
	 */
dvander@2226
    81
	extern void KE_DestroyHashTable(KeHashTable *table);
dvander@2226
    82
dvander@2226
    83
	/**
dvander@2226
    84
	 * @brief Adds a key/value to the hash table.  If the pair already exists, the old value 
dvander@2226
    85
	 * is overwritten (calling any destructors as necessary).
dvander@2226
    86
	 *
dvander@2226
    87
	 * @param table				Hash table.
dvander@2226
    88
	 * @param key				Key pointer.
dvander@2226
    89
	 * @param val				Value pointer.
dvander@2226
    90
	 */
dvander@2226
    91
	extern void KE_AddToHashTable(KeHashTable *table, const void *key, void *val);
dvander@2226
    92
dvander@2226
    93
	/**
dvander@2226
    94
	 * @brief Removes a key entry from the hash table.
dvander@2226
    95
	 *
dvander@2226
    96
	 * @param table				Hash table.
dvander@2226
    97
	 * @param key				Key pointer.
dvander@2226
    98
	 */
dvander@2226
    99
	extern void KE_RemoveFromHashTable(KeHashTable *table, const void *key);
dvander@2226
   100
dvander@2226
   101
	/**
dvander@2226
   102
	 * @brief Finds an entry in the hash table.
dvander@2226
   103
	 *
dvander@2226
   104
	 * @param table				Hash table.
dvander@2226
   105
	 * @param key				Key pointer.
dvander@2226
   106
	 * @param value				Pointer to store the value (optional).
dvander@2226
   107
	 * @return					On success, true is returned and value is filled if given.
dvander@2226
   108
	 *							On failure, false is failed and outputs are undefined.
dvander@2226
   109
	 */
dvander@2226
   110
	extern bool KE_FindInHashTable(KeHashTable *table, const void *key, void **value);
dvander@2226
   111
dvander@2226
   112
	/**
dvander@2226
   113
	 * @brief Clears all entries in the hash table (caching free entries when possible).
dvander@2226
   114
	 *
dvander@2226
   115
	 * @param table				Hash table.
dvander@2226
   116
	 */
dvander@2226
   117
	extern void KE_ClearHashTable(KeHashTable *table);
dvander@2226
   118
dvander@2226
   119
	/**
dvander@2541
   120
	 * @brief Generic function for hashing strings.
dvander@2226
   121
	 *
dvander@2226
   122
	 * @param str				Key string.
dvander@2226
   123
	 * @return					Hash value.
dvander@2226
   124
	 */
dvander@2226
   125
	extern uint32_t KE_HashString(const void *str);
dvander@2541
   126
dvander@2541
   127
    /**
dvander@2541
   128
     * @brief Generic case-sensitive comparison of strings.
dvander@2541
   129
     *
dvander@2541
   130
     * @param str1              First string.
dvander@2541
   131
     * @param str2              Second string.
dvander@2541
   132
     * @return                  True if equal, false otherwise.
dvander@2541
   133
     */
dvander@2541
   134
    extern bool KE_AreStringsEqual(const void* str1, const void* str2);
dvander@2226
   135
}
dvander@2226
   136
dvander@2226
   137
#endif //_INCLUDE_KNIGHT_KE_HASHTABLE_H_
dvander@2541
   138