diff python_to_octave.cc @ 81:2e8b52a5e1b1

support NumPy string arrays
author Jaroslav Hajek <highegg@gmail.com>
date Mon, 21 Sep 2009 11:03:02 +0200
parents d60165bfc849
children ff70627aa203
line wrap: on
line diff
--- a/python_to_octave.cc	Fri Sep 18 13:15:34 2009 +0200
+++ b/python_to_octave.cc	Mon Sep 21 11:03:02 2009 +0200
@@ -187,6 +187,7 @@
 
 #ifdef HAVE_NUMPY
          ARRAYCASE(PyArray_BOOL, bool)
+         ARRAYCASE(PyArray_STRING, char)
 #endif
 
          ARRAYCASE(PyArray_OBJECT, PyObject *)
@@ -209,7 +210,7 @@
    }
 
    static void pyarr_to_octvalue(octave_value &octvalue,
-                                 const PyArrayObject *pyarr) {
+                                 PyArrayObject *pyarr) {
       dim_vector dims;
       switch (pyarr->nd) {
          case 0:
@@ -278,6 +279,7 @@
             pyarrobj_to_octvalueNd<ComplexNDArray>(octvalue, pyarr, dims);
             break;
          case PyArray_CHAR:
+         case_PyArray_CHAR:
             pyarrobj_to_octvalueNd<charNDArray>(octvalue, pyarr, dims);
             // FIXME: is the following needed?
             octvalue = octvalue.convert_to_str(true, true, '"');
@@ -286,6 +288,22 @@
          case PyArray_BOOL:
             pyarrobj_to_octvalueNd<boolNDArray>(octvalue, pyarr, dims);
             break;
+         case PyArray_STRING:
+            {
+               if (pyarr->descr->elsize == 1)
+                  goto case_PyArray_CHAR;
+               else {
+                  // Create a new descriptor of the data.
+                  PyArray_Descr *view_descr = PyArray_DescrFromType(PyArray_CHAR);
+                  // Create a new view of the NumPy array.
+                  PyArrayObject *view = (PyArrayObject *)PyArray_View (pyarr, view_descr, NULL);
+                  // Store in a handle to ensure proper destruction.
+                  handle<PyObject> view_handle (allow_null ((PyObject *)view));
+                  // Call recursively.
+                  pyarr_to_octvalue (octvalue, view);
+               }
+            }
+            break;
 #endif
          case PyArray_OBJECT:
             pyarrobj_to_octvalueNd<Cell>(octvalue, pyarr, dims);