changeset 5120:eb900c53cdb7

[project @ 2005-01-26 22:08:37 by jwe]
author jwe
date Wed, 26 Jan 2005 22:08:37 +0000
parents f394f83ee1c4
children dae2829643c7
files liboctave/Array.cc liboctave/ChangeLog
diffstat 2 files changed, 57 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/Array.cc	Tue Jan 25 22:34:05 2005 +0000
+++ b/liboctave/Array.cc	Wed Jan 26 22:08:37 2005 +0000
@@ -1041,6 +1041,7 @@
       dim_vector dva = a.dims ();
       dim_vector dv = dims ();
       int len_a = dva.length ();
+      int non_full_dim = 0;
 
       for (int i = 0; i < n; i++)
 	{
@@ -1051,37 +1052,65 @@
 		("Array<T>::insert: range error for insert");
 	      return *this;
 	    }
+
+	  if (dv(i) != (i < len_a ? dva(i) : 1))
+	    non_full_dim++;
 	}
 
       if (dva.numel ())
         {
-	  const T *a_data = a.data ();   
-	  int numel_to_move = 1;
-	  int skip = 0;
-	  for (int i = 0; i < len_a; i++) 
-	    if (ra_idx(i) == 0 && dva(i) == dv(i))
-	      numel_to_move *= dva(i);
-	    else
-	      {
-		skip = numel_to_move * (dv(i) - dva(i));
-		numel_to_move *= dva(i);
-		break;
-	      }
-
-	  int jidx = ra_idx (n - 1);
-	  for (int i = n-2; i >= 0; i--)
+	  if (non_full_dim < 2)
 	    {
-	      jidx *= dv (i);
-	      jidx += ra_idx (i);
+	      // Special case for fast concatenation
+	      const T *a_data = a.data ();
+	      int numel_to_move = 1;
+	      int skip = 0;
+	      for (int i = 0; i < len_a; i++)
+		if (ra_idx(i) == 0 && dva(i) == dv(i))
+		  numel_to_move *= dva(i);
+		else
+		  {
+		    skip = numel_to_move * (dv(i) - dva(i));
+		    numel_to_move *= dva(i);
+		    break;
+		  }
+
+	      int jidx = ra_idx(n-1);
+	      for (int i = n-2; i >= 0; i--)
+		{
+		  jidx *= dv(i);
+		  jidx += ra_idx(i);
+		}
+
+	      int iidx = 0;
+	      int moves = dva.numel () / numel_to_move;
+	      for (int i = 0; i < moves; i++)
+		{
+		  for (int j = 0; j < numel_to_move; j++)
+		    elem (jidx++) = a_data[iidx++];
+		  jidx += skip;
+		}
 	    }
-
-	  int iidx = 0;
-	  int moves = dva.numel () / numel_to_move;
-	  for (int i = 0; i < moves; i++)
+	  else
 	    {
-	      for (int j = 0; j < numel_to_move; j++)
-		elem (jidx++) = a_data[iidx++];
-	      jidx += skip;
+	      // Generic code
+	      const T *a_data = a.data ();
+	      int nel = a.numel ();
+	      Array<int> a_idx (n, 0);
+
+	      for (int i = 0; i < nel; i++)
+		{
+		  int iidx = a_idx(n-1) + ra_idx(n-1);
+		  for (int j = n-2; j >= 0; j--)
+		    {
+		      iidx *= dv(j);
+		      iidx += a_idx(j) + ra_idx(j);
+		    }
+
+		  elem (iidx) = a_data[i];
+
+		  increment_index (a_idx, dva);
+		}
 	    }
 	}
     }
--- a/liboctave/ChangeLog	Tue Jan 25 22:34:05 2005 +0000
+++ b/liboctave/ChangeLog	Wed Jan 26 22:08:37 2005 +0000
@@ -1,3 +1,7 @@
+2005-01-26  David Bateman <dbateman@free.fr>
+
+	* Array.cc (Array<T>::insert): Add special case for fast concatenation.
+
 2005-01-18  John W. Eaton  <jwe@octave.org>
 
 	* mx-inlines.cc (MX_ND_REDUCTION): Delete RET_ELT_TYPE arg.