diff liboctave/chNDArray.cc @ 4915:c638c144d4da

[project @ 2004-07-23 19:01:22 by jwe]
author jwe
date Fri, 23 Jul 2004 19:01:23 +0000
parents d3bd9c04147f
children 954cc2ba6a49
line wrap: on
line diff
--- a/liboctave/chNDArray.cc	Fri Jul 23 16:55:13 2004 +0000
+++ b/liboctave/chNDArray.cc	Fri Jul 23 19:01:23 2004 +0000
@@ -33,6 +33,7 @@
 #include "chNDArray.h"
 #include "mx-base.h"
 #include "lo-ieee.h"
+#include "lo-mappers.h"
 
 // XXX FIXME XXX -- this is not quite the right thing.
 
@@ -48,10 +49,97 @@
   MX_ND_ANY_ALL_REDUCTION (MX_ND_ANY_EVAL (elem (iter_idx) != ' '), false);
 }
 
-int
-charNDArray::cat (const charNDArray& ra_arg, int dim, int iidx, int move)
+charNDArray
+concat (const charNDArray& ra, const charNDArray& rb, const Array<int>& ra_idx)
+{
+  charNDArray retval (ra);
+  if (ra.numel () > 0)
+    retval.insert (rb, ra_idx);
+  return retval;
+}
+
+charNDArray
+concat (const charNDArray& ra, const NDArray& rb, const Array<int>& ra_idx)
 {
-  return ::cat_ra(*this, ra_arg, dim, iidx, move);  
+  charNDArray retval (ra);
+  charNDArray tmp (rb.dims ());
+  int nel = rb.numel ();
+
+  if (ra.numel () == 0)
+    return retval;
+
+  for (int i = 0; i < nel; i++)
+    {
+      double d = rb.elem (i);
+
+      if (xisnan (d))
+	{
+	  (*current_liboctave_error_handler)
+	    ("invalid conversion from NaN to character");
+	  return retval;
+	}
+      else
+	{
+	  int ival = NINT (d);
+
+	  if (ival < 0 || ival > UCHAR_MAX)
+	    // XXX FIXME XXX -- is there something
+	    // better we could do? Should we warn the user?
+	    ival = 0;
+
+	  tmp.elem (i) = static_cast<char>(ival);
+	}
+    }
+
+  retval.insert (tmp, ra_idx);
+  return retval;
+}
+
+charNDArray
+concat (const NDArray& ra, const charNDArray& rb, const Array<int>& ra_idx)
+{
+  charNDArray retval (ra.dims ());
+  int nel = ra.numel ();
+
+  for (int i = 0; i < nel; i++)
+    {
+      double d = ra.elem (i);
+
+      if (xisnan (d))
+	{
+	  (*current_liboctave_error_handler)
+	    ("invalid conversion from NaN to character");
+	  return retval;
+	}
+      else
+	{
+	  int ival = NINT (d);
+
+	  if (ival < 0 || ival > UCHAR_MAX)
+	    // XXX FIXME XXX -- is there something
+	    // better we could do? Should we warn the user?
+	    ival = 0;
+
+	  retval.elem (i) = static_cast<char>(ival);
+	}
+    }
+
+  retval.insert (rb, ra_idx);
+  return retval;
+}
+
+charNDArray&
+charNDArray::insert (const charNDArray& a, int r, int c)
+{
+  Array<char>::insert (a, r, c);
+  return *this;
+}
+
+charNDArray&
+charNDArray::insert (const charNDArray& a, const Array<int>& ra_idx)
+{
+  Array<char>::insert (a, ra_idx);
+  return *this;
 }
 
 charMatrix