/* hash.h
** strophe XMPP client library -- hash table interface
**
** Copyright (C) 2005-2009 Collecta, Inc.
**
**  This software is provided AS-IS with no warranty, either express
**  or implied.
**
**  This program is dual licensed under the MIT and GPLv3 licenses.
*/

/** @file
 *  Hash table API.
 */

#ifndef __LIBSTROPHE_HASH_H__
#define __LIBSTROPHE_HASH_H__

typedef struct _hash_t hash_t;

typedef void (*hash_free_func)(const xmpp_ctx_t *const ctx, void *p);

/** allocate and initialize a new hash table */
hash_t *
hash_new(xmpp_ctx_t *const ctx, const int size, hash_free_func free_func);

/** allocate a new reference to an existing hash table */
hash_t *hash_clone(hash_t *const table);

/** release a hash table when no longer needed */
void hash_release(hash_t *const table);

/** add a key, value pair to a hash table.
 *  each key can appear only once; the value of any
 *  identical key will be replaced
 */
int hash_add(hash_t *table, const char *const key, void *data);

/** look up a key in a hash table */
void *hash_get(hash_t *table, const char *key);

/** delete a key from a hash table */
int hash_drop(hash_t *table, const char *key);

/** return the number of keys in a hash */
int hash_num_keys(hash_t *table);

/** hash key iterator functions */
typedef struct _hash_iterator_t hash_iterator_t;

/** allocate and initialize a new iterator */
hash_iterator_t *hash_iter_new(hash_t *table);

/** release an iterator that is no longer needed */
void hash_iter_release(hash_iterator_t *iter);

/** return the next hash table key from the iterator.
    the returned key should not be freed */
const char *hash_iter_next(hash_iterator_t *iter);

#endif /* __LIBXMPPP_HASH_H__ */
