circlemud_squared_0.5.153/cnf/
circlemud_squared_0.5.153/etc/
circlemud_squared_0.5.153/etc/etc/
circlemud_squared_0.5.153/etc/house/
circlemud_squared_0.5.153/etc/misc/
circlemud_squared_0.5.153/etc/plralias/A-E/
circlemud_squared_0.5.153/etc/plralias/F-J/
circlemud_squared_0.5.153/etc/plralias/K-O/
circlemud_squared_0.5.153/etc/plralias/P-T/
circlemud_squared_0.5.153/etc/plralias/U-Z/
circlemud_squared_0.5.153/etc/plralias/ZZZ/
circlemud_squared_0.5.153/etc/plrobjs/
circlemud_squared_0.5.153/etc/plrobjs/A-E/
circlemud_squared_0.5.153/etc/plrobjs/F-J/
circlemud_squared_0.5.153/etc/plrobjs/K-O/
circlemud_squared_0.5.153/etc/plrobjs/P-T/
circlemud_squared_0.5.153/etc/plrobjs/U-Z/
circlemud_squared_0.5.153/etc/plrobjs/ZZZ/
circlemud_squared_0.5.153/etc/text/
circlemud_squared_0.5.153/etc/text/help/
circlemud_squared_0.5.153/src/util/
circlemud_squared_0.5.153/src/util/worldconv/
/**
 * @file hashMap.h
 * @ingroup collection
 *
 * Hashmap module.
 *
 * @author Geoff Davis <geoff@circlemudsquared.org>
 *
 * @par Copyright:
 *   Copyright (C) 2006 Geoff Davis <geoff@circlemudsquared.org><br>
 *                      Greg Buxton <greg@circlemudsquared.org>
 *
 * @par
 *   Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University<br>
 *   CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991.
 *
 * @par
 *   All rights reserved.  See license.doc for complete information.
 *
 * @package cs
 * @version 1.0
 */

#ifndef __HASHMAP_H__
#define __HASHMAP_H__

#include "base.h"

/**
 * An alias for struct _hashMap_t.
 * @typedef struct _hashMap_t
 */
typedef struct _hashMap_t hashMap_t;

/**
 * An alias for struct _hashMapEntry_t.
 * @typedef struct _hashMapEntry_t
 */
typedef struct _hashMapEntry_t hashMapEntry_t;

/**
 * An alias for struct _hashMapIterator_t.
 * @typedef struct _hashMapIterator_t
 */
typedef struct _hashMapIterator_t hashMapIterator_t;

/**
 * The type of a hash key.
 * @typedef unsigned long
 */
typedef unsigned long hashKey_t;

/**
 * The type of a hash function. Functions of this type are used to create
 * a hash code, also known as a hash key, for a given user-provided key.
 * @typedef hashKey_t (*)(const void*)
 */
typedef hashKey_t (*hashFunction_t)(const void *key);

/**
 * The hash map structure.
 * @{
 */
struct _hashMap_t {
  hashMapEntry_t **entryTable;          /**< the vector of hash entry lists.*/
  size_t           entryTableSize;      /**< the size of the entry table.   */
  hashFunction_t   keyHashFunction;     /**< the function to hash map keys. */
  freeFunction_t   keyFreeFunction;     /**< the free function for keys.    */
  size_t           size;                /**< the number of entries (elements)*/
  freeFunction_t   valueFreeFunction;   /**< the free function for values.  */
};
/** @} */

/**
 * The hashmap entry structure.
 * @{
 */
struct _hashMapEntry_t {
  hashKey_t        hashKey;             /**< the hash key for the key.      */
  void            *key;                 /**< the key of the entry.          */
  hashMapEntry_t  *nextEntry;           /**< the next entry in the hash list*/
  void            *value;               /**< the value of the entry.        */
};
/** @} */

/**
 * The hashmap iterator structure.
 * @{
 */
struct _hashMapIterator_t {
  hashMap_t       *hashMap;             /**< the hashmap being iterated.    */
  hashMapEntry_t  *lastReturned;        /**< the last entry returned.       */
  hashMapEntry_t  *nextEntry;           /**< the next entry to be returned. */
  size_t           nextEntryIndex;      /**< the index of current hash list.*/
};
/** @} */

/*
 * hashmap functions
 */

/**
 * Removes all elements from a hashmap.
 * @param hashMap the hashmap to be cleared
 * @return none
 */
void hashMap_clear(hashMap_t *hashMap);

/**
 * Returns whether a hashmap contains a particular key.
 * @param hashMap the hashmap whose contents are to be tested
 * @param key the key for which to test
 * @return true if the hashmap contains a matching key;
 *         false otherwise
 */
bool hashMap_containsKey(hashMap_t *hashMap, const void *key);

