diff liboctave/Sparse.cc @ 8752:06b9903a029b

fix & clean up complex & sparse sorting
author Jaroslav Hajek <highegg@gmail.com>
date Mon, 16 Feb 2009 10:15:43 +0100
parents 095ae5e0a831
children eb63fbe60fab
line wrap: on
line diff
--- a/liboctave/Sparse.cc
+++ b/liboctave/Sparse.cc
@@ -2074,33 +2074,21 @@
 // instantiations for Array<double and Sparse<double>, etc
 template <class T>
 bool 
-sparse_ascending_compare (T a, T b)
+sparse_ascending_compare (typename ref_param<T>::type a, 
+                          typename ref_param<T>::type b)
 {
   return (a < b);
 }
 
 template <class T>
 bool 
-sparse_descending_compare (T a, T b)
+sparse_descending_compare (typename ref_param<T>::type a, 
+                           typename ref_param<T>::type b)
 {
   return (a > b);
 }
 
 template <class T>
-bool 
-sparse_ascending_compare (vec_index<T> *a, vec_index<T> *b)
-{
-  return (a->vec < b->vec);
-}
-
-template <class T>
-bool 
-sparse_descending_compare (vec_index<T> *a, vec_index<T> *b)
-{
-  return (a->vec > b->vec);
-}
-
-template <class T>
 Sparse<T>
 Sparse<T>::sort (octave_idx_type dim, sortmode mode) const
 {
@@ -2122,9 +2110,9 @@
   octave_sort<T> lsort;
 
   if (mode == ASCENDING) 
-    lsort.set_compare (sparse_ascending_compare);
+    lsort.set_compare (sparse_ascending_compare<T>);
   else if (mode == DESCENDING)
-    lsort.set_compare (sparse_descending_compare);
+    lsort.set_compare (sparse_descending_compare<T>);
   else
     abort ();
 
@@ -2141,13 +2129,13 @@
       if (mode == ASCENDING) 
 	{
 	  for (i = 0; i < ns; i++)
-	    if (sparse_ascending_compare (static_cast<T> (0), v [i]))
+	    if (sparse_ascending_compare<T> (static_cast<T> (0), v [i]))
 	      break;
 	}
       else
 	{
 	  for (i = 0; i < ns; i++)
-	    if (sparse_descending_compare (static_cast<T> (0), v [i]))
+	    if (sparse_descending_compare<T> (static_cast<T> (0), v [i]))
 	      break;
 	}
       for (octave_idx_type k = 0; k < i; k++)
@@ -2188,12 +2176,12 @@
       nc = m.columns ();
     }
 
-  octave_sort<vec_index<T> *> indexed_sort;
+  octave_sort<T> indexed_sort;
 
   if (mode == ASCENDING) 
-    indexed_sort.set_compare (sparse_ascending_compare);
+    indexed_sort.set_compare (sparse_ascending_compare<T>);
   else if (mode == DESCENDING)
-    indexed_sort.set_compare (sparse_descending_compare);
+    indexed_sort.set_compare (sparse_descending_compare<T>);
   else
     abort ();
 
@@ -2201,13 +2189,8 @@
   octave_idx_type *mcidx = m.cidx ();
   octave_idx_type *mridx = m.ridx ();
 
-  OCTAVE_LOCAL_BUFFER (vec_index<T> *, vi, nr);
-  OCTAVE_LOCAL_BUFFER (vec_index<T>, vix, nr);
-
-  for (octave_idx_type i = 0; i < nr; i++)
-    vi[i] = &vix[i];
-
   sidx = Array<octave_idx_type> (dim_vector (nr, nc));
+  OCTAVE_LOCAL_BUFFER (octave_idx_type, vi, nr);
 
   for (octave_idx_type j = 0; j < nc; j++)
     {
@@ -2222,26 +2205,21 @@
       else
 	{
 	  for (octave_idx_type i = 0; i < ns; i++)
-	    {
-	      vi[i]->vec = v[i];
-	      vi[i]->indx = mridx[i];
-	    }
-
-	  indexed_sort.sort (vi, ns);
+            vi[i] = mridx[i];
+
+	  indexed_sort.sort (v, vi, ns);
 
 	  octave_idx_type i;
 	  if (mode == ASCENDING) 
 	    {
 	      for (i = 0; i < ns; i++)
-		if (sparse_ascending_compare (static_cast<T> (0), 
-					      vi [i] -> vec))
+		if (sparse_ascending_compare<T> (static_cast<T> (0), v[i]))
 		  break;
 	    }
 	  else
 	    {
 	      for (i = 0; i < ns; i++)
-		if (sparse_descending_compare (static_cast<T> (0), 
-					       vi [i] -> vec))
+		if (sparse_descending_compare<T> (static_cast<T> (0), v[i]))
 		  break;
 	    }
 
@@ -2257,15 +2235,13 @@
 
 	  for (octave_idx_type k = 0; k < i; k++)
 	    {
-	      v [k] = vi [k] -> vec;
-	      sidx (k + offset) = vi [k] -> indx;
+	      sidx (k + offset) = vi [k];
 	      mridx [k] = k;
 	    }
 
 	  for (octave_idx_type k = i; k < ns; k++)
 	    {
-	      v [k] = vi [k] -> vec;
-	      sidx (k - ns + nr + offset) = vi [k] -> indx;
+	      sidx (k - ns + nr + offset) = vi [k];
 	      mridx [k] = k - ns + nr; 
 	    }