Mercurial > pytave
annotate python_to_octave.cc @ 139:b12908ffa6df
maint: Use Octave style for file copyright block, delete editor footer
* arrayobjectdefs.h, exceptions.{cc,h}, octave_to_python.{cc,h}, py.cc,
pytave.cc, python_to_octave.{cc,h}, package/__init__.py, package/pytave.py:
Use consistent Octave style for file copyright block. Delete editor footer.
* ChangeLog, test/test.py: Delete editor footer.
author | Mike Miller <mtmiller@octave.org> |
---|---|
date | Mon, 04 Apr 2016 17:16:58 -0700 |
parents | 386772f4e12d |
children | dc2876fdbfaf |
rev | line source |
---|---|
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
1 /* |
139
b12908ffa6df
maint: Use Octave style for file copyright block, delete editor footer
Mike Miller <mtmiller@octave.org>
parents:
132
diff
changeset
|
2 |
b12908ffa6df
maint: Use Octave style for file copyright block, delete editor footer
Mike Miller <mtmiller@octave.org>
parents:
132
diff
changeset
|
3 Copyright (C) 2008 David Grundberg, HÃ¥kan Fors Nilsson |
b12908ffa6df
maint: Use Octave style for file copyright block, delete editor footer
Mike Miller <mtmiller@octave.org>
parents:
132
diff
changeset
|
4 Copyright (C) 2009 VZLU Prague |
b12908ffa6df
maint: Use Octave style for file copyright block, delete editor footer
Mike Miller <mtmiller@octave.org>
parents:
132
diff
changeset
|
5 |
b12908ffa6df
maint: Use Octave style for file copyright block, delete editor footer
Mike Miller <mtmiller@octave.org>
parents:
132
diff
changeset
|
6 This file is part of Pytave. |
b12908ffa6df
maint: Use Octave style for file copyright block, delete editor footer
Mike Miller <mtmiller@octave.org>
parents:
132
diff
changeset
|
7 |
b12908ffa6df
maint: Use Octave style for file copyright block, delete editor footer
Mike Miller <mtmiller@octave.org>
parents:
132
diff
changeset
|
8 Pytave is free software: you can redistribute it and/or modify it |
b12908ffa6df
maint: Use Octave style for file copyright block, delete editor footer
Mike Miller <mtmiller@octave.org>
parents:
132
diff
changeset
|
9 under the terms of the GNU General Public License as published by the |
b12908ffa6df
maint: Use Octave style for file copyright block, delete editor footer
Mike Miller <mtmiller@octave.org>
parents:
132
diff
changeset
|
10 Free Software Foundation, either version 3 of the License, or (at your |
b12908ffa6df
maint: Use Octave style for file copyright block, delete editor footer
Mike Miller <mtmiller@octave.org>
parents:
132
diff
changeset
|
11 option) any later version. |
b12908ffa6df
maint: Use Octave style for file copyright block, delete editor footer
Mike Miller <mtmiller@octave.org>
parents:
132
diff
changeset
|
12 |
b12908ffa6df
maint: Use Octave style for file copyright block, delete editor footer
Mike Miller <mtmiller@octave.org>
parents:
132
diff
changeset
|
13 Pytave is distributed in the hope that it will be useful, but WITHOUT |
b12908ffa6df
maint: Use Octave style for file copyright block, delete editor footer
Mike Miller <mtmiller@octave.org>
parents:
132
diff
changeset
|
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
b12908ffa6df
maint: Use Octave style for file copyright block, delete editor footer
Mike Miller <mtmiller@octave.org>
parents:
132
diff
changeset
|
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
b12908ffa6df
maint: Use Octave style for file copyright block, delete editor footer
Mike Miller <mtmiller@octave.org>
parents:
132
diff
changeset
|
16 for more details. |
b12908ffa6df
maint: Use Octave style for file copyright block, delete editor footer
Mike Miller <mtmiller@octave.org>
parents:
132
diff
changeset
|
17 |
b12908ffa6df
maint: Use Octave style for file copyright block, delete editor footer
Mike Miller <mtmiller@octave.org>
parents:
132
diff
changeset
|
18 You should have received a copy of the GNU General Public License |
b12908ffa6df
maint: Use Octave style for file copyright block, delete editor footer
Mike Miller <mtmiller@octave.org>
parents:
132
diff
changeset
|
19 along with Pytave; see the file COPYING. If not, see |
b12908ffa6df
maint: Use Octave style for file copyright block, delete editor footer
Mike Miller <mtmiller@octave.org>
parents:
132
diff
changeset
|
20 <http://www.gnu.org/licenses/>. |
b12908ffa6df
maint: Use Octave style for file copyright block, delete editor footer
Mike Miller <mtmiller@octave.org>
parents:
132
diff
changeset
|
21 |
b12908ffa6df
maint: Use Octave style for file copyright block, delete editor footer
Mike Miller <mtmiller@octave.org>
parents:
132
diff
changeset
|
22 */ |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
23 |
132
386772f4e12d
Clean up includes thanks to Octave header changes
Mike Miller <mtmiller@octave.org>
parents:
108
diff
changeset
|
24 #if defined (HAVE_CONFIG_H) |
386772f4e12d
Clean up includes thanks to Octave header changes
Mike Miller <mtmiller@octave.org>
parents:
108
diff
changeset
|
25 # include <config.h> |
386772f4e12d
Clean up includes thanks to Octave header changes
Mike Miller <mtmiller@octave.org>
parents:
108
diff
changeset
|
26 #endif |
386772f4e12d
Clean up includes thanks to Octave header changes
Mike Miller <mtmiller@octave.org>
parents:
108
diff
changeset
|
27 |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
28 #include <iostream> |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
29 #include <boost/python.hpp> |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
30 #include <boost/python/numeric.hpp> |
46 | 31 #include <boost/type_traits/integral_constant.hpp> |
100
ff70627aa203
Undef HAVE_STAT and HAVE_FSTAT consistently through-out all files
David Grundberg <individ@acc.umu.se>
parents:
81
diff
changeset
|
32 |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
33 #include <octave/oct.h> |
9 | 34 #include <octave/oct-map.h> |
35 #include <octave/Cell.h> | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
36 #include <octave/ov.h> |
106
896fdc369789
Use latest Octave library API
Mike Miller <mtmiller@octave.org>
parents:
102
diff
changeset
|
37 #include <octave/Array.h> |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
38 |
75
b0991511a16d
a few fixes to numpy support
Jaroslav Hajek <highegg@gmail.com>
parents:
70
diff
changeset
|
39 #include "arrayobjectdefs.h" |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
40 #include "exceptions.h" |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
41 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
42 using namespace boost::python; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
43 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
44 namespace pytave { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
45 |
9 | 46 void pyobj_to_octvalue(octave_value &oct_value, |
47 const boost::python::object &py_object); | |
48 | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
49 template <class PythonPrimitive, class OctaveBase> |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
50 static void copy_pyarrobj_to_octarray(OctaveBase &matrix, |
108 | 51 PyArrayObject* pyarr, |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
52 const int unsigned matindex, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
53 const unsigned int matstride, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
54 const int dimension, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
55 const unsigned int offset) { |
108 | 56 unsigned char *ptr = (unsigned char*) PyArray_DATA (pyarr); |
57 if (dimension == PyArray_NDIM (pyarr) - 1) { | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
58 // Last dimension, base case |
108 | 59 for (int i = 0; i < PyArray_DIM (pyarr, dimension); i++) { |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
60 matrix.elem(matindex + i*matstride) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
61 = *(PythonPrimitive*) |
108 | 62 &ptr[offset + i*PyArray_STRIDE (pyarr, dimension)]; |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
63 } |
108 | 64 } else if (PyArray_NDIM (pyarr) == 0) { |
79
d60165bfc849
Support 0D Numeric arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
75
diff
changeset
|
65 matrix.elem(0) = *(PythonPrimitive*) ptr; |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
66 } else { |
108 | 67 for (int i = 0; i < PyArray_DIM (pyarr, dimension); i++) { |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
68 copy_pyarrobj_to_octarray<PythonPrimitive, OctaveBase>( |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
69 matrix, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
70 pyarr, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
71 matindex + i*matstride, |
108 | 72 matstride * PyArray_DIM (pyarr, dimension), |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
73 dimension + 1, |
108 | 74 offset + i*PyArray_STRIDE (pyarr, dimension)); |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
75 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
76 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
77 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
78 |
51
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
79 template <> |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
80 void copy_pyarrobj_to_octarray<PyObject *, Cell>(Cell &matrix, |
108 | 81 PyArrayObject* pyarr, |
51
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
82 const int unsigned matindex, |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
83 const unsigned int matstride, |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
84 const int dimension, |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
85 const unsigned int offset) { |
108 | 86 unsigned char *ptr = (unsigned char*) PyArray_DATA (pyarr); |
87 if (dimension == PyArray_NDIM (pyarr) - 1) { | |
51
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
88 // Last dimension, base case |
108 | 89 for (int i = 0; i < PyArray_DIM (pyarr, dimension); i++) { |
51
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
90 PyObject *pobj = *(PyObject **) |
108 | 91 &ptr[offset + i*PyArray_STRIDE (pyarr, dimension)]; |
107
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
92 pyobj_to_octvalue (matrix.elem(matindex + i*matstride), |
51
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
93 object(handle<PyObject> (borrowed (pobj)))); |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
94 } |
108 | 95 } else if (PyArray_NDIM (pyarr) == 0) { |
79
d60165bfc849
Support 0D Numeric arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
75
diff
changeset
|
96 PyObject *pobj = *(PyObject **) ptr; |
107
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
97 pyobj_to_octvalue (matrix.elem(0), |
79
d60165bfc849
Support 0D Numeric arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
75
diff
changeset
|
98 object(handle<PyObject> (borrowed (pobj)))); |
51
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
99 } else { |
108 | 100 for (int i = 0; i < PyArray_DIM (pyarr, dimension); i++) { |
51
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
101 copy_pyarrobj_to_octarray<PyObject *, Cell>( |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
102 matrix, |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
103 pyarr, |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
104 matindex + i*matstride, |
108 | 105 matstride * PyArray_DIM (pyarr, dimension), |
51
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
106 dimension + 1, |
108 | 107 offset + i*PyArray_STRIDE (pyarr, dimension)); |
51
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
108 } |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
109 } |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
110 } |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
111 |
46 | 112 template <class PythonPrimitive, class OctaveBase> |
113 static void copy_pyarrobj_to_octarray_dispatch(OctaveBase &matrix, | |
108 | 114 PyArrayObject* pyarr, |
46 | 115 const boost::true_type&) { |
116 copy_pyarrobj_to_octarray<PythonPrimitive, OctaveBase> | |
117 (matrix, pyarr, 0, 1, 0, 0); | |
118 } | |
119 | |
120 template <class PythonPrimitive, class OctaveBase> | |
121 static void copy_pyarrobj_to_octarray_dispatch(OctaveBase &matrix, | |
108 | 122 PyArrayObject* pyarr, |
46 | 123 const boost::false_type&) { |
124 assert(0); | |
125 } | |
126 | |
127 template <class X, class Y> class matching_type : public boost::false_type { }; | |
128 template <class X> class matching_type<X, X> : public boost::true_type { }; | |
129 template <class X> class matching_type<X, octave_int<X> > : public boost::true_type { }; | |
130 template <> class matching_type<float, double> : public boost::true_type { }; | |
131 template <> class matching_type<FloatComplex, Complex> : public boost::true_type { }; | |
51
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
132 template <> class matching_type<PyObject *, octave_value> : public boost::true_type { }; |
46 | 133 |
134 template <class PythonPrimitive, class OctaveBase> | |
135 static void copy_pyarrobj_to_octarray_dispatch(OctaveBase &matrix, | |
108 | 136 PyArrayObject* pyarr) { |
46 | 137 matching_type<PythonPrimitive, typename OctaveBase::element_type> inst; |
138 copy_pyarrobj_to_octarray_dispatch<PythonPrimitive, OctaveBase> (matrix, pyarr, inst); | |
139 } | |
140 | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
141 template <class OctaveBase> |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
142 static void copy_pyarrobj_to_octarray_boot(OctaveBase &matrix, |
108 | 143 PyArrayObject* pyarr) { |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
144 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
145 #define ARRAYCASE(AC_pyarrtype, AC_primitive) case AC_pyarrtype: \ |
46 | 146 copy_pyarrobj_to_octarray_dispatch<AC_primitive, OctaveBase>\ |
147 (matrix, pyarr); \ | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
148 break; \ |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
149 |
47
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
150 // Prefer int to other types of the same size. |
50 | 151 // E.g. on 32-bit x86 architectures: sizeof(long) == sizeof(int). |
108 | 152 int type_num = PyArray_TYPE (pyarr); |
47
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
153 switch (type_num) { |
108 | 154 case NPY_LONG: |
47
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
155 if (sizeof(long) == sizeof(int)) { |
108 | 156 type_num = NPY_INT; |
47
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
157 } |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
158 break; |
108 | 159 case NPY_SHORT: |
47
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
160 if (sizeof(short) == sizeof(int)) { |
108 | 161 type_num = NPY_INT; |
47
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
162 } |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
163 break; |
108 | 164 case NPY_USHORT: |
47
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
165 if (sizeof(unsigned short) == sizeof(unsigned int)) { |
108 | 166 type_num = NPY_UINT; |
47
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
167 } |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
168 break; |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
169 } |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
170 |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
171 switch (type_num) { |
108 | 172 ARRAYCASE(NPY_CHAR, char) |
173 ARRAYCASE(NPY_BYTE, signed char) | |
174 ARRAYCASE(NPY_UBYTE, unsigned char) | |
175 ARRAYCASE(NPY_SHORT, signed short) | |
176 ARRAYCASE(NPY_USHORT, unsigned short) | |
177 ARRAYCASE(NPY_INT, signed int) | |
178 ARRAYCASE(NPY_UINT, unsigned int) | |
179 ARRAYCASE(NPY_LONG, signed long) | |
180 ARRAYCASE(NPY_LONGLONG, signed long long) | |
181 ARRAYCASE(NPY_FLOAT, float) | |
182 ARRAYCASE(NPY_DOUBLE, double) | |
183 ARRAYCASE(NPY_CFLOAT, FloatComplex) | |
184 ARRAYCASE(NPY_CDOUBLE, Complex) | |
185 ARRAYCASE(NPY_BOOL, bool) | |
186 ARRAYCASE(NPY_STRING, char) | |
187 ARRAYCASE(NPY_OBJECT, PyObject *) | |
51
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
188 |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
189 default: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
190 throw object_convert_exception( |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
191 PyEval_GetFuncName((PyObject*)pyarr) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
192 + (PyEval_GetFuncDesc((PyObject*)pyarr) |
107
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
193 + std::string(": Unsupported Python array type"))); |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
194 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
195 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
196 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
197 template <class OctaveBase> |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
198 static void pyarrobj_to_octvalueNd(octave_value &octvalue, |
108 | 199 PyArrayObject* pyarr, |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
200 dim_vector dims) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
201 OctaveBase array(dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
202 copy_pyarrobj_to_octarray_boot<OctaveBase>(array, pyarr); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
203 octvalue = array; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
204 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
205 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
206 static void pyarr_to_octvalue(octave_value &octvalue, |
81
2e8b52a5e1b1
support NumPy string arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
79
diff
changeset
|
207 PyArrayObject *pyarr) { |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
208 dim_vector dims; |
108 | 209 switch (PyArray_NDIM (pyarr)) { |
79
d60165bfc849
Support 0D Numeric arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
75
diff
changeset
|
210 case 0: |
d60165bfc849
Support 0D Numeric arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
75
diff
changeset
|
211 dims = dim_vector (1, 1); |
d60165bfc849
Support 0D Numeric arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
75
diff
changeset
|
212 break; |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
213 case 1: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
214 // Always make PyArray vectors row vectors. |
108 | 215 dims = dim_vector(1, PyArray_DIM (pyarr, 0)); |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
216 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
217 default: |
108 | 218 dims.resize(PyArray_NDIM (pyarr)); |
219 for (int d = 0; d < PyArray_NDIM (pyarr); d++) { | |
220 dims(d) = PyArray_DIM (pyarr, d); | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
221 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
222 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
223 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
224 |
108 | 225 switch (PyArray_TYPE (pyarr)) { |
226 case NPY_UBYTE: | |
227 case NPY_USHORT: | |
228 case NPY_UINT: | |
229 switch (PyArray_ITEMSIZE (pyarr)) { | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
230 case 1: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
231 pyarrobj_to_octvalueNd<uint8NDArray>(octvalue, pyarr, dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
232 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
233 case 2: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
234 pyarrobj_to_octvalueNd<uint16NDArray>(octvalue, pyarr, dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
235 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
236 case 4: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
237 pyarrobj_to_octvalueNd<uint32NDArray>(octvalue, pyarr, dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
238 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
239 default: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
240 throw object_convert_exception("Unknown unsigned integer."); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
241 } |
108 | 242 case NPY_BYTE: |
243 case NPY_SHORT: | |
244 case NPY_INT: | |
245 case NPY_LONG: | |
246 case NPY_LONGLONG: | |
247 switch (PyArray_ITEMSIZE (pyarr)) { | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
248 case 1: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
249 pyarrobj_to_octvalueNd<int8NDArray>(octvalue, pyarr, dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
250 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
251 case 2: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
252 pyarrobj_to_octvalueNd<int16NDArray>(octvalue, pyarr, dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
253 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
254 case 4: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
255 pyarrobj_to_octvalueNd<int32NDArray>(octvalue, pyarr, dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
256 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
257 case 8: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
258 pyarrobj_to_octvalueNd<int64NDArray>(octvalue, pyarr, dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
259 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
260 default: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
261 throw object_convert_exception("Unknown integer."); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
262 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
263 break; |
108 | 264 case NPY_FLOAT: |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
265 pyarrobj_to_octvalueNd<FloatNDArray>(octvalue, pyarr, dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
266 break; |
108 | 267 case NPY_DOUBLE: |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
268 pyarrobj_to_octvalueNd<NDArray>(octvalue, pyarr, dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
269 break; |
108 | 270 case NPY_CFLOAT: |
46 | 271 pyarrobj_to_octvalueNd<FloatComplexNDArray>(octvalue, pyarr, dims); |
272 break; | |
108 | 273 case NPY_CDOUBLE: |
46 | 274 pyarrobj_to_octvalueNd<ComplexNDArray>(octvalue, pyarr, dims); |
275 break; | |
108 | 276 case NPY_CHAR: |
277 case_NPY_CHAR: | |
51
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
278 pyarrobj_to_octvalueNd<charNDArray>(octvalue, pyarr, dims); |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
279 // FIXME: is the following needed? |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
280 octvalue = octvalue.convert_to_str(true, true, '"'); |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
281 break; |
108 | 282 case NPY_BOOL: |
70
e3de0f6f1552
experimental NumPy support
Jaroslav Hajek <highegg@gmail.com>
parents:
68
diff
changeset
|
283 pyarrobj_to_octvalueNd<boolNDArray>(octvalue, pyarr, dims); |
e3de0f6f1552
experimental NumPy support
Jaroslav Hajek <highegg@gmail.com>
parents:
68
diff
changeset
|
284 break; |
108 | 285 case NPY_STRING: |
81
2e8b52a5e1b1
support NumPy string arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
79
diff
changeset
|
286 { |
108 | 287 if (PyArray_ITEMSIZE (pyarr) == 1) |
288 goto case_NPY_CHAR; | |
81
2e8b52a5e1b1
support NumPy string arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
79
diff
changeset
|
289 else { |
2e8b52a5e1b1
support NumPy string arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
79
diff
changeset
|
290 // Create a new descriptor of the data. |
108 | 291 PyArray_Descr *view_descr = PyArray_DescrFromType(NPY_CHAR); |
81
2e8b52a5e1b1
support NumPy string arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
79
diff
changeset
|
292 // Create a new view of the NumPy array. |
2e8b52a5e1b1
support NumPy string arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
79
diff
changeset
|
293 PyArrayObject *view = (PyArrayObject *)PyArray_View (pyarr, view_descr, NULL); |
2e8b52a5e1b1
support NumPy string arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
79
diff
changeset
|
294 // Store in a handle to ensure proper destruction. |
2e8b52a5e1b1
support NumPy string arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
79
diff
changeset
|
295 handle<PyObject> view_handle (allow_null ((PyObject *)view)); |
2e8b52a5e1b1
support NumPy string arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
79
diff
changeset
|
296 // Call recursively. |
2e8b52a5e1b1
support NumPy string arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
79
diff
changeset
|
297 pyarr_to_octvalue (octvalue, view); |
2e8b52a5e1b1
support NumPy string arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
79
diff
changeset
|
298 } |
2e8b52a5e1b1
support NumPy string arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
79
diff
changeset
|
299 } |
2e8b52a5e1b1
support NumPy string arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
79
diff
changeset
|
300 break; |
108 | 301 case NPY_OBJECT: |
51
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
302 pyarrobj_to_octvalueNd<Cell>(octvalue, pyarr, dims); |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
303 break; |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
304 default: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
305 throw object_convert_exception( |
107
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
306 PyEval_GetFuncDesc((PyObject*)(pyarr)) + std::string(" ") |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
307 + PyEval_GetFuncName((PyObject*)(pyarr)) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
308 + ": Encountered unsupported Python array"); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
309 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
310 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
311 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
312 |
25 | 313 static void pylist_to_cellarray(octave_value &oct_value, |
314 const boost::python::list &list) { | |
315 | |
31
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
316 octave_idx_type length = boost::python::extract<octave_idx_type>( |
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
317 list.attr("__len__")()); |
9 | 318 octave_value_list values; |
319 | |
320 for(octave_idx_type i = 0; i < length; i++) { | |
25 | 321 octave_value val; |
9 | 322 |
323 pyobj_to_octvalue(val, list[i]); | |
324 values.append(val); | |
325 | |
326 } | |
25 | 327 |
9 | 328 oct_value = Cell(values); |
329 } | |
330 | |
25 | 331 static void pydict_to_octmap(octave_value &oct_value, |
332 const boost::python::dict &dict) { | |
9 | 333 |
334 boost::python::list list = dict.items(); | |
31
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
335 octave_idx_type length = boost::python::extract<octave_idx_type>( |
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
336 list.attr("__len__")()); |
9 | 337 |
338 dim_vector dims = dim_vector(1, 1); | |
339 | |
106
896fdc369789
Use latest Octave library API
Mike Miller <mtmiller@octave.org>
parents:
102
diff
changeset
|
340 octave_value_list vals (length); |
896fdc369789
Use latest Octave library API
Mike Miller <mtmiller@octave.org>
parents:
102
diff
changeset
|
341 string_vector keys (length); |
43
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
342 |
56
43a413b7c151
improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
51
diff
changeset
|
343 // Extract all keys and convert values. Remember whether dimensions |
43a413b7c151
improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
51
diff
changeset
|
344 // match. |
107
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
345 |
9 | 346 for(octave_idx_type i = 0; i < length; i++) { |
43
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
347 |
106
896fdc369789
Use latest Octave library API
Mike Miller <mtmiller@octave.org>
parents:
102
diff
changeset
|
348 std::string& key = keys[i]; |
9 | 349 |
350 boost::python::tuple tuple = | |
351 boost::python::extract<boost::python::tuple>(list[i])(); | |
352 | |
43
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
353 boost::python::extract<std::string> str(tuple[0]); |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
354 if(!str.check()) { |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
355 throw object_convert_exception( |
107
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
356 std::string("Can not convert key of type ") |
43
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
357 + PyEval_GetFuncName(boost::python::object(tuple[0]).ptr()) |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
358 + PyEval_GetFuncDesc(boost::python::object(tuple[0]).ptr()) |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
359 + " to a structure field name. Field names must be strings."); |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
360 } |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
361 |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
362 key = str(); |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
363 |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
364 if (!valid_identifier(key)) { |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
365 throw object_convert_exception( |
107
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
366 std::string("Can not convert key `") + key + "' to a structure " |
43
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
367 "field name. Field names must be valid Octave identifiers."); |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
368 } |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
369 |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
370 octave_value& val = vals(i); |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
371 |
9 | 372 pyobj_to_octvalue(val, tuple[1]); |
373 | |
68
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
374 if(val.is_cell()) { |
56
43a413b7c151
improve conversions, handle POobject and char arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
51
diff
changeset
|
375 if(i == 0) { |
68
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
376 dims = val.dims(); |
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
377 } else if (val.numel() != 1 && val.dims() != dims){ |
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
378 throw object_convert_exception( |
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
379 "Dimensions of the struct fields do not match"); |
9 | 380 } |
381 } | |
382 } | |
383 | |
106
896fdc369789
Use latest Octave library API
Mike Miller <mtmiller@octave.org>
parents:
102
diff
changeset
|
384 octave_map map = octave_map(dims); |
9 | 385 |
386 for(octave_idx_type i = 0; i < length; i++) { | |
387 | |
106
896fdc369789
Use latest Octave library API
Mike Miller <mtmiller@octave.org>
parents:
102
diff
changeset
|
388 std::string& key = keys[i]; |
43
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
389 octave_value val = vals(i); |
9 | 390 |
68
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
391 if(val.is_cell()) { |
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
392 const Cell c = val.cell_value(); |
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
393 if (c.numel () == 1) { |
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
394 map.assign(key, Cell(dims, c(0))); |
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
395 } else { |
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
396 map.assign(key, c); |
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
397 } |
31
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
398 } else { |
68
2f4d6286fb36
make Octave->Python conversions uniformly arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
56
diff
changeset
|
399 map.assign(key, Cell(dims, val)); |
9 | 400 } |
401 } | |
402 oct_value = map; | |
403 } | |
404 | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
405 void pyobj_to_octvalue(octave_value &oct_value, |
25 | 406 const boost::python::object &py_object) { |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
407 extract<int> intx(py_object); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
408 extract<double> doublex(py_object); |
46 | 409 extract<Complex> complexx(py_object); |
107
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
410 extract<std::string> stringx(py_object); |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
411 extract<numeric::array> arrayx(py_object); |
9 | 412 extract<boost::python::list> listx(py_object); |
413 extract<boost::python::dict> dictx(py_object); | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
414 if (intx.check()) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
415 oct_value = intx(); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
416 } else if (doublex.check()) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
417 oct_value = doublex(); |
46 | 418 } else if (complexx.check()) { |
419 oct_value = complexx(); | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
420 } else if (arrayx.check()) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
421 pyarr_to_octvalue(oct_value, (PyArrayObject*)py_object.ptr()); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
422 } else if (stringx.check()) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
423 oct_value = stringx(); |
9 | 424 } else if (listx.check()) { |
425 pylist_to_cellarray(oct_value, (boost::python::list&)py_object); | |
426 } else if (dictx.check()) { | |
427 pydict_to_octmap(oct_value, (boost::python::dict&)py_object); | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
428 } else { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
429 throw object_convert_exception( |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
430 PyEval_GetFuncName(py_object.ptr()) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
431 + (PyEval_GetFuncDesc(py_object.ptr()) |
107
691ef5c6b9e2
maint: Clean up std namespace pollution
Mike Miller <mtmiller@octave.org>
parents:
106
diff
changeset
|
432 + std::string(": Unsupported Python object type, " |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
433 "cannot convert to Octave value"))); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
434 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
435 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
436 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
437 void pytuple_to_octlist(octave_value_list &octave_list, |
25 | 438 const boost::python::tuple &python_tuple) { |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
439 int length = extract<int>(python_tuple.attr("__len__")()); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
440 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
441 for (int i = 0; i < length; i++) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
442 pyobj_to_octvalue(octave_list(i), python_tuple[i]); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
443 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
444 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
445 } |