diff src/mex.cc @ 6332:debb662eab07

[project @ 2007-02-20 20:41:35 by jwe]
author jwe
date Tue, 20 Feb 2007 20:41:35 +0000
parents 6fab59e81b4e
children ec88b4ab6d10
line wrap: on
line diff
--- a/src/mex.cc	Tue Feb 20 08:00:34 2007 +0000
+++ b/src/mex.cc	Tue Feb 20 20:41:35 2007 +0000
@@ -182,6 +182,8 @@
 
   void set_cell (int idx, mxArray *val) = 0;
 
+  double get_scalar (void) const = 0;
+
   void *get_data (void) const = 0;
 
   void *get_imag_data (void) const = 0;
@@ -337,8 +339,7 @@
   {
     if (! dims)
       {
-	// Force ndims to be cached.
-	get_number_of_dimensions ();
+	ndims = val.ndims ();
 
 	dims = static_cast<int *> (malloc (ndims * sizeof (int)));
 
@@ -353,8 +354,8 @@
 
   int get_number_of_dimensions (void) const
   {
-    if (ndims < 0)
-      ndims = val.ndims ();
+    // Force dims and ndims to be cached.
+    get_dimensions ();
 
     return ndims;
   }
@@ -442,6 +443,8 @@
   // Not allowed.
   void set_cell (int /*idx*/, mxArray */*val*/) { panic_impossible (); }
 
+  double get_scalar (void) const { return val.scalar_value (true); }
+
   void *get_data (void) const
   {
     void *retval = 0;
@@ -871,6 +874,12 @@
     invalid_type_error ();
   }
 
+  double get_scalar (void) const
+  {
+    invalid_type_error ();
+    return 0;
+  }
+
   void *get_data (void) const
   {
     invalid_type_error ();
@@ -1141,6 +1150,67 @@
 
   int is_complex (void) const { return pi != 0; }
 
+  double get_scalar (void) const
+  {
+    double retval = 0;
+
+    switch (get_class_id ())
+      {
+      case mxLOGICAL_CLASS:
+	retval = *(static_cast<bool *> (pr));
+	break;
+
+      case mxCHAR_CLASS:
+	retval = *(static_cast<mxChar *> (pr));
+	break;
+
+      case mxSINGLE_CLASS:
+	retval = *(static_cast<float *> (pr));
+	break;
+
+      case mxDOUBLE_CLASS:
+	retval = *(static_cast<double *> (pr));
+	break;
+
+      case mxINT8_CLASS:
+	retval = *(static_cast<int8_t *> (pr));
+	break;
+
+      case mxUINT8_CLASS:
+	retval = *(static_cast<uint8_t *> (pr));
+	break;
+
+      case mxINT16_CLASS:
+	retval = *(static_cast<int16_t *> (pr));
+	break;
+
+      case mxUINT16_CLASS:
+	retval = *(static_cast<uint16_t *> (pr));
+	break;
+
+      case mxINT32_CLASS:
+	retval = *(static_cast<int32_t *> (pr));
+	break;
+
+      case mxUINT32_CLASS:
+	retval = *(static_cast<uint32_t *> (pr));
+	break;
+
+      case mxINT64_CLASS:
+	retval = *(static_cast<int64_t *> (pr));
+	break;
+
+      case mxUINT64_CLASS:
+	retval = *(static_cast<uint64_t *> (pr));
+	break;
+
+      default:
+	panic_impossible ();
+      }
+
+    return retval;
+  }
+
   void *get_data (void) const { return pr; }
 
   void *get_imag_data (void) const { return pi; }
@@ -2665,8 +2735,7 @@
 double
 mxGetScalar (const mxArray *ptr)
 {
-  double *d = mxGetPr (ptr);
-  return d[0];
+  return ptr->get_scalar ();
 }
 
 mxChar *