X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/0f5e8daaa6e9f74521068aa75837200bcd182ea6..11047b815e4628f874c983e757821ca6445e14ce:/src/xbt/dynar.c diff --git a/src/xbt/dynar.c b/src/xbt/dynar.c index bead04b141..0519a4a494 100644 --- a/src/xbt/dynar.c +++ b/src/xbt/dynar.c @@ -441,7 +441,6 @@ xbt_dynar_replace(xbt_dynar_t dynar, { _dynar_lock(dynar); _sanity_check_dynar(dynar); - _sanity_check_idx(idx); if (idx < dynar->used && dynar->free_f) { void *const old_object = _xbt_dynar_elm(dynar, idx); @@ -459,11 +458,10 @@ static XBT_INLINE void *_xbt_dynar_insert_at_ptr(xbt_dynar_t const dynar, void *res; unsigned long old_used; unsigned long new_used; - unsigned long nb_shift; + long nb_shift; _sanity_check_dynar(dynar); _sanity_check_idx(idx); - _check_sloppy_inbound_idx(dynar, idx); old_used = dynar->used; new_used = old_used + 1; @@ -472,9 +470,10 @@ static XBT_INLINE void *_xbt_dynar_insert_at_ptr(xbt_dynar_t const dynar, nb_shift = old_used - idx; - if (nb_shift) + if (nb_shift>0) { memmove(_xbt_dynar_elm(dynar, idx + 1), _xbt_dynar_elm(dynar, idx), nb_shift * dynar->elmsize); + } dynar->used = new_used; res = _xbt_dynar_elm(dynar, idx); @@ -709,6 +708,7 @@ XBT_INLINE void xbt_dynar_cursor_unlock(xbt_dynar_t dynar) /** @brief Sorts a dynar according to the function compar_fn * + * \param dynar the dynar to sort * \param compar_fn comparison function of type (int (compar_fn*) (void*) (void*)). * * Remark: if the elements stored in the dynar are structures, the compar_fn @@ -725,6 +725,42 @@ XBT_INLINE void xbt_dynar_sort(xbt_dynar_t dynar, _dynar_unlock(dynar); } +/* + * Return 0 if d1 and d2 are equal and 1 if not equal + */ +XBT_INLINE int xbt_dynar_compare(xbt_dynar_t d1, xbt_dynar_t d2, + int(*compar)(const void *, const void *)) +{ + int i ; + int size; + if((!d1) && (!d2)) return 0; + if((!d1) || (!d2)) + { + DEBUG2("NULL dynar d1=%p d2=%p",d1,d2); + return 1; + } + if((d1->elmsize)!=(d2->elmsize)) + { + DEBUG2("Size of elmsize d1=%ld d2=%ld",d1->elmsize,d2->elmsize); + return 1; // xbt_die + } + if(xbt_dynar_length(d1) != xbt_dynar_length(d2)) + { + DEBUG2("Size of dynar d1=%ld d2=%ld",xbt_dynar_length(d1),xbt_dynar_length(d2)); + return 1; + } + + size = xbt_dynar_length(d1); + for(i=0;i=0; cpt--) { + xbt_dynar_replace(d, cpt, &cpt); + xbt_test_log2("Push %d, length=%lu", cpt, xbt_dynar_length(d)); + } + + /* 3. Traverse the dynar */ + xbt_dynar_foreach(d, cursor, cpt) { + xbt_test_assert2(cursor == cpt, + "The retrieved value is not the same than the injected one (%d!=%d)", + cursor, cpt); + } + /* end_of_traversal */ + + for (cpt =NB_ELEM-1; cpt >=0; cpt--) { + int val; + xbt_dynar_remove_at(d,xbt_dynar_length(d)-1,&val); + xbt_test_assert2(cpt == val, + "The retrieved value is not the same than the injected one (%d!=%d)", + cursor, cpt); + } + xbt_test_assert1(xbt_dynar_length(d) == 0, + "There is still %lu elements in the dynar after removing everything", + xbt_dynar_length(d)); + xbt_dynar_free(&d); +} + /*******************************************************************************/ /*******************************************************************************/ /*******************************************************************************/