X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/892e136b3be07e45110a5a2db2889470386e954a..b3a44a43751dd7c18b6e5a9ff111d83435dcbc76:/src/xbt/dynar.cpp diff --git a/src/xbt/dynar.cpp b/src/xbt/dynar.cpp index 5205938f47..0ceb8cc948 100644 --- a/src/xbt/dynar.cpp +++ b/src/xbt/dynar.cpp @@ -10,6 +10,7 @@ #include "xbt/sysdep.h" #include "xbt/log.h" #include "xbt/ex.h" +#include #include "xbt/dynar.h" #include @@ -17,7 +18,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_dyn, xbt, "Dynamic arrays"); static inline void _sanity_check_dynar(xbt_dynar_t dynar) { - xbt_assert(dynar, "dynar is NULL"); + xbt_assert(dynar, "dynar is nullptr"); } static inline void _sanity_check_idx(int idx) @@ -83,7 +84,7 @@ void xbt_dynar_dump(xbt_dynar_t dynar) /** @brief Constructor * * \param elmsize size of each element in the dynar - * \param free_f function to call each time we want to get rid of an element (or NULL if nothing to do). + * \param free_f function to call each time we want to get rid of an element (or nullptr if nothing to do). * * Creates a new dynar. If a free_func is provided, the elements have to be pointer of pointer. That is to say that * dynars can contain either base types (int, char, double, etc) or pointer of pointers (struct **). @@ -95,7 +96,7 @@ xbt_dynar_t xbt_dynar_new(const unsigned long elmsize, void_f_pvoid_t const free dynar->size = 0; dynar->used = 0; dynar->elmsize = elmsize; - dynar->data = NULL; + dynar->data = nullptr; dynar->free_f = free_f; return dynar; @@ -114,7 +115,7 @@ void xbt_dynar_free_container(xbt_dynar_t * dynar) xbt_dynar_t d = *dynar; free(d->data); free(d); - *dynar = NULL; + *dynar = nullptr; } } @@ -370,7 +371,7 @@ void xbt_dynar_remove_at(xbt_dynar_t const dynar, const int idx, void *const obj /** @brief Remove a slice of the dynar, sliding the rest of the values to the left * * This function removes an n-sized slice that starts at element idx. It is equivalent to xbt_dynar_remove_at with a - * NULL object argument if n equals to 1. + * nullptr object argument if n equals to 1. * * Each of the removed elements is freed using the free_f function passed at dynar creation. */ @@ -460,15 +461,14 @@ signed int xbt_dynar_search_or_negative(xbt_dynar_t const dynar, void *const ele */ int xbt_dynar_member(xbt_dynar_t const dynar, void *const elem) { - try { - xbt_dynar_search(dynar, elem); - } - catch (xbt_ex& e) { - if (e.category == not_found_error) - return 0; - throw; - } - return 1; + unsigned long it; + + for (it = 0; it < dynar->used; it++) + if (!memcmp(_xbt_dynar_elm(dynar, it), elem, dynar->elmsize)) { + return 1; + } + + return 0; } /** @brief Make room at the end of the dynar for a new element, and return a pointer to it. @@ -554,7 +554,7 @@ void xbt_dynar_map(const xbt_dynar_t dynar, void_f_pvoid_t const op) */ void xbt_dynar_cursor_rm(xbt_dynar_t dynar, unsigned int *const cursor) { - xbt_dynar_remove_at(dynar, (*cursor)--, NULL); + xbt_dynar_remove_at(dynar, (*cursor)--, nullptr); } /** @brief Sorts a dynar according to the function compar_fn @@ -585,7 +585,8 @@ void xbt_dynar_cursor_rm(xbt_dynar_t dynar, unsigned int *const cursor) */ void xbt_dynar_sort(xbt_dynar_t dynar, int_f_cpvoid_cpvoid_t compar_fn) { - qsort(dynar->data, dynar->used, dynar->elmsize, compar_fn); + if (dynar->data != nullptr) + qsort(dynar->data, dynar->used, dynar->elmsize, compar_fn); } static int strcmp_voidp(const void *pa, const void *pb) { @@ -645,7 +646,7 @@ XBT_PUBLIC(void) xbt_dynar_three_way_partition(xbt_dynar_t const dynar, int_f_pv xbt_free(tmp); } -/** @brief Transform a dynar into a NULL terminated array. +/** @brief Transform a dynar into a nullptr terminated array. * * \param dynar the dynar to transform * \return pointer to the first element of the array @@ -680,7 +681,7 @@ int xbt_dynar_compare(xbt_dynar_t d1, xbt_dynar_t d2, int(*compar)(const void *, if((!d1) && (!d2)) return 0; if((!d1) || (!d2)) { - XBT_DEBUG("NULL dynar d1=%p d2=%p",d1,d2); + XBT_DEBUG("nullptr dynar d1=%p d2=%p",d1,d2); xbt_dynar_free(&d2); return 1; } @@ -725,7 +726,7 @@ XBT_TEST_UNIT("int", test_dynar_int, "Dynars of integers") int *iptr; xbt_test_add("==== Traverse the empty dynar"); - d = xbt_dynar_new(sizeof(int), NULL); + d = xbt_dynar_new(sizeof(int), nullptr); xbt_dynar_foreach(d, cursor, i) { xbt_die( "Damnit, there is something in the empty dynar"); } @@ -736,7 +737,7 @@ XBT_TEST_UNIT("int", test_dynar_int, "Dynars of integers") xbt_test_add("==== Push %d int, set them again 3 times, traverse them, shift them", NB_ELEM); /* Populate_ints [doxygen cruft] */ /* 1. Populate the dynar */ - d = xbt_dynar_new(sizeof(int), NULL); + d = xbt_dynar_new(sizeof(int), nullptr); for (cpt = 0; cpt < NB_ELEM; cpt++) { xbt_dynar_push_as(d, int, cpt); /* This is faster (and possible only with scalars) */ /* xbt_dynar_push(d,&cpt); This would also work */ @@ -800,7 +801,7 @@ XBT_TEST_UNIT("int", test_dynar_int, "Dynars of integers") /* in your code is naturally the way to go outside a regression test */ xbt_test_add("==== Unshift/pop %d int", NB_ELEM); - d = xbt_dynar_new(sizeof(int), NULL); + d = xbt_dynar_new(sizeof(int), nullptr); for (cpt = 0; cpt < NB_ELEM; cpt++) { xbt_dynar_unshift(d, &cpt); XBT_DEBUG("Push %d, length=%lu", cpt, xbt_dynar_length(d)); @@ -815,7 +816,7 @@ XBT_TEST_UNIT("int", test_dynar_int, "Dynars of integers") /* in your code is naturally the way to go outside a regression test */ xbt_test_add ("==== Push %d int, insert 1000 int in the middle, shift everything", NB_ELEM); - d = xbt_dynar_new(sizeof(int), NULL); + d = xbt_dynar_new(sizeof(int), nullptr); for (cpt = 0; cpt < NB_ELEM; cpt++) { xbt_dynar_push_as(d, int, cpt); XBT_DEBUG("Push %d, length=%lu", cpt, xbt_dynar_length(d)); @@ -845,7 +846,7 @@ XBT_TEST_UNIT("int", test_dynar_int, "Dynars of integers") /* in your code is naturally the way to go outside a regression test */ xbt_test_add("==== Push %d int, remove 2000-4000. free the rest", NB_ELEM); - d = xbt_dynar_new(sizeof(int), NULL); + d = xbt_dynar_new(sizeof(int), nullptr); for (cpt = 0; cpt < NB_ELEM; cpt++) xbt_dynar_push_as(d, int, cpt); @@ -862,7 +863,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(unsigned int), NULL); + xbt_dynar_t d = xbt_dynar_new(sizeof(unsigned int), nullptr); unsigned int cursor; int cpt; @@ -897,7 +898,7 @@ XBT_TEST_UNIT("insert",test_dynar_insert,"Using the xbt_dynar_insert and xbt_dyn /* ********************* */ xbt_test_add("==== Insert %d int in reverse order, traverse them, remove them",NB_ELEM); - d = xbt_dynar_new(sizeof(int), NULL); + d = xbt_dynar_new(sizeof(int), nullptr); for (cpt = NB_ELEM-1; cpt >=0; cpt--) { xbt_dynar_replace(d, cpt, &cpt); xbt_test_log("Push %d, length=%lu", cpt, xbt_dynar_length(d)); @@ -928,7 +929,7 @@ XBT_TEST_UNIT("double", test_dynar_double, "Dynars of doubles") double d1, d2; xbt_test_add("==== Traverse the empty dynar"); - d = xbt_dynar_new(sizeof(int), NULL); + d = xbt_dynar_new(sizeof(int), nullptr); xbt_dynar_foreach(d, cursor, cpt) { xbt_test_assert(FALSE, "Damnit, there is something in the empty dynar"); } @@ -937,7 +938,7 @@ XBT_TEST_UNIT("double", test_dynar_double, "Dynars of doubles") /* in your code is naturally the way to go outside a regression test */ xbt_test_add("==== Push/shift 5000 doubles"); - d = xbt_dynar_new(sizeof(double), NULL); + d = xbt_dynar_new(sizeof(double), nullptr); for (cpt = 0; cpt < 5000; cpt++) { d1 = (double) cpt; xbt_dynar_push(d, &d1); @@ -956,7 +957,7 @@ XBT_TEST_UNIT("double", test_dynar_double, "Dynars of doubles") /* in your code is naturally the way to go outside a regression test */ xbt_test_add("==== Unshift/pop 5000 doubles"); - d = xbt_dynar_new(sizeof(double), NULL); + d = xbt_dynar_new(sizeof(double), nullptr); for (cpt = 0; cpt < 5000; cpt++) { d1 = (double) cpt; xbt_dynar_unshift(d, &d1); @@ -971,7 +972,7 @@ XBT_TEST_UNIT("double", test_dynar_double, "Dynars of doubles") /* in your code is naturally the way to go outside a regression test */ xbt_test_add("==== Push 5000 doubles, insert 1000 doubles in the middle, shift everything"); - d = xbt_dynar_new(sizeof(double), NULL); + d = xbt_dynar_new(sizeof(double), nullptr); for (cpt = 0; cpt < 5000; cpt++) { d1 = (double) cpt; xbt_dynar_push(d, &d1); @@ -1004,7 +1005,7 @@ XBT_TEST_UNIT("double", test_dynar_double, "Dynars of doubles") /* in your code is naturally the way to go outside a regression test */ xbt_test_add("==== Push 5000 double, remove 2000-4000. free the rest"); - d = xbt_dynar_new(sizeof(double), NULL); + d = xbt_dynar_new(sizeof(double), nullptr); for (cpt = 0; cpt < 5000; cpt++) { d1 = (double) cpt; xbt_dynar_push(d, &d1);