X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/a3427ca7c9f8f2563bb982044e1082cc8f3cdd1e..5a3c64d7f437f3e64f52752b8ab2a40d04705bca:/src/xbt/dynar.c diff --git a/src/xbt/dynar.c b/src/xbt/dynar.c index b964885adb..09876099d5 100644 --- a/src/xbt/dynar.c +++ b/src/xbt/dynar.c @@ -11,6 +11,7 @@ #include "xbt/misc.h" #include "xbt/sysdep.h" #include "xbt/log.h" +#include "xbt/ex.h" #include "xbt/dynar.h" #include @@ -33,7 +34,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(dynar,xbt,"Dynamic arrays"); (int) (idx), (unsigned long) dynar->used) #define __check_sloppy_inbound_idx(dynar, idx) \ xbt_assert2(idx <= dynar->used, \ - "dynar is not that long. You asked %d, but it's only %lu long", \ + "dynar is not that long. You asked %d, but it's only %lu long (could have been equal to it)", \ (int) (idx), (unsigned long) dynar->used) #define __check_populated_dynar(dynar) \ xbt_assert1(dynar->used, \ @@ -95,9 +96,8 @@ _xbt_dynar_get_elm(void * const dst, const xbt_dynar_t dynar, const unsigned long idx) { void * const elm = _xbt_dynar_elm(dynar, idx); - const unsigned long elmsize = dynar->elmsize; - memcpy(dst, elm, elmsize); + memcpy(dst, elm, dynar->elmsize); } static _XBT_INLINE @@ -243,8 +243,7 @@ xbt_dynar_get_cpy(const xbt_dynar_t dynar, * Make a copy before fooling with it. */ void* -xbt_dynar_get_ptr(const xbt_dynar_t dynar, - const int idx) { +xbt_dynar_get_ptr(const xbt_dynar_t dynar, const int idx) { __sanity_check_dynar(dynar); __sanity_check_idx(idx); @@ -390,6 +389,41 @@ xbt_dynar_remove_at(xbt_dynar_t const dynar, dynar->used--; } +/** @brief Returns the position of the element in the dynar + * + * Raises not_found_error if not found. + */ +int +xbt_dynar_search(xbt_dynar_t const dynar, + void *const elem) { + int it; + + for (it=0; it< dynar->size; it++) + if (!memcmp(_xbt_dynar_elm(dynar, it),elem,dynar->elmsize)) + return it; + + THROW2(not_found_error,0,"Element %p not part of dynar %p",elem,dynar); +} + +/** @brief Returns a boolean indicating whether the element is part of the dynar */ +int +xbt_dynar_member(xbt_dynar_t const dynar, + void *const elem) { + + xbt_ex_t e; + + TRY { + xbt_dynar_search(dynar,elem); + } CATCH(e) { + if (e.category == not_found_error) { + xbt_ex_free(e); + return 0; + } + RETHROW; + } + return 1; +} + /** @brief Make room at the end of the dynar for a new element, and return a pointer to it. * * You can then use regular affectation to set its value instead of relying