From b32668c097a4d23fa9202f067d6d9641533bfc3f Mon Sep 17 00:00:00 2001 From: gonzalo Date: Fri, 16 Apr 2010 18:59:20 +0000 Subject: [PATCH] 2010-04-16 Gonzalo Paniagua Javier * test/ptrarray.c: new tests * src/gptrarray.c: implemented g_ptr_array_remove_fast(). git-svn-id: svn+ssh://mono-cvs.ximian.com/source/trunk/mono@155648 e3ebcda4-bce8-0310-ba0a-eca2169e7518 --- eglib/ChangeLog | 5 +++++ eglib/src/gptrarray.c | 21 +++++++++++++++++++++ eglib/test/ptrarray.c | 41 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) diff --git a/eglib/ChangeLog b/eglib/ChangeLog index 70db70728..65bb20318 100644 --- a/eglib/ChangeLog +++ b/eglib/ChangeLog @@ -1,3 +1,8 @@ +2010-04-16 Gonzalo Paniagua Javier + + * test/ptrarray.c: new tests + * src/gptrarray.c: implemented g_ptr_array_remove_fast(). + 2010-04-10 Andreas Faerber * configure.ac: Add checks for libm and libdl. diff --git a/eglib/src/gptrarray.c b/eglib/src/gptrarray.c index 656c78840..bfde71522 100644 --- a/eglib/src/gptrarray.c +++ b/eglib/src/gptrarray.c @@ -177,6 +177,27 @@ g_ptr_array_remove(GPtrArray *array, gpointer data) return FALSE; } +gboolean +g_ptr_array_remove_fast(GPtrArray *array, gpointer data) +{ + guint i; + + g_return_val_if_fail(array != NULL, FALSE); + + for(i = 0; i < array->len; i++) { + if(array->pdata[i] == data) { + array->len--; + if (array->len > 0) + array->pdata [i] = array->pdata [array->len]; + else + array->pdata [i] = NULL; + return TRUE; + } + } + + return FALSE; +} + void g_ptr_array_foreach(GPtrArray *array, GFunc func, gpointer user_data) { diff --git a/eglib/test/ptrarray.c b/eglib/test/ptrarray.c index 1b2cc58c3..a823dd765 100644 --- a/eglib/test/ptrarray.c +++ b/eglib/test/ptrarray.c @@ -253,6 +253,46 @@ RESULT ptrarray_sort() return OK; } +RESULT ptrarray_remove_fast() +{ + GPtrArray *array = g_ptr_array_new(); + gchar *letters [] = { "A", "B", "C", "D", "E" }; + + if (g_ptr_array_remove_fast (array, NULL)) + return FAILED ("Removing NULL succeeded"); + + g_ptr_array_add(array, letters[0]); + if (!g_ptr_array_remove_fast (array, letters[0]) || array->len != 0) + return FAILED ("Removing last element failed"); + + g_ptr_array_add(array, letters[0]); + g_ptr_array_add(array, letters[1]); + g_ptr_array_add(array, letters[2]); + g_ptr_array_add(array, letters[3]); + g_ptr_array_add(array, letters[4]); + + if (!g_ptr_array_remove_fast (array, letters[0]) || array->len != 4) + return FAILED ("Removing first element failed"); + + if (array->pdata [0] != letters [4]) + return FAILED ("First element wasn't replaced with last upon removal"); + + if (g_ptr_array_remove_fast (array, letters[0])) + return FAILED ("Succedeed removing a non-existing element"); + + if (!g_ptr_array_remove_fast (array, letters[3]) || array->len != 3) + return FAILED ("Failed removing \"D\""); + + if (!g_ptr_array_remove_fast (array, letters[1]) || array->len != 2) + return FAILED ("Failed removing \"B\""); + + if (array->pdata [0] != letters [4] || array->pdata [1] != letters [2]) + return FAILED ("Last two elements are wrong"); + g_ptr_array_free(array, TRUE); + + return OK; +} + static Test ptrarray_tests [] = { {"alloc", ptrarray_alloc}, {"for_iterate", ptrarray_for_iterate}, @@ -262,6 +302,7 @@ static Test ptrarray_tests [] = { {"remove_index_fast", ptrarray_remove_index_fast}, {"remove", ptrarray_remove}, {"sort", ptrarray_sort}, + {"remove_fast", ptrarray_remove_fast}, {NULL, NULL} }; -- 2.11.4.GIT