Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Corection of the gtnets-ruby bug with node.h and begining of the doc edition.
[simgrid.git] / src / xbt / dict.c
index 967e0ec..60937b3 100644 (file)
@@ -80,7 +80,9 @@ void xbt_dict_free(xbt_dict_t * dict)
   if (dict != NULL && *dict != NULL) {
     table_size = (*dict)->table_size;
     table = (*dict)->table;
-    for (i = 0; (*dict)->count && i < table_size; i++) {
+    /* Warning: the size of the table is 'table_size+1'...
+     * This is because table_size is used as a binary mask in xbt_dict_rehash */
+    for (i = 0; (*dict)->count && i <= table_size; i++) {
       current = table[i];
       while (current != NULL) {
         previous = current;
@@ -98,7 +100,7 @@ void xbt_dict_free(xbt_dict_t * dict)
 /**
  * Returns the amount of elements in the dict
  */
-unsigned int xbt_dict_size(xbt_dict_t dict)
+XBT_INLINE unsigned int xbt_dict_size(xbt_dict_t dict)
 {
   return dict->count;
 }
@@ -295,7 +297,7 @@ XBT_INLINE void xbt_dict_set_ext(xbt_dict_t dict,
  * set the \a data in the structure under the \a key, which is a
  * null terminated string.
  */
-void xbt_dict_set(xbt_dict_t dict,
+XBT_INLINE void xbt_dict_set(xbt_dict_t dict,
                   const char *key, void *data, void_f_pvoid_t free_ctn)
 {
 
@@ -312,7 +314,7 @@ void xbt_dict_set(xbt_dict_t dict,
  *
  * Search the given \a key. Throws not_found_error when not found.
  */
-void *xbt_dict_get_ext(xbt_dict_t dict, const char *key, int key_len)
+XBT_INLINE void *xbt_dict_get_ext(xbt_dict_t dict, const char *key, int key_len)
 {
 
 
@@ -357,6 +359,28 @@ void *xbt_dict_get_or_null_ext(xbt_dict_t dict, const char *key, int key_len)
   return current->content;
 }
 
+/**
+ * @brief retrieve the key associated to that object. Warning, that's a linear search
+ *
+ * Returns NULL if the object cannot be found
+ */
+char *xbt_dict_get_key(xbt_dict_t dict, const void*data) {
+  int i;
+  xbt_dictelm_t current;
+
+
+  for (i = 0; i <= dict->table_size; i++) {
+    current = dict->table[i];
+    while (current != NULL) {
+      if (current->content == data)
+        return current->key;
+      current = current->next;
+    }
+  }
+
+  return NULL;
+}
+
 /**
  * \brief Retrieve data from the dict (null-terminated key)
  *
@@ -368,7 +392,7 @@ void *xbt_dict_get_or_null_ext(xbt_dict_t dict, const char *key, int key_len)
  * Check xbt_dict_get_or_null() for a version returning NULL without exception when
  * not found.
  */
-void *xbt_dict_get(xbt_dict_t dict, const char *key)
+XBT_INLINE void *xbt_dict_get(xbt_dict_t dict, const char *key)
 {
 
   unsigned int hash_code = xbt_dict_hash(key);
@@ -390,7 +414,7 @@ void *xbt_dict_get(xbt_dict_t dict, const char *key)
 /**
  * \brief like xbt_dict_get(), but returning NULL when not found
  */
-void *xbt_dict_get_or_null(xbt_dict_t dict, const char *key)
+XBT_INLINE void *xbt_dict_get_or_null(xbt_dict_t dict, const char *key)
 {
   unsigned int hash_code = xbt_dict_hash(key);
   xbt_dictelm_t current;
@@ -418,7 +442,7 @@ void *xbt_dict_get_or_null(xbt_dict_t dict, const char *key)
  *
  * Remove the entry associated with the given \a key (throws not_found)
  */
-void xbt_dict_remove_ext(xbt_dict_t dict, const char *key, int key_len)
+XBT_INLINE void xbt_dict_remove_ext(xbt_dict_t dict, const char *key, int key_len)
 {
 
 
@@ -460,7 +484,7 @@ void xbt_dict_remove_ext(xbt_dict_t dict, const char *key, int key_len)
  *
  * Remove the entry associated with the given \a key
  */
-void xbt_dict_remove(xbt_dict_t dict, const char *key)
+XBT_INLINE void xbt_dict_remove(xbt_dict_t dict, const char *key)
 {
   xbt_dict_remove_ext(dict, key, strlen(key));
 }
@@ -498,7 +522,7 @@ void xbt_dict_reset(xbt_dict_t dict)
  * \brief Return the number of elements in the dict.
  * \param dict a dictionary
  */
-int xbt_dict_length(xbt_dict_t dict)
+XBT_INLINE int xbt_dict_length(xbt_dict_t dict)
 {
   xbt_assert(dict);
 
@@ -790,11 +814,37 @@ static void count(xbt_dict_t dict, int length)
                    "Announced length(%d) != %d.", xbt_dict_length(dict),
                    length);
 
+  xbt_dict_foreach(dict, cursor, key, data)
+    effective++;
+
+  xbt_test_assert2(effective == length, "Effective length(%d) != %d.",
+                   effective, length);
+
+}
+
+static void count_check_get_key(xbt_dict_t dict, int length)
+{
+  xbt_dict_cursor_t cursor;
+  char *key,*key2;
+  void *data;
+  int effective = 0;
+
+
+  xbt_test_add1("Count elements (expecting %d), and test the getkey function", length);
+  xbt_test_assert2(xbt_dict_length(dict) == length,
+                   "Announced length(%d) != %d.", xbt_dict_length(dict),
+                   length);
+
   xbt_dict_foreach(dict, cursor, key, data) {
     effective++;
+    key2 = xbt_dict_get_key(dict,data);
+    xbt_assert2(!strcmp(key,key2),
+          "The data was registered under %s instead of %s as expected",key2,key);
   }
+
   xbt_test_assert2(effective == length, "Effective length(%d) != %d.",
                    effective, length);
+
 }
 
 xbt_ex_t e;
@@ -802,8 +852,7 @@ xbt_dict_t head = NULL;
 char *data;
 
 
-XBT_TEST_UNIT("basic", test_dict_basic,
-              "Basic usage: change, retrieve, traverse")
+XBT_TEST_UNIT("basic", test_dict_basic,"Basic usage: change, retrieve, traverse")
 {
   xbt_test_add0("Traversal the null dictionary");
   traverse(head);
@@ -822,7 +871,7 @@ XBT_TEST_UNIT("basic", test_dict_basic,
 
   xbt_test_add0("Traverse the full dictionary");
   fill(&head);
-  count(head, 7);
+  count_check_get_key(head, 7);
 
   debuged_add_ext(head, "toto", "tutu");
   search_ext(head, "toto", "tutu");
@@ -837,22 +886,22 @@ XBT_TEST_UNIT("basic", test_dict_basic,
 
   /* CHANGING */
   fill(&head);
-  count(head, 7);
+  count_check_get_key(head, 7);
   xbt_test_add0("Change 123 to 'Changed 123'");
   xbt_dict_set(head, "123", strdup("Changed 123"), &free);
-  count(head, 7);
+  count_check_get_key(head, 7);
 
   xbt_test_add0("Change 123 back to '123'");
   xbt_dict_set(head, "123", strdup("123"), &free);
-  count(head, 7);
+  count_check_get_key(head, 7);
 
   xbt_test_add0("Change 12a to 'Dummy 12a'");
   xbt_dict_set(head, "12a", strdup("Dummy 12a"), &free);
-  count(head, 7);
+  count_check_get_key(head, 7);
 
   xbt_test_add0("Change 12a to '12a'");
   xbt_dict_set(head, "12a", strdup("12a"), &free);
-  count(head, 7);
+  count_check_get_key(head, 7);
 
   xbt_test_add0("Traverse the resulting dictionary");
   traverse(head);