X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/81b748b0102d2d3014a0b2c13f553ebe0362d679..704a4e40059072862812816366aa40b5dec2873a:/src/xbt/dynar.c diff --git a/src/xbt/dynar.c b/src/xbt/dynar.c index 5df4655f16..83c169076f 100644 --- a/src/xbt/dynar.c +++ b/src/xbt/dynar.c @@ -98,7 +98,7 @@ static XBT_INLINE const unsigned long new_length = new_size * elmsize; char *const new_data = (char *) xbt_malloc0(elmsize * new_size); - DEBUG3("expend %p from %lu to %lu elements", (void *) dynar, + DEBUG3("expand %p from %lu to %lu elements", (void *) dynar, (unsigned long) old_size, nb); if (old_data) { @@ -390,6 +390,28 @@ XBT_INLINE void *xbt_dynar_get_ptr(const xbt_dynar_t dynar, return res; } +XBT_INLINE void *xbt_dynar_set_at_ptr(const xbt_dynar_t dynar, + const unsigned long idx) +{ + + void *res; + _dynar_lock(dynar); + _sanity_check_dynar(dynar); + + _xbt_dynar_expand(dynar, idx + 1); + + if (idx >= dynar->used) { + _xbt_clear_mem(((char * const)dynar->data) + dynar->used * dynar->elmsize, + (idx + 1 - dynar->used)*dynar->elmsize); + dynar->used = idx + 1; + } + + _dynar_unlock(dynar); + + res = _xbt_dynar_elm(dynar, idx); + + return res; +} static void XBT_INLINE /* not synchronized */ _xbt_dynar_set(xbt_dynar_t dynar, @@ -397,18 +419,19 @@ _xbt_dynar_set(xbt_dynar_t dynar, { _sanity_check_dynar(dynar); - _sanity_check_idx(idx); _xbt_dynar_expand(dynar, idx + 1); if (idx >= dynar->used) { + _xbt_clear_mem(((char * const)dynar->data) + dynar->used * dynar->elmsize, + (idx + 1 - dynar->used)*dynar->elmsize); dynar->used = idx + 1; } _xbt_dynar_put_elm(dynar, idx, src); } -/** @brief Set the Nth element of a dynar (expended if needed). Previous value at this position is NOT freed +/** @brief Set the Nth element of a dynar (expanded if needed). Previous value at this position is NOT freed * * \param dynar information dealer * \param idx index of the slot we want to modify @@ -425,7 +448,7 @@ XBT_INLINE void xbt_dynar_set(xbt_dynar_t dynar, const int idx, _dynar_unlock(dynar); } -/** @brief Set the Nth element of a dynar (expended if needed). Previous value is freed +/** @brief Set the Nth element of a dynar (expanded if needed). Previous value is freed * * \param dynar * \param idx @@ -495,7 +518,7 @@ void *xbt_dynar_insert_at_ptr(xbt_dynar_t const dynar, const int idx) return res; } -/** @brief Set the Nth dynar's element, expending the dynar and sliding the previous values to the right +/** @brief Set the Nth dynar's element, expanding the dynar and sliding the previous values to the right * * Set the Nth element of a dynar, expanding the dynar if needed, and * moving the previously existing value and all subsequent ones to one @@ -708,6 +731,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 @@ -724,6 +748,21 @@ XBT_INLINE void xbt_dynar_sort(xbt_dynar_t dynar, _dynar_unlock(dynar); } +/** @brief Transform a dynar into a NULL terminated array + * + * \param dynar the dynar to transform + */ +XBT_INLINE void * xbt_dynar_to_array (xbt_dynar_t dynar) +{ + void * res; + void * last = xbt_new0(char,dynar->elmsize); + xbt_dynar_push(dynar, last); + free(last); + res = dynar->data; + free(dynar); + return res; +} + /* * Return 0 if d1 and d2 are equal and 1 if not equal */ @@ -925,7 +964,7 @@ XBT_TEST_UNIT("int", test_dynar_int, "Dynars of integers") /*******************************************************************************/ XBT_TEST_UNIT("insert",test_dynar_insert,"Using the xbt_dynar_insert and xbt_dynar_remove functions") { - xbt_dynar_t d = xbt_dynar_new(sizeof(int), NULL); + xbt_dynar_t d = xbt_dynar_new(sizeof(unsigned int), NULL); unsigned int cursor; int cpt;