From 7fee90d954359050935a1c425ebc1387cc7346c2 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Luk=C3=A1=C5=A1=20Ji=C5=99i=C5=A1t=C4=9B?= Date: Sat, 2 Aug 2025 17:46:31 +0200 Subject: [PATCH] Implement t_dict Untested implementation of dictionary using t_rbtree. --- Makefile | 5 ++++ ft_struct/ft_dict_access.c | 11 ++++++++ ft_struct/ft_dict_free.c | 56 ++++++++++++++++++++++++++++++++++++++ ft_struct/ft_dict_init.c | 7 +++++ ft_struct/ft_dict_insert.c | 18 ++++++++++++ inc/ft_struct.h | 15 +++++++++- 6 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 ft_struct/ft_dict_access.c create mode 100644 ft_struct/ft_dict_free.c create mode 100644 ft_struct/ft_dict_init.c create mode 100644 ft_struct/ft_dict_insert.c diff --git a/Makefile b/Makefile index b7cdf2c..4f27214 100644 --- a/Makefile +++ b/Makefile @@ -41,6 +41,11 @@ SRCstruct:= ft_stack_free.c \ ft_rbtree_insert.c \ ft_rbtree_search.c \ ft_rbtree_search_node.c \ + ft_dict_access.c \ + ft_dict_free.c \ + ft_dict_init.c \ + ft_dict_insert.c \ + SRCparse:= ft_parse.c \ diff --git a/ft_struct/ft_dict_access.c b/ft_struct/ft_dict_access.c new file mode 100644 index 0000000..1f8e20c --- /dev/null +++ b/ft_struct/ft_dict_access.c @@ -0,0 +1,11 @@ +#include "ft_struct.h" + +void *ft_dict_access(t_dict *dict, void *key) +{ + void *composite; + + composite = ft_rbtree_search(&dict->tree, key); + if (!composite) + return (NULL); + return ((char *)composite + dict->key_size); +} diff --git a/ft_struct/ft_dict_free.c b/ft_struct/ft_dict_free.c new file mode 100644 index 0000000..86759b5 --- /dev/null +++ b/ft_struct/ft_dict_free.c @@ -0,0 +1,56 @@ +#include "ft_struct.h" + +static t_free_fun *handle_generic_free(int set, t_free_fun free_key, t_free_fun free_el) +{ + static t_free_fun frees[2] = {NULL, NULL}; + + if (set) + { + frees[0] = free_key; + frees[1] = free_el; + } + return (frees); +} + +static size_t handle_generic_offset(int set, size_t new_val) +{ + static size_t offset = 0; + + if (set) + offset = new_val; + return (offset); +} + +static void generic_free(void *composite) +{ + t_free_fun *frees; + size_t el_offset; + void *key; + void *element; + + if (!composite) + return ; + el_offset = handle_generic_offset(0, 0); + key = composite; + element = (char *)composite + el_offset; + frees = handle_generic_free(0, NULL, NULL); + frees[0](key); + frees[1](element); + return ; +} + +void ft_dict_free(t_dict *dict, t_free_fun free_key, t_free_fun free_el) +{ + handle_generic_offset(1, dict->key_size); + handle_generic_free(1, free_key, free_el); + ft_rbtree_free(&dict->tree, generic_free); + return ; +} + +void ft_dict_delete(t_dict *dict, void *key, t_free_fun free_key, t_free_fun free_el) +{ + handle_generic_offset(1, dict->key_size); + handle_generic_free(1, free_key, free_el); + ft_rbtree_delete(&dict->tree, key, generic_free); + return ; +} diff --git a/ft_struct/ft_dict_init.c b/ft_struct/ft_dict_init.c new file mode 100644 index 0000000..c51a81a --- /dev/null +++ b/ft_struct/ft_dict_init.c @@ -0,0 +1,7 @@ +#include "ft_struct.h" + +t_ft_stat ft_dict_init(t_dict *dict, size_t key_size, size_t el_size, t_cmp_fun cmp_keys) +{ + dict->key_size = key_size; + return (ft_rbtree_init(&dict->tree, key_size + el_size, cmp_keys)); +} diff --git a/ft_struct/ft_dict_insert.c b/ft_struct/ft_dict_insert.c new file mode 100644 index 0000000..65adc26 --- /dev/null +++ b/ft_struct/ft_dict_insert.c @@ -0,0 +1,18 @@ +#include "ft_struct.h" +#include "libft.h" +#include + +t_ft_stat ft_dict_insert(t_dict *dict, void *key, void *element) +{ + void *composite; + t_ft_stat res; + + composite = malloc(dict->tree.el_size); + if (!composite) + return (alloc_fail); + ft_memcpy(composite, key, dict->key_size); + ft_memcpy((char *)composite + dict->key_size, element, dict->tree.el_size - dict->key_size); + res = ft_rbtree_insert(&dict->tree, composite); + free(composite); + return (res); +} diff --git a/inc/ft_struct.h b/inc/ft_struct.h index d7cb3b2..0d7a5ad 100644 --- a/inc/ft_struct.h +++ b/inc/ft_struct.h @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/20 16:59:43 by ljiriste #+# #+# */ -/* Updated: 2025/08/02 16:25:28 by ljiriste ### ########.fr */ +/* Updated: 2025/08/02 16:58:18 by ljiriste ### ########.fr */ /* */ /* ************************************************************************** */ @@ -99,6 +99,19 @@ void ft_rbtree_rotate(t_rbtree_node *node); int ft_rbtree_draw(t_rbtree *tree, size_t min_height); +typedef struct s_dict +{ + size_t key_size; + t_rbtree tree; +} t_dict; + +t_ft_stat ft_dict_init(t_dict *dict, size_t key_size, size_t el_size, t_cmp_fun cmp_keys); +void ft_dict_free(t_dict *dict, t_free_fun free_key, t_free_fun free_el); + +t_ft_stat ft_dict_insert(t_dict *dict, void *key, void *element); +void *ft_dict_access(t_dict *dict, void *key); +void ft_dict_delete(t_dict *dict, void *key, t_free_fun free_key, t_free_fun free_el); + # ifdef __cplusplus } # endif // __cplusplus -- 2.30.2