knight/shared/KeHashTable.h
author David Anderson <dvander@alliedmods.net>
Fri Aug 15 05:22:26 2008 +0000 (2008-08-15)
changeset 2226 d10b38524be3
child 2541 0352326a1f3f
permissions -rw-r--r--
Landed sourcepawn-1.2. The big changes:

1) JIT compilation/optimization now occurs per-function, and only when functions are first used. We're now officially a whole-method JIT rather than an AOT compiler (albiet, still a simple JIT). This has two implications: Functions are now much better abstracted internally, and loading a plugin is now much less expensive. If a function contains calls to other functions, THOSE functions are only compiled when they're invoked as well.

2) I've removed debug mode. We always show full backtraces now, as there was a very cheap way to implement this which really cleaned up everything. This is great for a number of reasons -- there's less code, the JIT is better designed, we don't need to relocate debug tables, and best of all we no longer have to tell users to enable debug mode at their own expense.
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@2226
   120
	 * @brief Generic function for hasing 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@2226
   126
}
dvander@2226
   127
dvander@2226
   128
#endif //_INCLUDE_KNIGHT_KE_HASHTABLE_H_