From 625c2124b6e2481b08cea258a4a4ee50a40ed143 Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Mon, 6 Jan 2020 14:52:25 +0100 Subject: [PATCH] Drop unused xbt dynar functions. --- ChangeLog | 2 +- include/xbt/dynar.h | 23 ----- src/xbt/dynar.cpp | 209 +---------------------------------------- src/xbt/dynar_test.cpp | 56 +---------- 4 files changed, 5 insertions(+), 285 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0c715539ce..7e4332085b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -21,7 +21,7 @@ Kernel: XBT: - Remove unused parameter 'free_ctn' for xbt_dict_set() and xbt_dict_set_ext(). -- Drop unused xbt_dict functions. +- Drop unused xbt_dict and xbt_dynar functions. - New module: random, providing classical random numbers generators. SMPI: diff --git a/include/xbt/dynar.h b/include/xbt/dynar.h index 4be7eae0e4..165aa9528e 100644 --- a/include/xbt/dynar.h +++ b/include/xbt/dynar.h @@ -66,13 +66,9 @@ typedef struct xbt_dynar_s *xbt_dynar_t; typedef const struct xbt_dynar_s* const_xbt_dynar_t; XBT_PUBLIC xbt_dynar_t xbt_dynar_new(const unsigned long elm_size, void_f_pvoid_t free_f); -XBT_PUBLIC void xbt_dynar_init(xbt_dynar_t dynar, unsigned long elmsize, void_f_pvoid_t free_f); XBT_PUBLIC void xbt_dynar_free(xbt_dynar_t* dynar); -XBT_PUBLIC void xbt_dynar_free_voidp(void* dynar); XBT_PUBLIC void xbt_dynar_free_container(xbt_dynar_t* dynar); -XBT_PUBLIC void xbt_dynar_free_data(xbt_dynar_t dynar); XBT_PUBLIC void xbt_dynar_shrink(xbt_dynar_t dynar, int empty_slots); -XBT_PUBLIC void xbt_dynar_dump(const_xbt_dynar_t dynar); /** @} */ /** @defgroup XBT_dynar_array Dynar as a regular array @@ -82,18 +78,13 @@ XBT_PUBLIC void xbt_dynar_dump(const_xbt_dynar_t dynar); */ XBT_PUBLIC void xbt_dynar_get_cpy(const_xbt_dynar_t dynar, unsigned long idx, void* dst); -XBT_PUBLIC void xbt_dynar_set(xbt_dynar_t dynar, int idx, const void* src); -XBT_PUBLIC void xbt_dynar_replace(xbt_dynar_t dynar, unsigned long idx, const void* object); XBT_PUBLIC void xbt_dynar_insert_at(xbt_dynar_t dynar, int idx, const void* src); XBT_PUBLIC void xbt_dynar_remove_at(xbt_dynar_t dynar, int idx, void* dst); -XBT_PUBLIC void xbt_dynar_remove_n_at(xbt_dynar_t dynar, unsigned int n, int idx); -XBT_PUBLIC unsigned int xbt_dynar_search(const_xbt_dynar_t dynar, const void* elem); XBT_PUBLIC signed int xbt_dynar_search_or_negative(const_xbt_dynar_t dynar, const void* elem); XBT_PUBLIC int xbt_dynar_member(const_xbt_dynar_t dynar, const void* elem); XBT_PUBLIC void xbt_dynar_sort(const_xbt_dynar_t dynar, int_f_cpvoid_cpvoid_t compar_fn); -XBT_PUBLIC int xbt_dynar_compare(const_xbt_dynar_t d1, xbt_dynar_t d2, int (*compar)(const void*, const void*)); XBT_PUBLIC void* xbt_dynar_to_array(xbt_dynar_t dynar); /** @} */ @@ -106,7 +97,6 @@ XBT_PUBLIC void* xbt_dynar_to_array(xbt_dynar_t dynar); XBT_PUBLIC unsigned long xbt_dynar_length(const_xbt_dynar_t dynar); XBT_PUBLIC int xbt_dynar_is_empty(const_xbt_dynar_t dynar); XBT_PUBLIC void xbt_dynar_reset(xbt_dynar_t dynar); -XBT_PUBLIC void xbt_dynar_merge(xbt_dynar_t* d1, xbt_dynar_t* d2); /** @} */ /** @defgroup XBT_dynar_perl Perl-like use of dynars @@ -161,9 +151,6 @@ XBT_PUBLIC void* xbt_dynar_pop_ptr(xbt_dynar_t dynar); * @hideinitializer */ # define xbt_dynar_getfirst_as(dynar,type) \ (*(type*)xbt_dynar_get_ptr((dynar),0)) -/** @brief Quick insertion of scalar content - * @hideinitializer */ -#define xbt_dynar_insert_at_as(dynar, idx, type, value) *(type*)xbt_dynar_insert_at_ptr((dynar), (idx)) = (value) /** @brief Quick insertion of scalar content * @hideinitializer */ #define xbt_dynar_push_as(dynar, type, value) *(type*)xbt_dynar_push_ptr(dynar) = (value) @@ -238,16 +225,6 @@ xbt_dynar_foreach (dyn,cpt,str) { #define xbt_dynar_foreach(_dynar, _cursor, _data) \ for ((_cursor) = 0; _xbt_dynar_cursor_get((_dynar), (_cursor), &(_data)); (_cursor)++) -#ifndef __cplusplus -#define xbt_dynar_foreach_ptr(_dynar, _cursor, _ptr) \ - for ((_cursor) = 0; ((_ptr) = (_cursor) < (_dynar)->used ? xbt_dynar_get_ptr((_dynar), (_cursor)) : NULL); \ - (_cursor)++) -#else -#define xbt_dynar_foreach_ptr(_dynar, _cursor, _ptr) \ - for ((_cursor) = 0; \ - ((_ptr) = (_cursor) < (_dynar)->used ? (decltype(_ptr))xbt_dynar_get_ptr((_dynar), (_cursor)) : NULL); \ - (_cursor)++) -#endif /** @} */ SG_END_DECL diff --git a/src/xbt/dynar.cpp b/src/xbt/dynar.cpp index a8f4008f88..31bbef2572 100644 --- a/src/xbt/dynar.cpp +++ b/src/xbt/dynar.cpp @@ -29,17 +29,13 @@ static inline void _sanity_check_idx(int idx) static inline void _check_inbound_idx(const_xbt_dynar_t dynar, int idx) { - if (idx < 0 || idx >= static_cast(dynar->used)) { - throw std::out_of_range(simgrid::xbt::string_printf("dynar is not that long. You asked %d, but it's only %lu long", - idx, static_cast(dynar->used))); - } + xbt_assert(idx >= 0 && idx < static_cast(dynar->used), + "dynar is not that long. You asked %d, but it's only %lu long", idx, dynar->used); } static inline void _check_populated_dynar(const_xbt_dynar_t dynar) { - if (dynar->used == 0) { - throw std::out_of_range(simgrid::xbt::string_printf("dynar %p is empty", dynar)); - } + xbt_assert(dynar->used > 0, "dynar %p is empty", dynar); } static inline void _xbt_dynar_resize(xbt_dynar_t dynar, unsigned long new_size) @@ -75,12 +71,6 @@ static inline void _xbt_dynar_get_elm(void* dst, const_xbt_dynar_t dynar, unsign memcpy(dst, elm, dynar->elmsize); } -void xbt_dynar_dump(const_xbt_dynar_t dynar) -{ - XBT_INFO("Dynar dump: size=%lu; used=%lu; elmsize=%lu; data=%p; free_f=%p", - dynar->size, dynar->used, dynar->elmsize, dynar->data, dynar->free_f); -} - /** @brief Constructor * * @param elmsize size of each element in the dynar @@ -102,26 +92,6 @@ xbt_dynar_t xbt_dynar_new(const unsigned long elmsize, void_f_pvoid_t free_f) return dynar; } -/** @brief Initialize a dynar structure that was not malloc'ed - * This can be useful to keep temporary dynars on the stack - */ -void xbt_dynar_init(xbt_dynar_t dynar, unsigned long elmsize, void_f_pvoid_t free_f) -{ - dynar->size = 0; - dynar->used = 0; - dynar->elmsize = elmsize; - dynar->data = nullptr; - dynar->free_f = free_f; -} - -/** @brief Destroy a dynar that was created with xbt_dynar_init */ -void xbt_dynar_free_data(xbt_dynar_t dynar) -{ - xbt_dynar_reset(dynar); - if (dynar) - xbt_free(dynar->data); -} - /** @brief Destructor of the structure not touching to the content * * @param dynar poor victim @@ -154,28 +124,6 @@ void xbt_dynar_reset(xbt_dynar_t dynar) dynar->used = 0; } -/** @brief Merge dynar d2 into d1 - * - * @param d1 dynar to keep - * @param d2 dynar to merge into d1. This dynar is free at end. - */ -void xbt_dynar_merge(xbt_dynar_t* d1, xbt_dynar_t* d2) -{ - if((*d1)->elmsize != (*d2)->elmsize) - xbt_die("Element size must are not equal"); - - const unsigned long elmsize = (*d1)->elmsize; - - const void* ptr = _xbt_dynar_elm((*d2), 0); - _xbt_dynar_resize(*d1, (*d1)->size + (*d2)->size); - void *elm = _xbt_dynar_elm((*d1), (*d1)->used); - - memcpy(elm, ptr, ((*d2)->size)*elmsize); - (*d1)->used += (*d2)->used; - (*d2)->used = 0; - xbt_dynar_free(d2); -} - /** * @brief Shrink the dynar by removing empty slots at the end of the internal array * @param dynar a dynar @@ -206,13 +154,6 @@ void xbt_dynar_free(xbt_dynar_t* dynar) } } -/** @brief free a dynar passed as void* (handy to store dynar in dynars or dict) */ -void xbt_dynar_free_voidp(void* d) -{ - xbt_dynar_t dynar = (xbt_dynar_t)d; - xbt_dynar_free(&dynar); -} - /** @brief Count of dynar's elements * * @param dynar the dynar we want to measure @@ -278,41 +219,6 @@ void* xbt_dynar_set_at_ptr(const xbt_dynar_t dynar, unsigned long idx) return _xbt_dynar_elm(dynar, idx); } -/** @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 - * @param src What will be feeded to the dynar - * - * If you want to free the previous content, use xbt_dynar_replace(). - */ -void xbt_dynar_set(xbt_dynar_t dynar, int idx, const void* src) -{ - memcpy(xbt_dynar_set_at_ptr(dynar, idx), src, dynar->elmsize); -} - -/** @brief Set the Nth element of a dynar (expanded if needed). Previous value is freed - * - * @param dynar - * @param idx - * @param object - * - * Set the Nth element of a dynar, expanding the dynar if needed, AND DO free the previous value at this position. If - * you don't want to free the previous content, use xbt_dynar_set(). - */ -void xbt_dynar_replace(xbt_dynar_t dynar, unsigned long idx, const void* object) -{ - _sanity_check_dynar(dynar); - - if (idx < dynar->used && dynar->free_f) { - void *const old_object = _xbt_dynar_elm(dynar, idx); - - dynar->free_f(old_object); - } - - xbt_dynar_set(dynar, idx, object); -} - /** @brief Make room for a new element, and return a pointer to it * * You can then use regular affectation to set its value instead of relying on the slow memcpy. This is what @@ -384,68 +290,6 @@ void xbt_dynar_remove_at(xbt_dynar_t dynar, int idx, void* object) dynar->used--; } -/** @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 - * nullptr object argument if n equals to 1. - * - * Each of the removed elements is freed using the free_f function passed at dynar creation. - */ -void xbt_dynar_remove_n_at(xbt_dynar_t dynar, unsigned int n, int idx) -{ - if (not n) - return; - - _sanity_check_dynar(dynar); - _check_inbound_idx(dynar, idx); - _check_inbound_idx(dynar, idx + n - 1); - - if (dynar->free_f) { - for (unsigned long cur = idx; cur < idx + n; cur++) { - dynar->free_f(_xbt_dynar_elm(dynar, cur)); - } - } - - unsigned long nb_shift = dynar->used - n - idx; - - if (nb_shift) { - unsigned long offset = nb_shift * dynar->elmsize; - memmove(_xbt_dynar_elm(dynar, idx), _xbt_dynar_elm(dynar, idx + n), offset); - } - - dynar->used -= n; -} - -/** @brief Returns the position of the element in the dynar - * - * Beware that if your dynar contains pointed values (such as strings) instead of scalar, this function compares the - * pointer value, not what's pointed. The only solution to search for a pointed value is then to write the foreach loop - * yourself: - * @code - * signed int position = -1; - * xbt_dynar_foreach(dynar, iter, elem) { - * if (not memcmp(elem, searched_element, sizeof(*elem))) { - * position = iter; - * break; - * } - * } - * @endcode - * - * Raises std::out_of_range 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. - */ -unsigned int xbt_dynar_search(const_xbt_dynar_t dynar, const void* elem) -{ - unsigned long it; - - for (it = 0; it < dynar->used; it++) - if (not memcmp(_xbt_dynar_elm(dynar, it), elem, dynar->elmsize)) { - return it; - } - - throw std::out_of_range(simgrid::xbt::string_printf("Element %p not part of dynar %p", elem, dynar)); -} - /** @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 @@ -618,50 +462,3 @@ void* xbt_dynar_to_array(xbt_dynar_t dynar) xbt_free(dynar); return res; } - -/** @brief Compare two dynars - * - * @param d1 first dynar to compare - * @param d2 second dynar to compare - * @param compar function to use to compare elements - * @return 0 if d1 and d2 are equal and 1 if not equal - * - * d1 and d2 should be dynars of pointers. The compar function takes two elements and returns 0 when they are - * considered equal, and a value different of zero when they are considered different. Finally, d2 is destroyed - * afterwards. - */ -int xbt_dynar_compare(const_xbt_dynar_t d1, xbt_dynar_t d2, int (*compar)(const void*, const void*)) -{ - int i ; - int size; - if ((not d1) && (not d2)) - return 0; - if ((not d1) || (not d2)) { - XBT_DEBUG("nullptr dynar d1=%p d2=%p",d1,d2); - xbt_dynar_free(&d2); - return 1; - } - if((d1->elmsize)!=(d2->elmsize)) { - XBT_DEBUG("Size of elmsize d1=%lu d2=%lu",d1->elmsize,d2->elmsize); - xbt_dynar_free(&d2); - return 1; // xbt_die - } - if(xbt_dynar_length(d1) != xbt_dynar_length(d2)) { - XBT_DEBUG("Size of dynar d1=%lu d2=%lu",xbt_dynar_length(d1),xbt_dynar_length(d2)); - xbt_dynar_free(&d2); - return 1; - } - - size = xbt_dynar_length(d1); - for(i=0;i= 0; i--) { - int val; - xbt_dynar_shift(d, &val); - REQUIRE(val == i); // The retrieved value is not the same than the injected one in the middle - } - for (int i = 2500; i < NB_ELEM; i++) { - int val; - xbt_dynar_shift(d, &val); - REQUIRE(val == i); // The retrieved value is not the same than the injected one at the end - } 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 */ /* in your code is naturally the way to go outside a regression test */ @@ -182,27 +156,6 @@ TEST_CASE("xbt::dynar: generic C vector", "dynar") } REQUIRE(xbt_dynar_is_empty(d)); xbt_dynar_free(&d); - - /* ********************* */ - INFO("==== Insert " << NB_ELEM << " int in reverse order, traverse them, remove them"); - d = xbt_dynar_new(sizeof(int), nullptr); - for (int i = NB_ELEM - 1; i >= 0; i--) { - xbt_dynar_replace(d, i, &i); - } - - /* 3. Traverse the dynar */ - xbt_dynar_foreach (d, cursor, cpt) { - REQUIRE(cursor == (unsigned)cpt); // The retrieved value is not the same than the injected one - } - /* end_of_traversal */ - - for (int i = NB_ELEM - 1; i >= 0; i--) { - int val; - xbt_dynar_remove_at(d, xbt_dynar_length(d) - 1, &val); - REQUIRE(val == i); // The retrieved value is not the same than the injected one - } - REQUIRE(xbt_dynar_is_empty(d)); - xbt_dynar_free(&d); } /*******************************************************************************/ @@ -329,13 +282,6 @@ TEST_CASE("xbt::dynar: generic C vector", "dynar") s1 = xbt_strdup(buf); xbt_dynar_push(d, &s1); } - for (int k = 0; k < 3; k++) { - for (int i = 0; i < NB_ELEM; i++) { - snprintf(buf, 1023, "%d", i); - s1 = xbt_strdup(buf); - xbt_dynar_replace(d, i, &s1); - } - } for (int i = 0; i < NB_ELEM; i++) { snprintf(buf, 1023, "%d", i); xbt_dynar_shift(d, &s2); -- 2.20.1