Introduce the Comparable interface and provide a CompareFunc for it
authorDidier 'Ptitjes <ptitjes@free.fr>
Sun, 20 Sep 2009 00:53:17 +0000 (02:53 +0200)
committerDidier 'Ptitjes <ptitjes@free.fr>
Sun, 20 Sep 2009 00:53:17 +0000 (02:53 +0200)
gee/Makefile.am
gee/comparable.vala [new file with mode: 0644]
gee/functions.vala
tests/Makefile.am
tests/testcomparable.vala [new file with mode: 0644]

index f9d7266..58cd296 100644 (file)
@@ -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 (file)
index 0000000..5d848d8
--- /dev/null
@@ -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);
+}
index bcb4207..02267dc 100644 (file)
@@ -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.
         *
index 8450a19..287e539 100644 (file)
@@ -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 (file)
index 0000000..a646176
--- /dev/null
@@ -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);
+       }
+}