Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[XBT] Amended docs for xbt/dict
[simgrid.git] / src / xbt / dict.c
index 9d2ba31..95bda63 100644 (file)
@@ -1,6 +1,6 @@
 /* dict - a generic dictionary, variation over hash table                   */
 
-/* Copyright (c) 2004-2014. The SimGrid Team.
+/* Copyright (c) 2004-2015. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 #include "xbt/ex.h"
 #include "xbt/log.h"
 #include "xbt/mallocator.h"
-#include "xbt_modinter.h"
+#include "src/xbt_modinter.h"
 #include "xbt/str.h"
 #include "dict_private.h"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_dict, xbt,
-                                "Dictionaries provide the same functionalities than hash tables");
+                                "Dictionaries provide the same functionalities as hash tables");
 
 /**
  * \brief Constructor
  * \return pointer to the destination
- * \see xbt_dict_free()
+ * \see xbt_dict_new_homogenous(), xbt_dict_free()
  *
  * Creates and initialize a new dictionary with a default hashtable size.
  * The dictionary is heterogeneous: each element can have a different free
@@ -156,7 +156,9 @@ static void xbt_dict_rehash(xbt_dict_t dict)
  * \param key_len the size of the \a key
  * \param data the data to add in the dict
  * \param free_ctn function to call with (\a data as argument) when
- *        \a data is removed from the dictionary
+ *        \a data is removed from the dictionary. This param
+ *        will only be considered when the dict was instantiated with
+ *        xbt_dict_new() and not xbt_dict_new_homogeneous()
  *
  * Set the \a data in the structure under the \a key, which can be any kind
  * of data, as long as its length is provided in \a key_len.
@@ -210,7 +212,9 @@ XBT_INLINE void xbt_dict_set_ext(xbt_dict_t dict,
  * \param key the key to set the new data
  * \param data the data to add in the dict
  * \param free_ctn function to call with (\a data as argument) when
- *        \a data is removed from the dictionary
+ *        \a data is removed from the dictionary. This param
+ *        will only be considered when the dict was instantiated with
+ *        xbt_dict_new() and not xbt_dict_new_homogeneous()
  *
  * set the \a data in the structure under the \a key, which is a
  * null terminated string.
@@ -676,7 +680,9 @@ void xbt_dict_postexit(void)
 #ifdef SIMGRID_TEST
 #include "xbt.h"
 #include "xbt/ex.h"
-#include "portable.h"
+#include "src/portable.h"
+
+#define PRINTF_STR(a) (a)?:"(null)"
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(xbt_dict);
 
@@ -822,7 +828,7 @@ static void count_check_get_key(xbt_dict_t dict, int length)
 {
   xbt_dict_cursor_t cursor;
   char *key;
-  _XBT_GNUC_UNUSED char *key2;
+  XBT_ATTRIB_UNUSED char *key2;
   void *data;
   int effective = 0;
 
@@ -892,19 +898,19 @@ static void basic_test(int homogeneous)
   fill(&head, homogeneous);
   count_check_get_key(head, 7);
   xbt_test_add("Change 123 to 'Changed 123'");
-  xbt_dict_set(head, "123", strdup("Changed 123"), free_f);
+  xbt_dict_set(head, "123", xbt_strdup("Changed 123"), free_f);
   count_check_get_key(head, 7);
 
   xbt_test_add("Change 123 back to '123'");
-  xbt_dict_set(head, "123", strdup("123"), free_f);
+  xbt_dict_set(head, "123", xbt_strdup("123"), free_f);
   count_check_get_key(head, 7);
 
   xbt_test_add("Change 12a to 'Dummy 12a'");
-  xbt_dict_set(head, "12a", strdup("Dummy 12a"), free_f);
+  xbt_dict_set(head, "12a", xbt_strdup("Dummy 12a"), free_f);
   count_check_get_key(head, 7);
 
   xbt_test_add("Change 12a to '12a'");
-  xbt_dict_set(head, "12a", strdup("12a"), free_f);
+  xbt_dict_set(head, "12a", xbt_strdup("12a"), free_f);
   count_check_get_key(head, 7);
 
   xbt_test_add("Traverse the resulting dictionary");
@@ -1172,4 +1178,27 @@ XBT_TEST_UNIT("crash", test_dict_crash, "Crash test")
   xbt_dict_free(&head);
 }
 
+XBT_TEST_UNIT("ext", test_dict_int, "Test dictionnary with int keys")
+{
+  xbt_dict_t dict = xbt_dict_new();
+  int count = 500;
+
+  xbt_test_add("Insert elements");
+  int i;
+  for (i = 0; i < count; ++i)
+    xbt_dict_set_ext(dict, (char*) &i, sizeof(i), (void*) (intptr_t) i, NULL);
+  xbt_test_assert(xbt_dict_size(dict) == count,
+    "Bad number of elements in the dictionnary");
+
+  xbt_test_add("Check elements");
+  for (i = 0; i < count; ++i) {
+    int res = (int) (intptr_t) xbt_dict_get_ext(dict, (char*) &i, sizeof(i));
+    xbt_test_assert(xbt_dict_size(dict) == count,
+      "Unexpected value at index %i, expected %i but was %i", i, i, res);
+  }
+
+  xbt_test_add("Free the array");
+  xbt_dict_free(&dict);
+}
+
 #endif                          /* SIMGRID_TEST */