Bläddra i källkod

2010-04-16 Gonzalo Paniagua Javier <[email protected]>

	* test/ptrarray.c: new tests
	* src/gptrarray.c: implemented g_ptr_array_remove_fast().


svn path=/trunk/mono/; revision=155648
Gonzalo Paniagua Javier 15 år sedan
förälder
incheckning
642da69a26
3 ändrade filer med 67 tillägg och 0 borttagningar
  1. 5 0
      eglib/ChangeLog
  2. 21 0
      eglib/src/gptrarray.c
  3. 41 0
      eglib/test/ptrarray.c

+ 5 - 0
eglib/ChangeLog

@@ -1,3 +1,8 @@
+2010-04-16 Gonzalo Paniagua Javier <[email protected]>
+
+	* test/ptrarray.c: new tests
+	* src/gptrarray.c: implemented g_ptr_array_remove_fast().
+
 2010-04-10  Andreas Faerber  <[email protected]>
 
 	* configure.ac: Add checks for libm and libdl.

+ 21 - 0
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)
 {

+ 41 - 0
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}
 };