X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/19b3962253112b19308537bc2400de141c119d99..9fa7e1453457bf349fd0a2fb5941b08b12b77f56:/src/xbt/dynar.cpp diff --git a/src/xbt/dynar.cpp b/src/xbt/dynar.cpp index b7df27ff0d..3af15166c8 100644 --- a/src/xbt/dynar.cpp +++ b/src/xbt/dynar.cpp @@ -1,6 +1,6 @@ /* a generic DYNamic ARray implementation. */ -/* Copyright (c) 2004-2015. The SimGrid Team. +/* Copyright (c) 2004-2018. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -119,7 +119,7 @@ extern "C" void xbt_dynar_free_data(xbt_dynar_t dynar) { xbt_dynar_reset(dynar); if (dynar) - free(dynar->data); + xbt_free(dynar->data); } /** @brief Destructor of the structure not touching to the content @@ -133,8 +133,8 @@ extern "C" void xbt_dynar_free_container(xbt_dynar_t* dynar) { if (dynar && *dynar) { xbt_dynar_t d = *dynar; - free(d->data); - free(d); + xbt_free(d->data); + xbt_free(d); *dynar = nullptr; } } @@ -365,9 +365,6 @@ extern "C" void xbt_dynar_insert_at(xbt_dynar_t const dynar, const int idx, cons */ extern "C" void xbt_dynar_remove_at(xbt_dynar_t const dynar, const int idx, void* const object) { - unsigned long nb_shift; - unsigned long offset; - _sanity_check_dynar(dynar); _check_inbound_idx(dynar, idx); @@ -377,10 +374,10 @@ extern "C" void xbt_dynar_remove_at(xbt_dynar_t const dynar, const int idx, void dynar->free_f(_xbt_dynar_elm(dynar, idx)); } - nb_shift = dynar->used - 1 - idx; + unsigned long nb_shift = dynar->used - 1 - idx; if (nb_shift) { - offset = nb_shift * dynar->elmsize; + unsigned long offset = nb_shift * dynar->elmsize; memmove(_xbt_dynar_elm(dynar, idx), _xbt_dynar_elm(dynar, idx + 1), offset); } @@ -396,11 +393,7 @@ extern "C" void xbt_dynar_remove_at(xbt_dynar_t const dynar, const int idx, void */ extern "C" void xbt_dynar_remove_n_at(xbt_dynar_t const dynar, const unsigned int n, const int idx) { - unsigned long nb_shift; - unsigned long offset; - unsigned long cur; - - if (!n) + if (not n) return; _sanity_check_dynar(dynar); @@ -408,15 +401,15 @@ extern "C" void xbt_dynar_remove_n_at(xbt_dynar_t const dynar, const unsigned in _check_inbound_idx(dynar, idx + n - 1); if (dynar->free_f) { - for (cur = idx; cur < idx + n; cur++) { + for (unsigned long cur = idx; cur < idx + n; cur++) { dynar->free_f(_xbt_dynar_elm(dynar, cur)); } } - nb_shift = dynar->used - n - idx; + unsigned long nb_shift = dynar->used - n - idx; if (nb_shift) { - offset = nb_shift * dynar->elmsize; + unsigned long offset = nb_shift * dynar->elmsize; memmove(_xbt_dynar_elm(dynar, idx), _xbt_dynar_elm(dynar, idx + n), offset); } @@ -431,13 +424,13 @@ extern "C" void xbt_dynar_remove_n_at(xbt_dynar_t const dynar, const unsigned in * \code * signed int position = -1; * xbt_dynar_foreach(dynar, iter, elem) { - * if (!memcmp(elem, searched_element, sizeof(*elem))) { + * if (not memcmp(elem, searched_element, sizeof(*elem))) { * position = iter; * break; * } * } * \endcode - * + * * Raises not_found_error if not found. If you have less than 2 millions elements, you probably want to use * #xbt_dynar_search_or_negative() instead, so that you don't have to TRY/CATCH on element not found. */ @@ -446,19 +439,19 @@ extern "C" unsigned int xbt_dynar_search(xbt_dynar_t const dynar, void* const el unsigned long it; for (it = 0; it < dynar->used; it++) - if (!memcmp(_xbt_dynar_elm(dynar, it), elem, dynar->elmsize)) { + if (not memcmp(_xbt_dynar_elm(dynar, it), elem, dynar->elmsize)) { return it; } THROWF(not_found_error, 0, "Element %p not part of dynar %p", elem, dynar); - return -1; // Won't happen, just to please eclipse + return 0; // Won't happen, just to please eclipse } /** @brief Returns the position of the element in the dynar (or -1 if not found) * * Beware that if your dynar contains pointed values (such as strings) instead of scalar, this function is probably not * what you want. Check the documentation of xbt_dynar_search() for more info. - * + * * Note that usually, the dynar indices are unsigned integers. If you have more than 2 million elements in your dynar, * this very function will not work (but the other will). */ @@ -467,14 +460,14 @@ extern "C" signed int xbt_dynar_search_or_negative(xbt_dynar_t const dynar, void unsigned long it; for (it = 0; it < dynar->used; it++) - if (!memcmp(_xbt_dynar_elm(dynar, it), elem, dynar->elmsize)) { + if (not memcmp(_xbt_dynar_elm(dynar, it), elem, dynar->elmsize)) { return it; } return -1; } -/** @brief Returns a boolean indicating whether the element is part of the dynar +/** @brief Returns a boolean indicating whether the element is part of the dynar * * Beware that if your dynar contains pointed values (such as strings) instead of scalar, this function is probably not * what you want. Check the documentation of xbt_dynar_search() for more info. @@ -484,7 +477,7 @@ extern "C" int xbt_dynar_member(xbt_dynar_t const dynar, void* const elem) unsigned long it; for (it = 0; it < dynar->used; it++) - if (!memcmp(_xbt_dynar_elm(dynar, it), elem, dynar->elmsize)) { + if (not memcmp(_xbt_dynar_elm(dynar, it), elem, dynar->elmsize)) { return 1; } @@ -621,54 +614,7 @@ extern "C" xbt_dynar_t xbt_dynar_sort_strings(xbt_dynar_t dynar) return dynar; // to enable functional uses } -/** @brief Sorts a dynar according to their color assuming elements can have only three colors. - * Since there are only three colors, it is linear and much faster than a classical sort. - * See for example http://en.wikipedia.org/wiki/Dutch_national_flag_problem - * - * \param dynar the dynar to sort - * \param color the color function of type (int (compar_fn*) (void*) (void*)). The return value of color is assumed to - * be 0, 1, or 2. - * - * At the end of the call, elements with color 0 are at the beginning of the dynar, elements with color 2 are at the - * end and elements with color 1 are in the middle. - * - * Remark: if the elements stored in the dynar are structures, the color function has to retrieve the field to sort - * first. - */ -extern "C" void xbt_dynar_three_way_partition(xbt_dynar_t const dynar, int_f_pvoid_t color) -{ - unsigned long int i; - unsigned long int p = -1; - unsigned long int q = dynar->used; - const unsigned long elmsize = dynar->elmsize; - char* tmp[elmsize]; - void *elm; - - for (i = 0; i < q;) { - void *elmi = _xbt_dynar_elm(dynar, i); - int colori = color(elmi); - - if (colori == 1) { - ++i; - } else { - if (colori == 0) { - ++p; - elm = _xbt_dynar_elm(dynar, p); - ++i; - } else { /* colori == 2 */ - --q; - elm = _xbt_dynar_elm(dynar, q); - } - if (elm != elmi) { - memcpy(tmp, elm, elmsize); - memcpy(elm, elmi, elmsize); - memcpy(elmi, tmp, elmsize); - } - } - } -} - -/** @brief Transform a dynar into a nullptr 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 @@ -681,7 +627,7 @@ extern "C" void* xbt_dynar_to_array(xbt_dynar_t dynar) xbt_dynar_shrink(dynar, 1); memset(xbt_dynar_push_ptr(dynar), 0, dynar->elmsize); res = dynar->data; - free(dynar); + xbt_free(dynar); return res; } @@ -700,9 +646,9 @@ extern "C" int xbt_dynar_compare(xbt_dynar_t d1, xbt_dynar_t d2, int (*compar)(c { int i ; int size; - if((!d1) && (!d2)) + if ((not d1) && (not d2)) return 0; - if((!d1) || (!d2)) { + if ((not d1) || (not d2)) { XBT_DEBUG("nullptr dynar d1=%p d2=%p",d1,d2); xbt_dynar_free(&d2); return 1; @@ -744,7 +690,6 @@ XBT_TEST_UNIT("int", test_dynar_int, "Dynars of integers") /* Vars_decl [doxygen cruft] */ int i; unsigned int cursor; - int *iptr; xbt_test_add("==== Traverse the empty dynar"); xbt_dynar_t d = xbt_dynar_new(sizeof(int), nullptr); @@ -767,7 +712,7 @@ XBT_TEST_UNIT("int", test_dynar_int, "Dynars of integers") /* 2. Traverse manually the dynar */ for (cursor = 0; cursor < NB_ELEM; cursor++) { - iptr = (int*) xbt_dynar_get_ptr(d, cursor); + int* iptr = (int*)xbt_dynar_get_ptr(d, cursor); xbt_test_assert(cursor == (unsigned int)*iptr, "The retrieved value is not the same than the injected one (%u!=%d)", cursor, *iptr); } @@ -784,7 +729,6 @@ XBT_TEST_UNIT("int", test_dynar_int, "Dynars of integers") for (int cpt = 0; cpt < NB_ELEM; cpt++) *(int *) xbt_dynar_get_ptr(d, cpt) = cpt; - /* xbt_dynar_set(d,cpt,&cpt); */ for (int cpt = 0; cpt < NB_ELEM; cpt++) *(int *) xbt_dynar_get_ptr(d, cpt) = cpt; @@ -954,7 +898,7 @@ XBT_TEST_UNIT("double", test_dynar_double, "Dynars of doubles") xbt_test_add("==== Traverse the empty dynar"); 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"); + xbt_test_assert(false, "Damnit, there is something in the empty dynar"); } xbt_dynar_free(&d); /* This code is used both as example and as regression test, so we try to */ xbt_dynar_free(&d); /* free the struct twice here to check that it's ok, but freeing it only once */ @@ -1055,7 +999,7 @@ XBT_TEST_UNIT("string", test_dynar_string, "Dynars of strings") xbt_test_add("==== Traverse the empty dynar"); xbt_dynar_t d = xbt_dynar_new(sizeof(char*), &xbt_free_ref); xbt_dynar_foreach(d, iter, s1) { - xbt_test_assert(FALSE, "Damnit, there is something in the empty dynar"); + xbt_test_assert(false, "Damnit, there is something in the empty dynar"); } xbt_dynar_free(&d); /* This code is used both as example and as regression test, so we try to */ xbt_dynar_free(&d); /* free the struct twice here to check that it's ok, but freeing it only once */ @@ -1080,8 +1024,8 @@ XBT_TEST_UNIT("string", test_dynar_string, "Dynars of strings") for (int cpt = 0; cpt < NB_ELEM; cpt++) { snprintf(buf,1023, "%d", cpt); xbt_dynar_shift(d, &s2); - xbt_test_assert(!strcmp(buf, s2), "The retrieved value is not the same than the injected one (%s!=%s)", buf, s2); - free(s2); + xbt_test_assert(not strcmp(buf, s2), "The retrieved value is not the same than the injected one (%s!=%s)", buf, s2); + xbt_free(s2); } xbt_dynar_free(&d); /* This code is used both as example and as regression test, so we try to */ xbt_dynar_free(&d); /* free the struct twice here to check that it's ok, but freeing it only once */ @@ -1097,14 +1041,14 @@ XBT_TEST_UNIT("string", test_dynar_string, "Dynars of strings") /* 2. Traverse the dynar with the macro */ xbt_dynar_foreach(d, iter, s1) { snprintf(buf,1023, "%u", NB_ELEM - iter - 1); - xbt_test_assert(!strcmp(buf, s1), "The retrieved value is not the same than the injected one (%s!=%s)", buf, s1); + xbt_test_assert(not strcmp(buf, s1), "The retrieved value is not the same than the injected one (%s!=%s)", buf, s1); } /* 3. Traverse the dynar with the macro */ for (int cpt = 0; cpt < NB_ELEM; cpt++) { snprintf(buf,1023, "%d", cpt); xbt_dynar_pop(d, &s2); - xbt_test_assert(!strcmp(buf, s2), "The retrieved value is not the same than the injected one (%s!=%s)", buf, s2); - free(s2); + xbt_test_assert(not strcmp(buf, s2), "The retrieved value is not the same than the injected one (%s!=%s)", buf, s2); + xbt_free(s2); } /* 4. Free the resources */ xbt_dynar_free(&d); /* This code is used both as example and as regression test, so we try to */ @@ -1127,23 +1071,23 @@ XBT_TEST_UNIT("string", test_dynar_string, "Dynars of strings") for (int cpt = 0; cpt < NB_ELEM / 2; cpt++) { snprintf(buf,1023, "%d", cpt); xbt_dynar_shift(d, &s2); - xbt_test_assert(!strcmp(buf, s2), - "The retrieved value is not the same than the injected one at the begining (%s!=%s)", buf, s2); - free(s2); + xbt_test_assert(not strcmp(buf, s2), + "The retrieved value is not the same than the injected one at the begining (%s!=%s)", buf, s2); + xbt_free(s2); } for (int cpt = (NB_ELEM / 5) - 1; cpt >= 0; cpt--) { snprintf(buf,1023, "%d", cpt); xbt_dynar_shift(d, &s2); - xbt_test_assert(!strcmp(buf, s2), - "The retrieved value is not the same than the injected one in the middle (%s!=%s)", buf, s2); - free(s2); + xbt_test_assert(not strcmp(buf, s2), + "The retrieved value is not the same than the injected one in the middle (%s!=%s)", buf, s2); + xbt_free(s2); } for (int cpt = NB_ELEM / 2; cpt < NB_ELEM; cpt++) { snprintf(buf,1023, "%d", cpt); xbt_dynar_shift(d, &s2); - xbt_test_assert(!strcmp(buf, s2), "The retrieved value is not the same than the injected one at the end (%s!=%s)", - buf, s2); - free(s2); + xbt_test_assert(not strcmp(buf, s2), + "The retrieved value is not the same than the injected one at the end (%s!=%s)", buf, s2); + xbt_free(s2); } xbt_dynar_free(&d); /* This code is used both as example and as regression test, so we try to */ xbt_dynar_free(&d); /* free the struct twice here to check that it's ok, but freeing it only once */ @@ -1159,8 +1103,8 @@ XBT_TEST_UNIT("string", test_dynar_string, "Dynars of strings") for (int cpt = 2 * (NB_ELEM / 5); cpt < 4 * (NB_ELEM / 5); cpt++) { snprintf(buf,1023, "%d", cpt); xbt_dynar_remove_at(d, 2 * (NB_ELEM / 5), &s2); - xbt_test_assert(!strcmp(buf, s2), "Remove a bad value. Got %s, expected %s", s2, buf); - free(s2); + xbt_test_assert(not strcmp(buf, s2), "Remove a bad value. Got %s, expected %s", s2, buf); + xbt_free(s2); } xbt_dynar_free(&d); /* end_of_doxygen */ }