/**
 * Constructs a new hashmap.
 * @param entryTableSize the initial size of the hashmap entry table
 * @param hashFunction the hash function to be used to hash keys
 * @param keyFreeFunction the free function to be called for map keys
 * @param valueFreeFunction the free function to be called for map values
 * @return a new hashmap, or NULL
 */
hashMap_t *hashMap_create(size_t entryTableSize, hashFunction_t hashFunction,
  freeFunction_t keyFreeFunction, freeFunction_t valueFreeFunction);

/**
 * Deletes a mapping from a hashmap.
 * @param hashMap the hashmap from which to remove a mapping
 * @param key the key of the mapping to be removed
 * @return true if the size of the hashmap was changed by this function;
 *         false otherwise
 */
bool hashMap_delete(hashMap_t *hashMap, const void *key);

/**
 * Frees a hashmap.
 * @param hashMap the hashmap to be freed
 * @return none
 */
void hashMap_free(hashMap_t *hashMap);

/**
 * Returns the size of a hashmap.
 * @param hashMap the hashmap to be tested
 * @return the size of the hashmap, or zero (0)
 */
size_t hashMap_getSize(hashMap_t *hashMap);

/**
 * Returns the value for a given key.
 * @param hashMap the hashmap to be searched
 * @param key the key for which to retreive a value
 * @param defaultValue the value to be retuned if the key cannot be not found
 * @return the value associated with the key, the default value, or NULL
 */
void *hashMap_getValue(hashMap_t *hashMap, const void *key,
  void *defaultValue);

/**
 * Returns whether a hashmap is empty.
 * @param hashMap the hashmap to be tested
 * @return true if the hashmap is empty, having a size of zero (0);
 *         false otherwise
 */
bool hashMap_isEmpty(hashMap_t *hashMap);

/**
 * Inserts a key-to-value mapping into a hashmap.
 * @param hashMap the hashmap into which a mapping is to be inserted
 * @param key the key to be inserted
 * @param value the value to be inserted
 * @return true if the size of the hashmap was modified by this function;
 *         false otherwise
 */
bool hashMap_insert(hashMap_t *hashMap, void *key, void *value);

/*
 * hashmap iterator functions
 */

/**
 * @example hashMapIterator_example.c    L
 * Example of hashMapIterator implementation
 */  

/**
 * Constructs a new hashmap iterator.
 * @param hashMap the hashmap to be iterated
 * @return a new hashmap iterator, or NULL
 */
hashMapIterator_t *hashMapIterator_create(hashMap_t *hashMap);

/**
 * Frees a hashmap iterator.
 * @param iter the hashmap iterator to be freed
 * @return none
 */
void hashMapIterator_free(hashMapIterator_t *iter);

/**
 * Returns whether a hashmap iterator has more mappings.
 * @param iter the hashmap iterator to be tested
 * @return true if there are more mappings to be iterated;
 *         false otherwise
 */
bool hashMapIterator_hasNext(hashMapIterator_t *iter);

/**
 * Returns the key of the next mapping in the underlying hashmap and
 * advances the hashmap iterator.
 * @param iter the hashmap iterator to be advanced
 * @return the next key in the hashmap, or NULL
 */
void *hashMapIterator_nextKey(hashMapIterator_t *iter);

/**
 * Returns the value of the next mapping in the underlying hashmap and
 * advances the hashmap iterator.
 * @param iter the hashmap iterator to be advanced
 * @return the next value in the hashmap, or NULL
 */
void *hashMapIterator_nextValue(hashMapIterator_t *iter);

/**
 * Removes the last element returned by a hashmap iterator.
 * @param iter the hashmap iterator from which to remove an element
 * @return none
 */
void hashMapIterator_remove(hashMapIterator_t *iter);

/*
 * private hashmap functions
 */

/**
 * Removes a hashmap entry from a hashmap and updates the hashmap size
 * using a pair of free functions.
 * @param hashMap the hashmap whose entry is to be unlinked
 * @param entry the entry to be removed
 * @param freeKeyFunction the free function to be called for each key
 * @param freeValueFunction the free function to be called for each value
 * @return none
 */                                      
void hashMapPrivate_deleteEntry(hashMap_t *hashMap, hashMapEntry_t *entry);

/**
 * Returns the hashmap entry corresponding to a particular key.
 * @param hashMap the hashmap whose entry is to be retrieved
 * @return the matching hashmap entry, or NULL
 */
hashMapEntry_t *hashMapPrivate_getEntry(hashMap_t *hashMap, const void *key);

void hashMapIterator_next(hashMapIterator_t *iter);
void *hashMapIterator_getValue(hashMapIterator_t *iter);

#endif /* __HASHMAP_H__ */