COIN-OR::LEMON - Graph Library

Ticket #362: 4e6bee56cdbb.patch

File 4e6bee56cdbb.patch, 2.0 KB (added by Balazs Dezso, 9 years ago)
  • lemon/radix_sort.h

    # HG changeset patch
    # User Balazs Dezso <deba@inf.elte.hu>
    # Date 1269019427 -3600
    # Node ID 4e6bee56cdbbf9698ef7af810904d76dae337b3c
    # Parent  87569cb5734dee71de7e2c449c1cd6500921e2a7
    Bidirectional iterator support for radixSort() (#362)
    
    diff -r 87569cb5734d -r 4e6bee56cdbb lemon/radix_sort.h
    a b  
    3434
    3535  namespace _radix_sort_bits {
    3636
     37    template <typename Iterator>
     38    bool unitRange(Iterator first, Iterator last) {
     39      ++first;
     40      return first == last;
     41    }
     42
    3743    template <typename Value>
    3844    struct Identity {
    3945      const Value& operator()(const Value& val) {
     
    6066      }
    6167      std::iter_swap(first, last);
    6268      ++first;
    63       if (!(first < last)) {
    64         return first;
    65       }
    6669      while (true) {
    6770        while (!(functor(*first) & mask)) {
    6871          ++first;
     
    7174        while (functor(*last) & mask) {
    7275          --last;
    7376        }
    74         if (!(first < last)) {
     77        if (unitRange(last, first)) {
    7578          return first;
    7679        }
    7780        std::iter_swap(first, last);
     
    97100      }
    98101      std::iter_swap(first, last);
    99102      ++first;
    100       if (!(first < last)) {
    101         return first;
    102       }
    103103      while (true) {
    104104        while (functor(*first) < 0) {
    105105          ++first;
     
    108108        while (functor(*last) >= 0) {
    109109          --last;
    110110        }
    111         if (!(first < last)) {
     111        if (unitRange(last, first)) {
    112112          return first;
    113113        }
    114114        std::iter_swap(first, last);
     
    119119    template <typename Value, typename Iterator, typename Functor>
    120120    void radixIntroSort(Iterator first, Iterator last,
    121121                        Functor functor, Value mask) {
    122       while (mask != 0 && last - first > 1) {
     122      while (mask != 0 && first != last && !unitRange(first, last)) {
    123123        Iterator cut = radixSortPartition(first, last, functor, mask);
    124124        mask >>= 1;
    125125        radixIntroSort(first, cut, functor, mask);