# HG changeset patch # User Jaroslav Hajek # Date 1259931735 -3600 # Node ID 56fbe170d3542a2db3fb479bdcc78dfd97ec58d1 # Parent a463aa0aa0ab7fb0b11f6f68b82d4cfb3170e4a3 fix issorted with NaNs in middle diff -r a463aa0aa0ab -r 56fbe170d354 liboctave/Array-C.cc --- a/liboctave/Array-C.cc Fri Dec 04 15:33:51 2009 -0800 +++ b/liboctave/Array-C.cc Fri Dec 04 14:02:15 2009 +0100 @@ -60,7 +60,7 @@ } Array::compare_fcn_type -sortrows_comparator (sortmode mode, const Array& a , bool allow_chk) +safe_comparator (sortmode mode, const Array& a , bool allow_chk) { Array::compare_fcn_type result = 0; diff -r a463aa0aa0ab -r 56fbe170d354 liboctave/Array-d.cc --- a/liboctave/Array-d.cc Fri Dec 04 15:33:51 2009 -0800 +++ b/liboctave/Array-d.cc Fri Dec 04 14:02:15 2009 +0100 @@ -56,7 +56,7 @@ } Array::compare_fcn_type -sortrows_comparator (sortmode mode, const Array& a , bool allow_chk) +safe_comparator (sortmode mode, const Array& a , bool allow_chk) { Array::compare_fcn_type result = 0; diff -r a463aa0aa0ab -r 56fbe170d354 liboctave/Array-f.cc --- a/liboctave/Array-f.cc Fri Dec 04 15:33:51 2009 -0800 +++ b/liboctave/Array-f.cc Fri Dec 04 14:02:15 2009 +0100 @@ -56,7 +56,7 @@ } Array::compare_fcn_type -sortrows_comparator (sortmode mode, const Array& a , bool allow_chk) +safe_comparator (sortmode mode, const Array& a , bool allow_chk) { Array::compare_fcn_type result = 0; diff -r a463aa0aa0ab -r 56fbe170d354 liboctave/Array-fC.cc --- a/liboctave/Array-fC.cc Fri Dec 04 15:33:51 2009 -0800 +++ b/liboctave/Array-fC.cc Fri Dec 04 14:02:15 2009 +0100 @@ -60,7 +60,7 @@ } Array::compare_fcn_type -sortrows_comparator (sortmode mode, const Array& a, +safe_comparator (sortmode mode, const Array& a, bool allow_chk) { Array::compare_fcn_type result = 0; diff -r a463aa0aa0ab -r 56fbe170d354 liboctave/Array.cc --- a/liboctave/Array.cc Fri Dec 04 15:33:51 2009 -0800 +++ b/liboctave/Array.cc Fri Dec 04 14:02:15 2009 +0100 @@ -2189,55 +2189,9 @@ } template -sortmode -Array::is_sorted (sortmode mode) const -{ - if (nelem () <= 1) - return ASCENDING; - - const T *lo = data (), *hi = data () + nelem () - 1; - - // Check for NaNs at the beginning and end. - if (mode != ASCENDING && sort_isnan (*lo)) - { - mode = DESCENDING; - do - ++lo; - while (lo < hi && sort_isnan (*lo)); - } - else if (mode != DESCENDING && sort_isnan (*hi)) - { - mode = ASCENDING; - do - --hi; - while (lo < hi && sort_isnan (*hi)); - } - - octave_sort lsort; - - // If mode is still unknown, compare lo and hi - if (! mode) - { - if (lsort.descending_compare (*lo, *hi)) - mode = DESCENDING; - else if (lsort.ascending_compare (*lo, *hi)) - mode = ASCENDING; - else - mode = ASCENDING; - } - - lsort.set_compare (mode); - - if (! lsort.is_sorted (lo, hi - lo + 1)) - mode = UNSORTED; - - return mode; -} - -template typename Array::compare_fcn_type -sortrows_comparator (sortmode mode, const Array& /* a */, - bool /* allow_chk */) +safe_comparator (sortmode mode, const Array& /* a */, + bool /* allow_chk */) { if (mode == ASCENDING) return octave_sort::ascending_compare; @@ -2248,6 +2202,41 @@ } template +sortmode +Array::is_sorted (sortmode mode) const +{ + octave_sort lsort; + + octave_idx_type n = numel (); + + if (n <= 1) + return mode ? mode : ASCENDING; + + if (! mode) + { + // Auto-detect mode. + compare_fcn_type compare + = safe_comparator (ASCENDING, *this, false); + + if (compare (elem (n-1), elem (0))) + mode = DESCENDING; + else + mode = ASCENDING; + } + + if (mode) + { + lsort.set_compare (safe_comparator (mode, *this, false)); + + if (! lsort.is_sorted (data (), n)) + mode = UNSORTED; + } + + return mode; + +} + +template Array Array::sort_rows_idx (sortmode mode) const { @@ -2255,7 +2244,7 @@ octave_sort lsort; - lsort.set_compare (sortrows_comparator (mode, *this, true)); + lsort.set_compare (safe_comparator (mode, *this, true)); octave_idx_type r = rows (), c = cols (); @@ -2282,7 +2271,7 @@ { // Auto-detect mode. compare_fcn_type compare - = sortrows_comparator (ASCENDING, *this, false); + = safe_comparator (ASCENDING, *this, false); octave_idx_type i; for (i = 0; i < cols (); i++) @@ -2315,7 +2304,7 @@ if (mode) { - lsort.set_compare (sortrows_comparator (mode, *this, false)); + lsort.set_compare (safe_comparator (mode, *this, false)); if (! lsort.is_sorted_rows (data (), r, c)) mode = UNSORTED; @@ -2696,7 +2685,7 @@ { return UNSORTED; } \ \ Array::compare_fcn_type \ -sortrows_comparator (sortmode, const Array&, bool) \ +safe_comparator (sortmode, const Array&, bool) \ { return 0; } \ \ template <> Array \ diff -r a463aa0aa0ab -r 56fbe170d354 liboctave/ChangeLog --- a/liboctave/ChangeLog Fri Dec 04 15:33:51 2009 -0800 +++ b/liboctave/ChangeLog Fri Dec 04 14:02:15 2009 +0100 @@ -1,3 +1,12 @@ +2009-12-05 Jaroslav Hajek + + * Array.cc (sortrows_comparator): Rename to safe_comparator. + (Array::is_sorted): Use it here. + * Array-d.cc: Update. + * Array-f.cc: Update. + * Array-C.cc: Update. + * Array-fC.cc: Update. + 2009-12-03 John W. Eaton * Makefile.am (BUILT_NODISTFILES): New variable.