Implement t_dict
authorLukáš Jiřiště <gymnazium.jiriste@gmail.com>
Sat, 2 Aug 2025 15:46:31 +0000 (17:46 +0200)
committerLukáš Jiřiště <gymnazium.jiriste@gmail.com>
Sat, 2 Aug 2025 15:46:31 +0000 (17:46 +0200)
Untested implementation of dictionary using t_rbtree.

Makefile
ft_struct/ft_dict_access.c [new file with mode: 0644]
ft_struct/ft_dict_free.c [new file with mode: 0644]
ft_struct/ft_dict_init.c [new file with mode: 0644]
ft_struct/ft_dict_insert.c [new file with mode: 0644]
inc/ft_struct.h

index b7cdf2ccf537d9ea4660ffa4756c25b9d5dd9ba8..4f272145104789bb229ce84d919801473eb82183 100644 (file)
--- 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 (file)
index 0000000..1f8e20c
--- /dev/null
@@ -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 (file)
index 0000000..86759b5
--- /dev/null
@@ -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 (file)
index 0000000..c51a81a
--- /dev/null
@@ -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 (file)
index 0000000..65adc26
--- /dev/null
@@ -0,0 +1,18 @@
+#include "ft_struct.h"
+#include "libft.h"
+#include <stdlib.h>
+
+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);
+}
index d7cb3b2209656e0988cff66fce4d4f8b4e0b4908..0d7a5ad202aa5e68e2a5aa5438f63b879db33035 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: ljiriste <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   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