diff --git a/src/Array.c b/src/Array.c index 34ea239a162e47dbeeaec47d5dd862db6b9ac6f0..7cc71bc782cd6a1cad88029f6263eeb20b7130a2 100644 --- a/src/Array.c +++ b/src/Array.c @@ -12,24 +12,7 @@ #include <stdio.h> #include <stdlib.h> -int lower_bound(IntegerArray *array, uint64_t item) { - int low = 0; - int high = array->size - 1; - - while (low <= high) { - int m = (low + high) / 2; - - if (array->items[m] < item) { - low = m + 1; - } else if (array->items[m] > item) { - high = m - 1; - } else { - return m; - } - } - - return low; -} +// IntegerArray IntegerArray *IntegerArray_init(int capacity) { IntegerArray *array = (IntegerArray *)malloc(sizeof(IntegerArray)); @@ -44,12 +27,6 @@ void IntegerArray_destroy(IntegerArray **array) { *array = NULL; } -int IntegerArray_insert_sorted(IntegerArray *array, uint64_t item) { - int index = lower_bound(array, item); - IntegerArray_insert_at_index(array, index, item); - return index; -} - void IntegerArray_insert_at_index(IntegerArray *array, int index, uint64_t item) { for (int i = array->size - 1; i >= index; i--) { array->items[i + 1] = array->items[i]; @@ -59,6 +36,31 @@ void IntegerArray_insert_at_index(IntegerArray *array, int index, uint64_t item) array->size++; } +int IntegerArray_lower_bound(IntegerArray *array, uint64_t item) { + int low = 0; + int high = array->size - 1; + + while (low <= high) { + int m = (low + high) / 2; + + if (array->items[m] < item) { + low = m + 1; + } else if (array->items[m] > item) { + high = m - 1; + } else { + return m; + } + } + + return low; +} + +int IntegerArray_insert_sorted(IntegerArray *array, uint64_t item) { + int index = IntegerArray_lower_bound(array, item); + IntegerArray_insert_at_index(array, index, item); + return index; +} + void IntegerArray_append(IntegerArray *array, uint64_t item) { array->items[array->size] = item; array->size++; @@ -122,6 +124,8 @@ void IntegerArray_copy(IntegerArray *src, IntegerArray *dest) { dest->size = src->size; } +// BPTreeNodeArray + BPTreeNodeArray *BPTreeNodeArray_init(int capacity) { BPTreeNodeArray *array = (BPTreeNodeArray *)malloc(sizeof(BPTreeNodeArray)); array->items = (BPTreeNode **)malloc(sizeof(BPTreeNode *) * capacity); @@ -167,12 +171,6 @@ void BPTreeNodeArray_delete_at_index(BPTreeNodeArray *array, int index) { array->size--; } -BPTreeNode *BPTreeNodeArray_pop(BPTreeNodeArray *array) { - BPTreeNode *item = array->items[array->size - 1]; - BPTreeNodeArray_delete_at_index(array, array->size - 1); - return item; -} - void BPTreeNodeArray_clear(BPTreeNodeArray *array) { array->size = 0; } @@ -185,6 +183,8 @@ void BPTreeNodeArray_copy(BPTreeNodeArray *src, BPTreeNodeArray *dest) { dest->size = src->size; } +// ByteArray + ByteArray *ByteArray_init(int capacity) { ByteArray *array = (ByteArray *)malloc(sizeof(ByteArray)); array->items = (uint8_t *)malloc(sizeof(uint8_t) * capacity); diff --git a/src/Array.h b/src/Array.h index 1bf35aea726c93b668b4c9c6bb2a9ff1beffa4c1..179c22ee92c627e69b7e706d31f2c56311cf166b 100644 --- a/src/Array.h +++ b/src/Array.h @@ -1,7 +1,7 @@ /** * @file Array.h * @author Florian Burgener (florian.burgener@etu.hesge.ch) - * @brief + * @brief Implementation of 3 arrays: IntegerArray, BPTreeNodeArray and ByteArray. * @version 1.0 * @date 2022-06-XX */ @@ -13,55 +13,215 @@ // IntegerArray +/** + * @brief Data structure that represents an array of integers of type uint64_t. + * + */ typedef struct IntegerArray { uint64_t *items; int size; } IntegerArray; -int lower_bound(IntegerArray *array, uint64_t item); - +/** + * @brief Initializes the "IntegerArray" data structure. + * + * @param capacity Maximum number of items the array can contain. + * @return IntegerArray* An empty "IntegerArray". + */ IntegerArray *IntegerArray_init(int capacity); + +/** + * @brief Destroy the array and free its memory. + * + * @param array The array to be destroyed. + */ void IntegerArray_destroy(IntegerArray **array); -int IntegerArray_insert_sorted(IntegerArray *array, uint64_t item); +/** + * @brief Inserts an item in the array at the desired index. + * + * @param array The array in which the item will be inserted. + * @param index The index where the item must be inserted. + * @param item The item to be inserted. + */ void IntegerArray_insert_at_index(IntegerArray *array, int index, uint64_t item); + +/** + * @brief Finds out at which index the item should be inserted in the array. + * + * @param array The array in which to search, it must be sorted. + * @param item The item that should be inserted. + * @return int The index where the item would be inserted. + */ +int IntegerArray_lower_bound(IntegerArray *array, uint64_t item); + +/** + * @brief Inserts an item in the sorted array. + * + * @param array The sorted array in which the item will be inserted. + * @param item The item to be inserted. + * @return int The index where the item has been inserted. + */ +int IntegerArray_insert_sorted(IntegerArray *array, uint64_t item); + +/** + * @brief Appends an item to the end of the array. + * + * @param array The array in which the item will be added. + * @param item The item to be added. + */ void IntegerArray_append(IntegerArray *array, uint64_t item); + +/** + * @brief Searches for an item in the sorted array. + * + * @param array The array in which the item is searched. + * @param item The sought-after item. + * @param index If the item is found its index will be assigned to this variable. + * @return true The item has been found. + * @return false The item has not been found. + */ bool IntegerArray_binary_search(IntegerArray *array, uint64_t item, int *index); + +/** + * @brief Deletes an item from the array at the desired index. + * + * @param array The array in which the item is deleted. + * @param index The index where the item must be deleted. + */ void IntegerArray_delete_at_index(IntegerArray *array, int index); + +/** + * @brief Displays the array on the console. + * + * @param array The array to display. + */ void IntegerArray_print(IntegerArray *array); + +/** + * @brief Deletes all items from the array. + * + * @param array The array where all the items must be deleted. + */ void IntegerArray_clear(IntegerArray *array); + +/** + * @brief Copies the source array to the destination array. + * + * @param src The source array. + * @param dest The destination array. The destination array must have at least the capacity of the source array. + */ void IntegerArray_copy(IntegerArray *src, IntegerArray *dest); // BPTreeNodeArray typedef struct BPTreeNode BPTreeNode; +/** + * @brief Data structure that represents an array of pointers of type BPTreeNode. + * + */ typedef struct BPTreeNodeArray { BPTreeNode **items; int size; } BPTreeNodeArray; +/** + * @brief Initializes the "BPTreeNodeArray" data structure. + * + * @param capacity Maximum number of items the array can contain. + * @return BPTreeNodeArray* An empty "BPTreeNodeArray". + */ BPTreeNodeArray *BPTreeNodeArray_init(int capacity); + +/** + * @brief Destroy the array and free its memory. + * + * @param array The array to be destroyed. + */ void BPTreeNodeArray_destroy(BPTreeNodeArray **array); +/** + * @brief Inserts an item in the array at the desired index. + * + * @param array The array in which the item will be inserted. + * @param index The index where the item must be inserted. + * @param item The item to be inserted. + */ void BPTreeNodeArray_insert_at_index(BPTreeNodeArray *array, int index, BPTreeNode *item); + +/** + * @brief Appends an item to the end of the array. + * + * @param array The array in which the item will be added. + * @param item The item to be added. + */ void BPTreeNodeArray_append(BPTreeNodeArray *array, BPTreeNode *item); + +/** + * @brief Searches for an item in the array. + * + * @param array The array in which the item is searched. + * @param item The sought-after item. + * @return int If the item is found returns its index otherwise -1. + */ int BPTreeNodeArray_search(BPTreeNodeArray *array, BPTreeNode *item); + +/** + * @brief Deletes an item from the array at the desired index. + * + * @param array The array in which the item is deleted. + * @param index The index where the item must be deleted. + */ void BPTreeNodeArray_delete_at_index(BPTreeNodeArray *array, int index); -BPTreeNode *BPTreeNodeArray_pop(BPTreeNodeArray *array); + +/** + * @brief Deletes all items from the array. + * + * @param array The array where all the items must be deleted. + */ void BPTreeNodeArray_clear(BPTreeNodeArray *array); + +/** + * @brief Copies the source array to the destination array. + * + * @param src The source array. + * @param dest The destination array. The destination array must have at least the capacity of the source array. + */ void BPTreeNodeArray_copy(BPTreeNodeArray *src, BPTreeNodeArray *dest); // ByteArray +/** + * @brief Data structure that represents an array of bytes. + * + */ typedef struct ByteArray { uint8_t *items; int size; } ByteArray; +/** + * @brief Initializes the "ByteArray" data structure. + * + * @param capacity Maximum number of items the array can contain. + * @return ByteArray* An empty "ByteArray". + */ ByteArray *ByteArray_init(int capacity); + +/** + * @brief Destroy the array and free its memory. + * + * @param array The array to be destroyed. + */ void ByteArray_destroy(ByteArray **array); +/** + * @brief Appends an item to the end of the array. + * + * @param array The array in which the item will be added. + * @param item The item to be added. + */ void ByteArray_append(ByteArray *array, uint8_t item); #endif diff --git a/src/BPTree.c b/src/BPTree.c index 9c4f770c4b7fce895745240c07aa7a9166501b0c..c15c30cca8fac0934c2c161dad5821b32b0125d2 100644 --- a/src/BPTree.c +++ b/src/BPTree.c @@ -78,7 +78,7 @@ bool BPTree_search(BPTreeNode *root, uint64_t key, uint64_t *data) { return found; } - int child_index = lower_bound(root->keys, key); + int child_index = IntegerArray_lower_bound(root->keys, key); if (child_index < root->keys->size && root->keys->items[child_index] == key) { child_index += 1; @@ -90,7 +90,7 @@ bool BPTree_search(BPTreeNode *root, uint64_t key, uint64_t *data) { // "traverse" function for insertion and deletion. static BPTreeNode *traverse(BPTreeNode *node, uint64_t key) { - int virtual_insertion_index = lower_bound(node->keys, key); + int virtual_insertion_index = IntegerArray_lower_bound(node->keys, key); if (virtual_insertion_index < node->keys->size && node->keys->items[virtual_insertion_index] == key) { virtual_insertion_index += 1; @@ -130,7 +130,7 @@ static void redistribute_keys(BPTreeNode *left_node, BPTreeNode *right_node, int } static uint64_t split_leaf(BPTreeNode *node, uint64_t key, uint64_t data, BPTreeNode **split_right_node) { - int virtual_insertion_index = lower_bound(node->keys, key); + int virtual_insertion_index = IntegerArray_lower_bound(node->keys, key); int median_index = node->keys->size / 2; uint64_t median_value; *split_right_node = BPTreeNode_init(node->order, true); @@ -169,7 +169,7 @@ static void redistribute_children(BPTreeNode *left_node, BPTreeNode *right_node, } static uint64_t split_internal(BPTreeNode *node, uint64_t key, BPTreeNode *previous_split_right_node, BPTreeNode **split_right_node) { - int virtual_insertion_index = lower_bound(node->keys, key); + int virtual_insertion_index = IntegerArray_lower_bound(node->keys, key); int median_index = node->keys->size / 2; uint64_t median_value; *split_right_node = BPTreeNode_init(node->order, false);