aboutsummaryrefslogtreecommitdiff
path: root/include/bh
diff options
context:
space:
mode:
Diffstat (limited to 'include/bh')
-rw-r--r--include/bh/bh.h22
-rw-r--r--include/bh/hashmap.h237
-rw-r--r--include/bh/internal/hashmap.h30
-rw-r--r--include/bh/internal/queue.h35
-rw-r--r--include/bh/queue.h159
5 files changed, 483 insertions, 0 deletions
diff --git a/include/bh/bh.h b/include/bh/bh.h
new file mode 100644
index 0000000..f9df864
--- /dev/null
+++ b/include/bh/bh.h
@@ -0,0 +1,22 @@
+#ifndef BHLIB_H
+#define BHLIB_H
+
+#include <stddef.h>
+
+#define BH_INT_TO_PTR(x) \
+ ((void *)((long)(x)))
+
+#define BH_UINT_TO_PTR(x) \
+ ((void *)((unsigned long)(x)))
+
+#define BH_PTR_TO_INT(x) \
+ ((long)(x))
+
+#define BH_PTR_TO_UINT(x) \
+ ((unsigned long)(x))
+
+typedef int (*bh_equal_cb_t)(const void *, const void *);
+typedef size_t (*bh_hash_cb_t)(const void *);
+
+#endif /* BHLIB_H */
+
diff --git a/include/bh/hashmap.h b/include/bh/hashmap.h
new file mode 100644
index 0000000..b8c2dc5
--- /dev/null
+++ b/include/bh/hashmap.h
@@ -0,0 +1,237 @@
+#ifndef BHLIB_HASHMAP_H
+#define BHLIB_HASHMAP_H
+
+#include <bh/bh.h>
+
+typedef struct bh_hashmap_s bh_hashmap_t;
+
+/**
+ * @brief Create new hashmap object.
+ *
+ * @param equal Function used for comparing keys
+ * @param hash Function used to calculate hash value of the key
+ *
+ * @return If the function succeeds, the return value is a pointer to the new
+ * hashmap object.
+ * @return If the function fails, the return value is NULL.
+ *
+ * @warning The quality of the supplied hash function will affect performance
+ * of the hashmap.
+ *
+ * @sa bh_hashmap_free, bh_hashmap_reserve, bh_hashmap_insert
+ */
+bh_hashmap_t *bh_hashmap_new(bh_equal_cb_t equal,
+ bh_hash_cb_t hash);
+
+/**
+ * @brief Free hashmap object.
+ *
+ * @param hashmap Valid pointer to the hashmap object.
+ *
+ * @sa bh_hashmap_clear
+ */
+void bh_hashmap_free(bh_hashmap_t *hashmap);
+
+/**
+ * @brief Clear the hashmap.
+ *
+ * @param hashmap Valid pointer to the hashmap object.
+ *
+ * @warning Clearing the hashmap does invalidate iterators.
+ *
+ * @sa bh_hashmap_remove
+ */
+void bh_hashmap_clear(bh_hashmap_t *hashmap);
+
+/**
+ * @brief Reserve space for the specified amount of elements.
+ *
+ * @param hashmap Valid pointer to the hashmap object.
+ * @param size The amount of elements.
+ *
+ * @return If the function succeeds, the return value is zero.
+ * @return If the function fails, the return value is non-zero.
+ *
+ * @warning Reserving hashmap space does invalidate iterators.
+ *
+ * @sa bh_hashmap_capacity, bh_hashmap_insert
+ */
+int bh_hashmap_reserve(bh_hashmap_t *hashmap,
+ size_t size);
+
+/**
+ * @brief Insert key/value into the hashmap.
+ *
+ * @param hashmap Valid pointer to the hashmap object.
+ * @param key Key
+ * @param value Value
+ *
+ * @return If the function succeeds, the return value is zero.
+ * @return If the function fails, the return value is non-zero.
+ *
+ * @warning Inserted element is owned by the caller of the function.
+ * @warning Inserting elements into the hashmap does invalidate iterators.
+ *
+ * @sa bbh_hashmap_remove, bh_hashmap_at
+ */
+int bh_hashmap_insert(bh_hashmap_t *hashmap,
+ void *key,
+ void *value);
+
+/**
+ * @brief Remove element from the hashmap.
+ *
+ * @param hashmap Valid pointer to the hashmap object.
+ * @param key Key.
+ *
+ * @warning Removing elements from the hashmap does invalidate iterators.
+ *
+ * @sa bh_hashmap_insert, bh_hashmap_at
+ */
+void bh_hashmap_remove(bh_hashmap_t *hashmap,
+ void *key);
+
+/**
+ * @brief Return element value by the key from the hashmap.
+ *
+ * @param hashmap Valid pointer to the hashmap.
+ * @param key Key.
+ * @param exists Pointer to the exists flag (optional).
+ *
+ * @return If the function succeeds, the return value is a valid pointer to
+ * the element value.
+ * @return If the function fails, the return value is NULL.
+ *
+ * @note If the hashmap does not contain any element with the key, the
+ * function will fail.
+ *
+ * @sa bh_hashmap_empty, bh_hashmap_insert
+ */
+void *bh_hashmap_at(bh_hashmap_t *hashmap,
+ void *key,
+ int *exists);
+
+/**
+ * @brief Check if the hashmap is empty.
+ *
+ * @param hashmap Valid pointer to the hashmap object.
+ *
+ * @return The return value is non-zero if the hashmap is empty, otherwise
+ * zero.
+ *
+ * @sa bh_hashmap_size
+ */
+int bh_hashmap_empty(bh_hashmap_t *hashmap);
+
+/**
+ * @brief Return hashmap size.
+ *
+ * @param hashmap Valid pointer to the hashmap object.
+ *
+ * @return The return value is current hashmap size.
+ *
+ * @sa bh_hashmap_empty, bh_hashmap_capacity
+ */
+size_t bh_hashmap_size(bh_hashmap_t *hashmap);
+
+/**
+ * @brief Return hashmap capacity.
+ *
+ * @param hashmap Valid pointer to the hashmap object.
+ *
+ * @return The return value is current hashmap capacity.
+ *
+ * @sa bh_hashmap_reserve, bh_hashmap_size
+ */
+size_t bh_hashmap_capacity(bh_hashmap_t *hashmap);
+
+/**
+ * @brief Return hashmap load factor.
+ *
+ * @param hashmap Valid pointer to the hashmap object.
+ *
+ * @return The return value is current hashmap load factor.
+ *
+ * @sa bh_hashmap_set_factor, bh_hashmap_capacity
+ */
+float bh_hashmap_factor(bh_hashmap_t *hashmap);
+
+/**
+ * @brief Set hashmap load factor.
+ *
+ * @param hashmap Valid pointer to the hashmap object.
+ * @param factor Load factor.
+ *
+ * @sa bh_hashmap_factor
+ */
+void bh_hashmap_set_factor(bh_hashmap_t *hashmap,
+ float factor);
+
+/**
+ * @brief Return iterator for the element by the key.
+ *
+ * @param hashmap Valid pointer to the hashmap object.
+ * @param key Key
+ *
+ * @return The return value is the valid iterator for the element in the
+ * hashmap.
+ * @return The return value is the NULL iterator if there is no element with
+ * specified key.
+ *
+ * @sa bh_hashmap_iter_key, bh_hashmap_iter_value
+ */
+void *bh_hashmap_iter_at(bh_hashmap_t *hashmap,
+ void *key);
+
+/**
+ * @brief Return iterator for the next element in the hashmap.
+ *
+ * @param hashmap Valid pointer to the hashmap object.
+ * @param iter Valid or NULL iterator.
+ *
+ * @return The return value is the valid iterator for the next element in the
+ * hashmap.
+ * @return The return value is the NULL iterator if there is no more elements
+ * in the hashmap.
+ *
+ * @sa bh_hashmap_iter_key, bh_hashmap_iter_value
+ */
+void *bh_hashmap_iter_next(bh_hashmap_t *hashmap,
+ void *iter);
+
+/**
+ * @brief Remove element from the hashmap by the iterator.
+ *
+ * @param hashmap Valid pointer to the hashmap object.
+ * @param key Valid iterator.
+ *
+ * @warning Removing elements from the hashmap does invalidate iterators.
+ *
+ * @sa bh_hashmap_insert, bh_hashmap_at
+ */
+void bh_hashmap_iter_remove(bh_hashmap_t *hashmap,
+ void *iter);
+
+/**
+ * @brief Return pointer to the element's key.
+ *
+ * @param iter Valid iterator.
+ *
+ * @return The return value is the stored element key.
+ *
+ * @sa bh_hashmap_iter_value, bh_hashmap_iter_next
+ */
+void *bh_hashmap_iter_key(void *iter);
+
+/**
+ * @brief Return pointer to the element's value.
+ *
+ * @param iter Valid iterator.
+ *
+ * @return The return value is the stored element value.
+ *
+ * @sa bh_hashmap_iter_key, bh_hashmap_iter_next
+ */
+void *bh_hashmap_iter_value(void *iter);
+
+#endif /* BHLIB_HASHMAP_H */
diff --git a/include/bh/internal/hashmap.h b/include/bh/internal/hashmap.h
new file mode 100644
index 0000000..8d62c16
--- /dev/null
+++ b/include/bh/internal/hashmap.h
@@ -0,0 +1,30 @@
+#ifndef BHLIB_INTERNAL_HASHMAP_H
+#define BHLIB_INTERNAL_HASHMAP_H
+
+#include <bh/hashmap.h>
+
+typedef struct bh_hashmap_node_s
+{
+ void *key;
+ void *value;
+} bh_hashmap_node_t;
+
+struct bh_hashmap_s
+{
+ bh_hashmap_node_t *data;
+ size_t *psls;
+ size_t size;
+ size_t capacity;
+ size_t threshold;
+ bh_equal_cb_t equal;
+ bh_hash_cb_t hash;
+ float factor;
+};
+
+void bh_hashmap_init(bh_hashmap_t *hashmap,
+ bh_equal_cb_t equal,
+ bh_hash_cb_t hash);
+
+void bh_hashmap_destroy(bh_hashmap_t *hashmap);
+
+#endif /* BHLIB_INTERNAL_HASHMAP_H */
diff --git a/include/bh/internal/queue.h b/include/bh/internal/queue.h
new file mode 100644
index 0000000..13a6cad
--- /dev/null
+++ b/include/bh/internal/queue.h
@@ -0,0 +1,35 @@
+#ifndef BHLIB_INTERNAL_QUEUE_H
+#define BHLIB_INTERNAL_QUEUE_H
+
+#include <bh/queue.h>
+
+struct bh_queue_s
+{
+ void **data;
+ size_t size;
+ size_t head;
+ size_t tail;
+ size_t capacity;
+};
+
+/**
+ * @internal
+ * @brief Initialize embedded queue object.
+ *
+ * @param queue Valid pointer to the queue object.
+ *
+ * @sa bh_queue_destroy
+ */
+void bh_queue_init(bh_queue_t *queue);
+
+/**
+ * @internal
+ * @brief Destroy embedded queue object.
+ *
+ * @param queue Valid pointer to the queue object.
+ *
+ * @sa bh_queue_init
+ */
+void bh_queue_destroy(bh_queue_t *queue);
+
+#endif /* BHLIB_INTERNAL_QUEUE_H */
diff --git a/include/bh/queue.h b/include/bh/queue.h
new file mode 100644
index 0000000..c5185ef
--- /dev/null
+++ b/include/bh/queue.h
@@ -0,0 +1,159 @@
+#ifndef BH_QUEUE_H
+#define BH_QUEUE_H
+
+#include <bh/bh.h>
+
+typedef struct bh_queue_s bh_queue_t;
+
+/**
+ * @brief Create new queue object.
+ *
+ * @return If the function succeeds, the return value is a pointer to the new
+ * queue object.
+ * @return If the function fails, the return value is NULL.
+ *
+ * @sa bh_queue_free, bh_queue_reserve, bh_queue_insert
+ */
+bh_queue_t *bh_queue_new(void);
+
+/**
+ * @brief Free queue object.
+ *
+ * @param queue Valid pointer to the queue object.
+ *
+ * @sa bh_queue_clear
+ */
+void bh_queue_free(bh_queue_t *queue);
+
+/**
+ * @brief Clear the queue.
+ *
+ * @param queue Valid pointer to the queue object.
+ *
+ * @warning Clearing the queue does invalidate iterators.
+ *
+ * @sa bh_queue_remove
+ */
+void bh_queue_clear(bh_queue_t *queue);
+
+/**
+ * @brief Reserve space for the specified amount of elements.
+ *
+ * @param queue Valid pointer to the queue object.
+ * @param size The amount of elements.
+ *
+ * @return If the function succeeds, the return value is zero.
+ * @return If the function fails, the return value is non-zero.
+ *
+ * @warning Reserving queue space does invalidate iterators.
+ *
+ * @sa bh_queue_capacity, bh_queue_insert
+ */
+int bh_queue_reserve(bh_queue_t *queue,
+ size_t size);
+
+/**
+ * @brief Insert element at the end of the queue.
+ *
+ * @param queue Valid pointer to the queue object.
+ * @param value Element.
+ *
+ * @return If the function succeeds, the return value is zero.
+ * @return If the function fails, the return value is non-zero.
+ *
+ * @warning Inserted element is owned by the caller of the function.
+ * @warning Inserting elements into the queue does invalidate iterators.
+ *
+ * @sa bh_queue_remove, bh_queue_front
+ */
+int bh_queue_insert(bh_queue_t *queue,
+ void *value);
+
+/**
+ * @brief Remove element from the front of the queue.
+ *
+ * @param queue Valid pointer to the queue object.
+ *
+ * @warning Removing elements from the queue does invalidate iterators.
+ *
+ * @sa bh_queue_insert, bh_queue_front
+ */
+void bh_queue_remove(bh_queue_t *queue);
+
+/**
+ * @brief Return element from the front of the queue.
+ *
+ * @param queue Valid pointer to the queue object.
+ *
+ * @return If the function succeeds, the return value is a valid pointer to
+ * the element.
+ * @return If the function fails, the return value is NULL.
+ *
+ * @note If the queue is empty, function will fail to return element from
+ * the queue.
+ *
+ * @sa bh_queue_empty, bh_queue_insert
+ */
+void *bh_queue_front(bh_queue_t *queue);
+
+/**
+ * @brief Check if the queue is empty.
+ *
+ * @param queue Valid pointer to the queue object.
+ *
+ * @return The return value is non-zero if the queue is empty, otherwise zero.
+ *
+ * @sa bh_queue_size
+ */
+int bh_queue_empty(bh_queue_t *queue);
+
+/**
+ * @brief Return queue size.
+ *
+ * @param queue Valid pointer to the queue object.
+ *
+ * @return The return value is current queue size.
+ *
+ * @sa bh_queue_empty, bh_queue_capacity
+ */
+size_t bh_queue_size(bh_queue_t *queue);
+
+/**
+ * @brief Return queue capacity.
+ *
+ * @param queue Valid pointer to the queue object.
+ *
+ * @return The return value is current queue capacity.
+ *
+ * @sa bh_queue_reserve, bh_queue_size
+ */
+size_t bh_queue_capacity(bh_queue_t *queue);
+
+/**
+ * @brief Return iterator for the next element in the queue.
+ *
+ * @param queue Valid pointer to the queue object.
+ * @param iter Valid or NULL iterator.
+ *
+ * @return The return value is the valid iterator for the next element in the
+ * queue.
+ * @return The return value is the NULL iterator if there is no more elements
+ * in the queue.
+ *
+ * @sa bh_queue_iter_value
+ */
+void *bh_queue_iter_next(bh_queue_t *queue,
+ void *iter);
+
+/**
+ * @brief Return pointer to the element's value.
+ *
+ * @param iter Valid iterator.
+ *
+ * @return The return value is the stored element.
+ *
+ * @sa bh_queue_iter_next
+ */
+void *bh_queue_iter_value(void *iter);
+
+#endif /* BH_QUEUE_H */