From 93d79384e96e2b9e966371397e43ebb2ab065f1a Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Fri, 27 Apr 2012 12:03:57 +0200 Subject: [PATCH] Rework xbt_dynar_three_way_partition. * use existing _xbt_dynar_elm() to retrieve elements; * swap elements only when needed. --- src/xbt/dynar.c | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/src/xbt/dynar.c b/src/xbt/dynar.c index 513fc13602..2b6a2873d7 100644 --- a/src/xbt/dynar.c +++ b/src/xbt/dynar.c @@ -736,37 +736,35 @@ XBT_PUBLIC(void) xbt_dynar_three_way_partition(xbt_dynar_t const dynar, int_f_pvoid_t color) { _dynar_lock(dynar); - unsigned long size = xbt_dynar_length(dynar); - char *data = (char *) dynar->data; unsigned long int i; unsigned long int p = -1; - unsigned long int q = size; + unsigned long int q = dynar->used; const unsigned long elmsize = dynar->elmsize; - char *tmp = xbt_malloc(elmsize); - -#define swap(a,b) do { \ - memcpy(tmp, a , elmsize); \ - memcpy( a , b , elmsize); \ - memcpy( b , tmp, elmsize); \ - } while(0) + void *tmp = xbt_malloc(elmsize); + void *elm; for (i = 0; i < q;) { - char *datai = data + i*elmsize; - int colori = color(datai); + void *elmi = _xbt_dynar_elm(dynar, i); + int colori = color(elmi); - if(colori==0) { - char *datap = data + (++p)*elmsize; - swap(datai, datap); + if (colori == 1) { ++i; - } else if (colori==2) { - char *dataq = data + (--q)*elmsize; - swap(datai, dataq); } else { - ++i; + if (colori == 0) { + elm = _xbt_dynar_elm(dynar, ++p); + ++i; + } else { /* colori == 2 */ + elm = _xbt_dynar_elm(dynar, --q); + } + if (elm != elmi) { + memcpy(tmp, elm, elmsize); + memcpy(elm, elmi, elmsize); + memcpy(elmi, tmp, elmsize); + } } } - xbt_free(tmp); _dynar_unlock(dynar); + xbt_free(tmp); } /** @brief Transform a dynar into a NULL terminated array -- 2.20.1