# HG changeset patch # User David Demelier # Date 1317569323 -7200 # Node ID f1e1849401978af42a574781c4091d22f320cf30 # Parent 30499f543188442503ecace578f1a104a100afab Same last commit for array too diff -r 30499f543188 -r f1e184940197 array.c --- a/array.c Sun Oct 02 11:26:30 2011 +0200 +++ b/array.c Sun Oct 02 17:28:43 2011 +0200 @@ -169,7 +169,7 @@ */ int -array_swap(struct array *arr, int i1, int i2) +array_iswap(struct array *arr, int i1, int i2) { /* Out of bounds */ if (i1 >= arr->length || i1 < 0 || i2 >= arr->length || i2 < 0) @@ -198,6 +198,32 @@ } /* + * Swap the two elements referenced by data `o1' and `o2'. This function + * may be slow on large arrays since it must travel all the object + * to find the indexes. + */ + +int +array_pswap(struct array *arr, const void *o1, const void *o2) +{ + int found, i1, i2; + + for (i1 = found = 0; !found && i1 < arr->length; ++i1) + found = memcmp(arr->data + OFFSET(i1), o1, arr->unit) == 0; + + if (!found) + return -1; + + for (i2 = found = 0; !found && i2 < arr->length; ++i2) + found = memcmp(arr->data + OFFSET(i2), o2, arr->unit) == 0; + + if (!found) + return -1; + + return array_iswap(arr, --i1, --i2); +} + +/* * Apply the function `fn' on each object and give the optional `udata' * argument to the function too. */ diff -r 30499f543188 -r f1e184940197 array.h --- a/array.h Sun Oct 02 11:26:30 2011 +0200 +++ b/array.h Sun Oct 02 17:28:43 2011 +0200 @@ -48,7 +48,8 @@ void array_unqueue(struct array *); void array_remove(struct array *, int); void array_unref(struct array *, const void *); -int array_swap(struct array *, int, int); +int array_iswap(struct array *, int, int); +int array_pswap(struct array *, const void *, const void *); void array_map(const struct array *, void (*fn)(void *, void *), void *); void *array_find(const struct array *, int (*fn)(void *, void *), int *, void *); void array_clear(struct array *); diff -r 30499f543188 -r f1e184940197 parray.c --- a/parray.c Sun Oct 02 11:26:30 2011 +0200 +++ b/parray.c Sun Oct 02 17:28:43 2011 +0200 @@ -166,7 +166,7 @@ */ int -parray_swap(struct parray *arr, int i1, int i2) +parray_iswap(struct parray *arr, int i1, int i2) { void *tmp; @@ -182,6 +182,32 @@ } /* + * Swap the two elements referenced by data `o1' and `o2'. This function + * may be slow on large arrays since it must travel all the object + * to find the indexes. + */ + +int +parray_pswap(struct parray *arr, const void *o1, const void *o2) +{ + int found, i1, i2; + + for (i1 = found = 0; !found && i1 < arr->length; ++i1) + found = arr->datas[i1] == o1; + + if (!found) + return -1; + + for (i2 = found = 0; !found && i2 < arr->length; ++i2) + found = arr->datas[i2] == o2; + + if (!found) + return -1; + + return parray_iswap(arr, --i1, --i2); +} + +/* * Apply the function `fn' on each object and give the optional `udata' * argument to the function too. */ diff -r 30499f543188 -r f1e184940197 parray.h --- a/parray.h Sun Oct 02 11:26:30 2011 +0200 +++ b/parray.h Sun Oct 02 17:28:43 2011 +0200 @@ -46,7 +46,8 @@ void parray_unqueue(struct parray *); void parray_remove(struct parray *, int); void parray_unref(struct parray *, const void *); -int parray_swap(struct parray *, int, int); +int parray_iswap(struct parray *, int, int); +int parray_pswap(struct parray *, const void *, const void *); void parray_map(const struct parray *, void (*fn)(void *, void *), void *); void *parray_find(const struct parray *, int (*fn)(void *, void *), int *, void *); void parray_clear(struct parray *);