[libgee] Introduce the Comparable interface and provide a CompareFunc for it



commit 845416a243ff532cfbac696913eacd936fe32b63
Author: Didier 'Ptitjes <ptitjes free fr>
Date:   Sun Sep 20 02:53:17 2009 +0200

    Introduce the Comparable interface and provide a CompareFunc for it

 gee/Makefile.am           |    1 +
 gee/comparable.vala       |   34 ++++++++++++++++++++++++++++
 gee/functions.vala        |    6 +++++
 tests/Makefile.am         |    1 +
 tests/testcomparable.vala |   54 +++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 96 insertions(+), 0 deletions(-)
---
diff --git a/gee/Makefile.am b/gee/Makefile.am
index f9d7266..58cd296 100644
--- a/gee/Makefile.am
+++ b/gee/Makefile.am
@@ -22,6 +22,7 @@ libgee_la_VALASOURCES = \
 	arraylist.vala \
 	bidiriterator.vala \
 	collection.vala \
+	comparable.vala \
 	deque.vala \
 	functions.vala \
 	hashmap.vala \
diff --git a/gee/comparable.vala b/gee/comparable.vala
new file mode 100644
index 0000000..5d848d8
--- /dev/null
+++ b/gee/comparable.vala
@@ -0,0 +1,34 @@
+/* comparable.vala
+ *
+ * Copyright (C) 2009  Didier Villevalois
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
+ *
+ * Author:
+ * 	Didier 'Ptitjes Villevalois <ptitjes free fr>
+ */
+
+/**
+ * This interface defines a total ordering among each class implementing it.
+ */
+public interface Gee.Comparable<G> : Object {
+	/**
+	 * Compares this object with the specifed object.
+	 *
+	 * @return a negative integer, zero, or a positive integer as this object
+	 *         is less than, equal to, or greater than the specified object
+	 */
+	public abstract int compare_to (G object);
+}
diff --git a/gee/functions.vala b/gee/functions.vala
index bcb4207..02267dc 100644
--- a/gee/functions.vala
+++ b/gee/functions.vala
@@ -70,12 +70,18 @@ namespace Gee {
 		public static CompareFunc get_compare_func_for (Type t) {
 			if (t == typeof (string)) {
 				return (CompareFunc) strcmp;
+			} else if (t.is_a (typeof (Comparable))) {
+				return (CompareFunc) comparable_compare;
 			} else {
 				return (CompareFunc) direct_compare;
 			}
 		}
 	}
 
+	internal static int comparable_compare (void* a, void* b) {
+		return ((Comparable) a).compare_to ((Comparable) b);
+	}
+
 	/**
 	 * Compares two arbitrary elements together.
 	 *
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 8450a19..287e539 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -18,6 +18,7 @@ tests_VALASOURCES = \
        testarraylist.vala \
        testcase.vala \
        testcollection.vala \
+       testcomparable.vala \
        testdeque.vala \
        testhashmap.vala \
        testhashmultimap.vala \
diff --git a/tests/testcomparable.vala b/tests/testcomparable.vala
new file mode 100644
index 0000000..a646176
--- /dev/null
+++ b/tests/testcomparable.vala
@@ -0,0 +1,54 @@
+/* testcomparable.vala
+ *
+ * Copyright (C) 2009  Didier Villevalois
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
+ *
+ * Author:
+ * 	Didier 'Ptitjes' Villevalois <ptitjes free fr>
+ */
+
+using Gee;
+
+public class ComparableTests : Gee.TestCase {
+
+	public ComparableTests () {
+		base("Comparable");
+		add_test ("[Comparable] selected functions", test_selected_functions);
+	}
+
+	private class TestComparable : Object, Comparable<TestComparable> {
+		public int _a;
+
+		public TestComparable (int a) {
+			_a = a;
+		}
+
+		public int compare_to (TestComparable object) {
+			return _a - object._a;
+		}
+	}
+
+	public void test_selected_functions () {
+		TestComparable o1 = new TestComparable (10);
+		TestComparable o2 = new TestComparable (20);
+
+		CompareFunc compare = Functions.get_compare_func_for (typeof (TestComparable));
+		assert (compare (o1, o2) < 0);
+
+		o1._a = 42;
+		assert (compare (o1, o2) > 0);
+	}
+}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]