Untested implementation of dictionary using t_rbtree.
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 \
--- /dev/null
+#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);
+}
--- /dev/null
+#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 ;
+}
--- /dev/null
+#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));
+}
--- /dev/null
+#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);
+}
/* 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 */
/* */
/* ************************************************************************** */
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