X-Git-Url: http://git.droids-corp.org/?p=protos%2Flibecoli.git;a=blobdiff_plain;f=include%2Fecoli_htable.h;fp=include%2Fecoli_htable.h;h=6729d91d161560e41e685bf60c58acfa80899f70;hp=0000000000000000000000000000000000000000;hb=41bf1ba66e15c00f38375d05e49b31aa70f92349;hpb=03fcfd9562d205a050aba4c17902c56bbc817d54 diff --git a/include/ecoli_htable.h b/include/ecoli_htable.h new file mode 100644 index 0000000..6729d91 --- /dev/null +++ b/include/ecoli_htable.h @@ -0,0 +1,197 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2016, Olivier MATZ + */ + +/** + * Simple hash table API + * + * This file provides functions to store objects in hash tables, + * using arbitrary data as keys. + */ + +#ifndef ECOLI_HTABLE_ +#define ECOLI_HTABLE_ + +#include +#include + +typedef void (*ec_htable_elt_free_t)(void *); + +struct ec_htable; +struct ec_htable_elt_ref; + +/** + * Create a hash table. + * + * @return + * The hash table, or NULL on error (errno is set). + */ +struct ec_htable *ec_htable(void); + +/** + * Get a value from the hash table. + * + * @param htable + * The hash table. + * @param key + * The key. + * @param key_len + * The key length. + * @return + * The element if it is found, or NULL on error (errno is set). + * In case of success but the element is NULL, errno is set to 0. + */ +void *ec_htable_get(const struct ec_htable *htable, + const void *key, size_t key_len); + +/** + * Check if the hash table contains this key. + * + * @param htable + * The hash table. + * @param key + * The key. + * @param key_len + * The key length. + * @return + * true if it contains the key, else false. + */ +bool ec_htable_has_key(const struct ec_htable *htable, + const void *key, size_t key_len); + +/** + * Delete an object from the hash table. + * + * @param htable + * The hash table. + * @param key + * The key. + * @param key_len + * The key length. + * @return + * 0 on success, or -1 on error (errno is set). + */ +int ec_htable_del(struct ec_htable *htable, const void *key, size_t key_len); + +/** + * Add/replace an object in the hash table. + * + * @param htable + * The hash table. + * @param key + * The key. + * @param key_len + * The key length. + * @param val + * The pointer to be saved in the hash table. + * @param free_cb + * An optional pointer to a destructor function called when an + * object is destroyed (ec_htable_del() or ec_htable_free()). + * @return + * 0 on success, or -1 on error (errno is set). + * On error, the passed value is freed (free_cb(val) is called). + */ +int ec_htable_set(struct ec_htable *htable, const void *key, size_t key_len, + void *val, ec_htable_elt_free_t free_cb); + +/** + * Free a hash table an all its objects. + * + * @param htable + * The hash table. + */ +void ec_htable_free(struct ec_htable *htable); + +/** + * Get the length of a hash table. + * + * @param htable + * The hash table. + * @return + * The length of the hash table. + */ +size_t ec_htable_len(const struct ec_htable *htable); + +/** + * Duplicate a hash table + * + * A reference counter is shared between the clones of + * hash tables so that the objects are freed only when + * the last reference is destroyed. + * + * @param htable + * The hash table. + * @return + * The duplicated hash table, or NULL on error (errno is set). + */ +struct ec_htable *ec_htable_dup(const struct ec_htable *htable); + +/** + * Dump a hash table. + * + * @param out + * The stream where the dump is sent. + * @param htable + * The hash table. + */ +void ec_htable_dump(FILE *out, const struct ec_htable *htable); + +/** + * Iterate the elements in the hash table. + * + * The typical usage is as below: + * + * // dump elements + * for (iter = ec_htable_iter(htable); + * iter != NULL; + * iter = ec_htable_iter_next(iter)) { + * printf(" %s: %p\n", + * ec_htable_iter_get_key(iter), + * ec_htable_iter_get_val(iter)); + * } + * + * @param htable + * The hash table. + * @return + * An iterator element, or NULL if the dict is empty. + */ +struct ec_htable_elt_ref * +ec_htable_iter(const struct ec_htable *htable); + +/** + * Make the iterator point to the next element in the hash table. + * + * @param iter + * The hash table iterator. + * @return + * An iterator element, or NULL there is no more element. + */ +struct ec_htable_elt_ref * +ec_htable_iter_next(struct ec_htable_elt_ref *iter); + +/** + * Get the key of the current element. + * + * @param iter + * The hash table iterator. + * @return + * The current element key, or NULL if the iterator points to an + * invalid element. + */ +const char * +ec_htable_iter_get_key(const struct ec_htable_elt_ref *iter); + +/** + * Get the value of the current element. + * + * @param iter + * The hash table iterator. + * @return + * The current element value, or NULL if the iterator points to an + * invalid element. + */ +void * +ec_htable_iter_get_val(const struct ec_htable_elt_ref *iter); + + +#endif