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;
/**
* 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;
}
* 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)
{
*
* 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)
{
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)
*
* 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);
/**
* \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;
*
* 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)
{
*
* 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));
}
* \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);
"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;
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);
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");
/* 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);