aboutsummaryrefslogtreecommitdiff
path: root/include/BH/Hashmap.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/BH/Hashmap.h')
-rwxr-xr-xinclude/BH/Hashmap.h223
1 files changed, 223 insertions, 0 deletions
diff --git a/include/BH/Hashmap.h b/include/BH/Hashmap.h
new file mode 100755
index 0000000..615e747
--- /dev/null
+++ b/include/BH/Hashmap.h
@@ -0,0 +1,223 @@
+#ifndef BH_HASHMAP_H
+#define BH_HASHMAP_H
+
+
+#include "Common.h"
+
+
+typedef struct BH_Hashmap BH_Hashmap;
+
+
+/**
+ * Creates the new hashmap handle.
+ *
+ * \param equal Comparision function
+ * \param hash Key hash function
+ *
+ * \return On success, returns hashmap handle.
+ * \return On failure, returns a null pointer.
+ */
+BH_Hashmap *BH_HashmapNew(BH_EqualCallback equal,
+ BH_HashCallback hash);
+
+
+/**
+ * Destroys the hashmap.
+ *
+ * \param hashmap Hashmap handle
+ */
+void BH_HashmapFree(BH_Hashmap *hashmap);
+
+
+/**
+ * Clears the hashmap.
+ *
+ * \param hashmap Hashmap handle
+ */
+void BH_HashmapClear(BH_Hashmap *hashmap);
+
+
+/**
+ * Reserves space in the hashmap.
+ *
+ * This function can both expand and shrink the available space in hashmap.
+ * This function takes into account current hashmap load factor.
+ *
+ * \param hashmap Hahsmap handle
+ * \param size Capacity
+ *
+ * \note Calling this function will invalidate iterators.
+ * \note Actual hashmap capacity can be bigger then requested.
+ *
+ * \return On success, returns zero value.
+ * \return On failure, returns error code.
+ */
+int BH_HashmapReserve(BH_Hashmap *hashmap,
+ size_t size);
+
+
+/**
+ * Inserts the pair of key-value into the hashmap.
+ *
+ * \param hashmap Hashmap handle
+ * \param key Key
+ * \param value Value
+ *
+ * \note This function allows duplicates to be inserted.
+ * \note Calling this function will invalidate iterators.
+ *
+ * \return On success, returns zero value.
+ * \return On failure, returns error code.
+ */
+int BH_HashmapInsert(BH_Hashmap *hashmap,
+ void *key,
+ void *value);
+
+
+/**
+ * Removes value from the hashmap.
+ *
+ * \param hashmap Hashmap handle
+ * \param key Key
+ *
+ * \note Calling this function will invalidate iterators.
+ * \note If hashmap contains several elements with the same key, this function
+ * will remove only one key-value pair.
+ */
+void BH_HashmapRemove(BH_Hashmap *hashmap,
+ void *key);
+
+
+/**
+ * Returns value from the hashmap by key.
+ *
+ * \param hashmap Hashmap handle
+ * \param key Key
+ * \param value Value (optional)
+ *
+ * \return On success, returns zero value.
+ * \return On failure, returns error code.
+ */
+int BH_HashmapAt(BH_Hashmap *hashmap,
+ void *key,
+ void **value);
+
+
+/**
+ * Checks if the hashmap is empty.
+ *
+ * \param hashmap Hashmap handle
+ *
+ * \return If hashmap is empty, returns non-zero value
+ * \return If hashmap is not empty, returns zero value
+ */
+int BH_HashmapEmpty(BH_Hashmap *hashmap);
+
+
+/**
+ * Returns the size of the hashmap.
+ *
+ * \param hashmap Hashmap handle
+ *
+ * \return Returns the size of the hashmap.
+ */
+size_t BH_HashmapSize(BH_Hashmap *hashmap);
+
+
+/**
+ * Returns the capacity of the hashmap.
+ *
+ * \param hashmap Hashmap handle
+ *
+ * \return Returns the capacity of the hashmap.
+ */
+size_t BH_HashmapCapacity(BH_Hashmap *hashmap);
+
+
+/**
+ * Returns the load factor of the hashmap.
+ *
+ * \param hashmap Hashmap handle
+ *
+ * \return Returns the load factor of the hashmap.
+ */
+float BH_HashmapFactor(BH_Hashmap *hashmap);
+
+
+/**
+ * Sets the load factor of the hashmap.
+ *
+ * \param hashmap Hashmap handle
+ * \param factor Load factor
+ *
+ * \note New load factor will be applied on the next reserve/insert operation.
+ */
+void BH_HashmapSetFactor(BH_Hashmap *hashmap,
+ float factor);
+
+
+/**
+ * Returns the iterator to the element in the hashmap with specified key.
+ *
+ * \param hashmap Hashmap handle
+ * \param iter Iterator
+ *
+ * \return On success, returns iterator value.
+ * \return On failure, returns NULL pointer.
+ *
+ * \note If hashmap contains several elements with the same key, this function
+ * will return iterator to one of them
+ */
+void *BH_HashmapIterAt(BH_Hashmap *hashmap,
+ void *key);
+
+
+/**
+ * Returns the iterator to the next element in the hashmap.
+ *
+ * If the iterator is NULL pointer, this function will return iterator to the
+ * first element of the hashmap.
+ *
+ * \param hashmap Hashmap handle
+ * \param iter Iterator
+ *
+ * \return On success, returns new iterator value for the next element.
+ * \return On failure, returns NULL pointer.
+ */
+void *BH_HashmapIterNext(BH_Hashmap *hashmap,
+ void *iter);
+
+
+/**
+ * Removes value from the hashmap pointed by by iterator.
+ *
+ * \param hashmap Hashmap handle
+ * \param iter Iterator
+ *
+ * \note Calling this function will invalidate iterators.
+ */
+void BH_HashmapIterRemove(BH_Hashmap *hashmap,
+ void *iter);
+
+
+/**
+ * Returns key, pointed by the iterator.
+ *
+ * \param iter Iterator
+ *
+ * \return Returns key.
+ */
+void *BH_HashmapIterKey(void *iter);
+
+
+/**
+ * Returns value, pointed by the iterator.
+ *
+ * \param iter Iterator
+ *
+ * \return Returns value.
+ */
+void *BH_HashmapIterValue(void *iter);
+
+
+#endif /* BH_HASHMAP_H */