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)); }
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)); }
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); }