bool			f_htable_add(t_htable *v_this, const char *str, void *data)
{
	ui				key;
	t_list			*element;
	t_htable_cell	*cell;

	key = D_HTABLE(generate_key)(v_this, str);
	element = D_ARRAY(at)(&v_this->v_array, key, t_list *);
	cell = D_HTABLE(create_cell)(str, data, v_this->f_delete);
	if (cell == NULL)
		return (m_error(false, "Bad alloc"));
	return (D_LIST(push_back)(element, cell));
}
Beispiel #2
0
int	main(int argc, char const** argv)
{
	t_htable	htable;

	/*
	 * 127 is prime number OK !!
	 */
	D_HTABLE(init)(&htable, 127, NULL);
	/*
	 * Here I add "42" in htable
	 * With data (void*)1;
	 * Because it's demonstration not the truth !
	 */
	D_HTABLE(add)(&htable, "42", (void*)7);
	D_HTABLE(add)(&htable, "paris", (void*)8);
	D_HTABLE(add)(&htable, "school", (void*)9);
	/*
	 * Print all table
	 */
	D_HTABLE(print)(&htable, uf_print_value);
	uf_print_variadic("The data assigned at 42 is %d\n", D_HTABLE(get)(&htable, "42"));
	/*
	 * Free memory again yes yes (wo)man !
	 */
	D_HTABLE(destroy)(&htable);
	(void)argc;
	(void)argv;
	return (0);
}
bool	f_htable_add(t_htable *v_this, const char *str, void *data)
{
	size_t			key;
	t_list			*element;
	t_htable_cell	*cell;

	key = v_this->f_generate_key(v_this->v_prime, str);
	element = F_ARRAY_AT(&v_this->v_array, key, t_list *);
	cell = D_HTABLE(create_cell)(str, data, v_this->f_delete);
	if (cell == NULL)
		return (M_ERROR(false, "Bad alloc"));
	return (D_LIST(push_back)(element, cell));
}
Beispiel #4
0
bool	f_htable_init(t_htable *v_this, size_t prime,
				size_t (*f_generate_key)(size_t prime, const char *str),
				void (*f_delete)(void *ptr))
{
	size_t	i;
	t_list	list;

	i = 0;
	if (D_ARRAY(init)(&v_this->v_array, NULL, (void (*)(void *))D_LIST(destroy),
		sizeof(t_list)) == false)
		return (M_ERROR(false, "Could not initialize array"));
	D_LIST(init)(&list, D_HTABLE(delete_cell));
	while (i < prime)
	{
		D_ARRAY(push_back)(&v_this->v_array, &list);
		i = i + 1;
	}
	v_this->v_prime = prime;
	v_this->f_delete = f_delete;
	v_this->f_generate_key = D_HTABLE(generate_key);
	if (f_generate_key != NULL)
		v_this->f_generate_key = f_generate_key;
	return (true);
}
void	f_htable_delete(t_htable *v_this, const char *key)
{
	t_list		*list;
	t_list_cell	*cell;

	list = F_ARRAY_AT(&v_this->v_array,
					D_HTABLE(generate_key)(v_this->v_prime, key), t_list *);
	cell = D_LIST(begin)(list);
	while (cell != NULL)
	{
		if (uf_strcmp(key, ((t_htable_cell*)cell->v_data)->v_key) == 0)
		{
			D_LIST(delete)(list, cell);
			break ;
		}
		cell = cell->v_next;
	}
void			*f_htable_get(t_htable *v_this, const char *str)
{
	t_list		*list;
	void		*ret;
	t_list_cell	*cell;

	ret = NULL;
	list = D_ARRAY(at)(&v_this->v_array,
					   D_HTABLE(generate_key)(v_this, str), t_list *);
	cell = D_LIST(begin)(list);
	while (cell != NULL && ret == NULL)
	{
		if (uf_strcmp(str, ((t_htable_cell*)cell->v_data)->v_key) == 0)
			ret = ((t_htable_cell*)cell->v_data)->v_data;
		cell = cell->v_next;
	}
	return (ret);
}
void	*f_htable_erase(t_htable *v_this, const char *key)
{
	t_list		*list;
	void		*ret;
	t_list_cell	*cell;

	ret = NULL;
	list = F_ARRAY_AT(&v_this->v_array,
					D_HTABLE(generate_key)(v_this->v_prime, key), t_list *);
	cell = D_LIST(begin)(list);
	while (cell != NULL && ret == NULL)
	{
		if (uf_strcmp(key, ((t_htable_cell*)cell->v_data)->v_key) == 0)
		{
			D_LIST(erase)(list, cell, &ret);
			ret = ((t_htable_cell*)ret)->v_data;
		}
		cell = cell->v_next;
	}
	return (ret);
}