diff options
Diffstat (limited to 'include/bh')
| -rw-r--r-- | include/bh/bh.h | 22 | ||||
| -rw-r--r-- | include/bh/hashmap.h | 237 | ||||
| -rw-r--r-- | include/bh/internal/hashmap.h | 30 | ||||
| -rw-r--r-- | include/bh/internal/queue.h | 35 | ||||
| -rw-r--r-- | include/bh/queue.h | 159 |
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 */ |
