-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_dict_elm,xbt_dict,"Dictionaries internals");
-
-XBT_LOG_NEW_SUBCATEGORY(xbt_dict_add,xbt_dict,"Dictionaries internals: elements addition");
-XBT_LOG_NEW_SUBCATEGORY(xbt_dict_search,xbt_dict,"Dictionaries internals: searching");
-XBT_LOG_NEW_SUBCATEGORY(xbt_dict_remove,xbt_dict,"Dictionaries internals: elements removal");
-XBT_LOG_NEW_SUBCATEGORY(xbt_dict_collapse,xbt_dict,"Dictionaries internals: post-removal cleanup");
-
-xbt_dictelm_t xbt_dictelm_new(const char *key,
- int key_len,
- void *content,
- void_f_pvoid_t free_f,
- xbt_dictelm_t next) {
- xbt_dictelm_t element = xbt_new0(s_xbt_dictelm_t, 1);
-
- element->key = xbt_new0(char, key_len + 1);
- strncpy(element->key, key, key_len);
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_dict_elm, xbt_dict,
+ "Dictionaries internals");
+
+xbt_mallocator_t dict_elm_mallocator = NULL;
+xbt_mallocator_t dict_het_elm_mallocator = NULL;
+
+xbt_dictelm_t xbt_dictelm_new(xbt_dict_t dict, const char *key, int key_len,
+ unsigned int hash_code, void *content,
+ void_f_pvoid_t free_f)
+{
+ xbt_dictelm_t element;
+
+ if (dict->homogeneous) {
+ xbt_assert(!free_f,
+ "Cannot set an individual free function in homogeneous dicts.");
+ element = xbt_mallocator_get(dict_elm_mallocator);
+ } else {
+ xbt_het_dictelm_t het_element = xbt_mallocator_get(dict_het_elm_mallocator);
+ het_element->free_f = free_f;
+ element = &het_element->element;
+ }
+ element->key = xbt_new(char, key_len + 1);
+ memcpy(element->key, key, key_len);
+ element->key[key_len] = '\0';