diff options
author | Sebastian Geerken <devnull@localhost> | 2013-04-10 22:52:55 +0200 |
---|---|---|
committer | Sebastian Geerken <devnull@localhost> | 2013-04-10 22:52:55 +0200 |
commit | 812d9f27982903650a0f5497cd67c1602efc1ce7 (patch) | |
tree | b259bde8c9159aa5128da469944a699ff11f8f47 /lout/object.cc | |
parent | f28fb7335e1e47a82c9b869bf6b6f44e60372f19 (diff) |
Introduced Comparator.
Diffstat (limited to 'lout/object.cc')
-rw-r--r-- | lout/object.cc | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/lout/object.cc b/lout/object.cc index 99b5902d..2b87e98b 100644 --- a/lout/object.cc +++ b/lout/object.cc @@ -107,29 +107,44 @@ size_t Object::sizeOf() } // ---------------- -// Comparable +// Comparator // ---------------- +Comparator *Comparator::compareFunComparator = NULL; + /** * \brief This static method may be used as compare function for * qsort(3) and bsearch(3), for an array of Object* (Object*[] or * Object**). + * + * "compareFunComparator" should be set before. + * + * \todo Not reentrant. Consider switching to reentrant variants + * (qsort_r), and compare function with an additional argument. */ -int Comparable::compareFun(const void *p1, const void *p2) +int Comparator::compareFun(const void *p1, const void *p2) { - Comparable *c1 = *(Comparable**)p1; - Comparable *c2 = *(Comparable**)p2; + return compareFunComparator->compare (*(Object**)p1, *(Object**)p2); +} - if (c1 && c2) - return ((c1)->compareTo(c2)); - else if (c1) +// ------------------------ +// StandardComparator +// ------------------------ + +int StandardComparator::compare(Object *o1, Object *o2) +{ + if (o1 && o2) + return ((Comparable*)o1)->compareTo ((Comparable*)o2); + else if (o1) return 1; - else if (c2) + else if (o2) return -1; else return 0; } +StandardComparator standardComparator; + // ------------- // Pointer // ------------- |