[Lemon-commits] Balazs Dezso: Bidirectional iterator support for...

Lemon HG hg at lemon.cs.elte.hu
Fri Mar 1 18:43:57 CET 2013


details:   http://lemon.cs.elte.hu/hg/lemon/rev/d450a02728d0
changeset: 1210:d450a02728d0
user:      Balazs Dezso <deba [at] inf.elte.hu>
date:      Fri Mar 19 18:23:47 2010 +0100
description:
	Bidirectional iterator support for radixSort() (#362)

diffstat:

 lemon/radix_sort.h |  18 +++++++++---------
 1 files changed, 9 insertions(+), 9 deletions(-)

diffs (63 lines):

diff --git a/lemon/radix_sort.h b/lemon/radix_sort.h
--- a/lemon/radix_sort.h
+++ b/lemon/radix_sort.h
@@ -34,6 +34,12 @@
 
   namespace _radix_sort_bits {
 
+    template <typename Iterator>
+    bool unitRange(Iterator first, Iterator last) {
+      ++first;
+      return first == last;
+    }
+
     template <typename Value>
     struct Identity {
       const Value& operator()(const Value& val) {
@@ -60,9 +66,6 @@
       }
       std::iter_swap(first, last);
       ++first;
-      if (!(first < last)) {
-        return first;
-      }
       while (true) {
         while (!(functor(*first) & mask)) {
           ++first;
@@ -71,7 +74,7 @@
         while (functor(*last) & mask) {
           --last;
         }
-        if (!(first < last)) {
+        if (unitRange(last, first)) {
           return first;
         }
         std::iter_swap(first, last);
@@ -97,9 +100,6 @@
       }
       std::iter_swap(first, last);
       ++first;
-      if (!(first < last)) {
-        return first;
-      }
       while (true) {
         while (functor(*first) < 0) {
           ++first;
@@ -108,7 +108,7 @@
         while (functor(*last) >= 0) {
           --last;
         }
-        if (!(first < last)) {
+        if (unitRange(last, first)) {
           return first;
         }
         std::iter_swap(first, last);
@@ -119,7 +119,7 @@
     template <typename Value, typename Iterator, typename Functor>
     void radixIntroSort(Iterator first, Iterator last,
                         Functor functor, Value mask) {
-      while (mask != 0 && last - first > 1) {
+      while (mask != 0 && first != last && !unitRange(first, last)) {
         Iterator cut = radixSortPartition(first, last, functor, mask);
         mask >>= 1;
         radixIntroSort(first, cut, functor, mask);



More information about the Lemon-commits mailing list