Mercurial > pytave
annotate python_to_octave.cc @ 51:b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Wed, 03 Jun 2009 16:41:44 +0200 |
parents | 22e74c46bea2 |
children | 43a413b7c151 |
rev | line source |
---|---|
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
1 /* |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
2 * Copyright 2008 David Grundberg, HÃ¥kan Fors Nilsson |
46 | 3 * Copyright 2009 VZLU Prague |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
4 * |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
5 * This file is part of Pytave. |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
6 * |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
7 * Pytave is free software: you can redistribute it and/or modify |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
8 * it under the terms of the GNU General Public License as published by |
6 | 9 * the Free Software Foundation, either version 3 of the License, or |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
10 * (at your option) any later version. |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
11 * |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
12 * Pytave is distributed in the hope that it will be useful, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
15 * GNU General Public License for more details. |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
16 * |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
17 * You should have received a copy of the GNU General Public License |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
18 * along with Pytave. If not, see <http://www.gnu.org/licenses/>. |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
19 */ |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
20 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
21 #include <iostream> |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
22 #include <boost/python.hpp> |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
23 #include <boost/python/numeric.hpp> |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
24 #include "arrayobjectdefs.h" |
46 | 25 #include <boost/type_traits/integral_constant.hpp> |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
26 #undef HAVE_STAT /* both boost.python and octave defines HAVE_STAT... */ |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
27 #include <octave/oct.h> |
9 | 28 #include <octave/oct-map.h> |
29 #include <octave/Cell.h> | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
30 #include <octave/Matrix.h> |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
31 #include <octave/ov.h> |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
32 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
33 #include "pytavedefs.h" |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
34 #include "exceptions.h" |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
35 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
36 using namespace std; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
37 using namespace boost::python; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
38 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
39 namespace pytave { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
40 |
9 | 41 void pyobj_to_octvalue(octave_value &oct_value, |
42 const boost::python::object &py_object); | |
43 | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
44 template <class PythonPrimitive, class OctaveBase> |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
45 static void copy_pyarrobj_to_octarray(OctaveBase &matrix, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
46 const PyArrayObject* const pyarr, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
47 const int unsigned matindex, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
48 const unsigned int matstride, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
49 const int dimension, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
50 const unsigned int offset) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
51 unsigned char *ptr = (unsigned char*) pyarr->data; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
52 if (dimension == pyarr->nd - 1) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
53 // Last dimension, base case |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
54 for (int i = 0; i < pyarr->dimensions[dimension]; i++) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
55 matrix.elem(matindex + i*matstride) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
56 = *(PythonPrimitive*) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
57 &ptr[offset + i*pyarr->strides[dimension]]; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
58 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
59 } else { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
60 for (int i = 0; i < pyarr->dimensions[dimension]; i++) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
61 copy_pyarrobj_to_octarray<PythonPrimitive, OctaveBase>( |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
62 matrix, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
63 pyarr, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
64 matindex + i*matstride, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
65 matstride * pyarr->dimensions[dimension], |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
66 dimension + 1, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
67 offset + i*pyarr->strides[dimension]); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
68 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
69 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
70 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
71 |
51
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
72 template <> |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
73 void copy_pyarrobj_to_octarray<PyObject *, Cell>(Cell &matrix, |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
74 const PyArrayObject* const pyarr, |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
75 const int unsigned matindex, |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
76 const unsigned int matstride, |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
77 const int dimension, |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
78 const unsigned int offset) { |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
79 unsigned char *ptr = (unsigned char*) pyarr->data; |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
80 if (dimension == pyarr->nd - 1) { |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
81 // Last dimension, base case |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
82 for (int i = 0; i < pyarr->dimensions[dimension]; i++) { |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
83 PyObject *pobj = *(PyObject **) |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
84 &ptr[offset + i*pyarr->strides[dimension]]; |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
85 pyobj_to_octvalue (matrix.elem(matindex + i*matstride), |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
86 object(handle<PyObject> (borrowed (pobj)))); |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
87 } |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
88 } else { |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
89 for (int i = 0; i < pyarr->dimensions[dimension]; i++) { |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
90 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
|
91 matrix, |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
92 pyarr, |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
93 matindex + i*matstride, |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
94 matstride * pyarr->dimensions[dimension], |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
95 dimension + 1, |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
96 offset + i*pyarr->strides[dimension]); |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
97 } |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
98 } |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
99 } |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
100 |
46 | 101 template <class PythonPrimitive, class OctaveBase> |
102 static void copy_pyarrobj_to_octarray_dispatch(OctaveBase &matrix, | |
103 const PyArrayObject* const pyarr, | |
104 const boost::true_type&) { | |
105 copy_pyarrobj_to_octarray<PythonPrimitive, OctaveBase> | |
106 (matrix, pyarr, 0, 1, 0, 0); | |
107 } | |
108 | |
109 template <class PythonPrimitive, class OctaveBase> | |
110 static void copy_pyarrobj_to_octarray_dispatch(OctaveBase &matrix, | |
111 const PyArrayObject* const pyarr, | |
112 const boost::false_type&) { | |
113 assert(0); | |
114 } | |
115 | |
116 template <class X, class Y> class matching_type : public boost::false_type { }; | |
117 template <class X> class matching_type<X, X> : public boost::true_type { }; | |
118 template <class X> class matching_type<X, octave_int<X> > : public boost::true_type { }; | |
119 template <> class matching_type<float, double> : public boost::true_type { }; | |
120 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
|
121 template <> class matching_type<PyObject *, octave_value> : public boost::true_type { }; |
46 | 122 |
123 template <class PythonPrimitive, class OctaveBase> | |
124 static void copy_pyarrobj_to_octarray_dispatch(OctaveBase &matrix, | |
125 const PyArrayObject* const pyarr) { | |
126 matching_type<PythonPrimitive, typename OctaveBase::element_type> inst; | |
127 copy_pyarrobj_to_octarray_dispatch<PythonPrimitive, OctaveBase> (matrix, pyarr, inst); | |
128 } | |
129 | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
130 template <class OctaveBase> |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
131 static void copy_pyarrobj_to_octarray_boot(OctaveBase &matrix, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
132 const PyArrayObject* const pyarr) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
133 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
134 #define ARRAYCASE(AC_pyarrtype, AC_primitive) case AC_pyarrtype: \ |
46 | 135 copy_pyarrobj_to_octarray_dispatch<AC_primitive, OctaveBase>\ |
136 (matrix, pyarr); \ | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
137 break; \ |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
138 |
47
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
139 // Prefer int to other types of the same size. |
50 | 140 // E.g. on 32-bit x86 architectures: sizeof(long) == sizeof(int). |
47
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
141 int type_num = pyarr->descr->type_num; |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
142 switch (type_num) { |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
143 case PyArray_LONG: |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
144 if (sizeof(long) == sizeof(int)) { |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
145 type_num = PyArray_INT; |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
146 } |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
147 break; |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
148 case PyArray_SHORT: |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
149 if (sizeof(short) == sizeof(int)) { |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
150 type_num = PyArray_INT; |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
151 } |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
152 break; |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
153 case PyArray_USHORT: |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
154 if (sizeof(unsigned short) == sizeof(unsigned int)) { |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
155 type_num = PyArray_UINT; |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
156 } |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
157 break; |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
158 } |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
159 |
c83754e57d26
Fix compilation on 32-bit x86.
David Grundberg <individ@acc.umu.se>
parents:
46
diff
changeset
|
160 switch (type_num) { |
51
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
161 ARRAYCASE(PyArray_CHAR, char) |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
162 ARRAYCASE(PyArray_UBYTE, unsigned char) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
163 ARRAYCASE(PyArray_SBYTE, signed char) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
164 ARRAYCASE(PyArray_SHORT, signed short) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
165 ARRAYCASE(PyArray_USHORT, unsigned short) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
166 ARRAYCASE(PyArray_INT, signed int) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
167 ARRAYCASE(PyArray_UINT, unsigned int) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
168 ARRAYCASE(PyArray_LONG, signed long) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
169 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
170 /* Commonly Numeric.array(..., Numeric.Float32) */ |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
171 ARRAYCASE(PyArray_FLOAT, float) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
172 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
173 /* Commonly Numeric.array(..., Numeric.Float) */ |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
174 ARRAYCASE(PyArray_DOUBLE, double) |
46 | 175 |
176 /* Commonly Numeric.array(..., Numeric.Complex32) */ | |
177 ARRAYCASE(PyArray_CFLOAT, FloatComplex) | |
178 | |
179 /* Commonly Numeric.array(..., Numeric.Complex) */ | |
180 ARRAYCASE(PyArray_CDOUBLE, Complex) | |
51
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
181 |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
182 ARRAYCASE(PyArray_OBJECT, PyObject *) |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
183 |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
184 default: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
185 throw object_convert_exception( |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
186 PyEval_GetFuncName((PyObject*)pyarr) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
187 + (PyEval_GetFuncDesc((PyObject*)pyarr) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
188 + string(": Unsupported Python array type"))); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
189 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
190 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
191 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
192 template <class OctaveBase> |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
193 static void pyarrobj_to_octvalueNd(octave_value &octvalue, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
194 const PyArrayObject* const pyarr, |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
195 dim_vector dims) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
196 OctaveBase array(dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
197 copy_pyarrobj_to_octarray_boot<OctaveBase>(array, pyarr); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
198 octvalue = array; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
199 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
200 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
201 static void pyarr_to_octvalue(octave_value &octvalue, |
25 | 202 const PyArrayObject *pyarr) { |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
203 if (pyarr->nd < 1) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
204 throw object_convert_exception("Less than 1 dimensions not supported"); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
205 dim_vector dims; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
206 switch (pyarr->nd) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
207 case 1: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
208 // Always make PyArray vectors row vectors. |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
209 dims = dim_vector(1, pyarr->dimensions[0]); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
210 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
211 default: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
212 dims.resize(pyarr->nd); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
213 for (int d = 0; d < pyarr->nd; d++) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
214 dims(d) = pyarr->dimensions[d]; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
215 } |
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 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
218 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
219 switch (pyarr->descr->type_num) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
220 case PyArray_UBYTE: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
221 case PyArray_USHORT: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
222 case PyArray_UINT: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
223 switch (pyarr->descr->elsize) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
224 case 1: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
225 pyarrobj_to_octvalueNd<uint8NDArray>(octvalue, pyarr, dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
226 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
227 case 2: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
228 pyarrobj_to_octvalueNd<uint16NDArray>(octvalue, pyarr, dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
229 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
230 case 4: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
231 pyarrobj_to_octvalueNd<uint32NDArray>(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 default: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
234 throw object_convert_exception("Unknown unsigned integer."); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
235 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
236 case PyArray_SBYTE: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
237 case PyArray_SHORT: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
238 case PyArray_INT: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
239 case PyArray_LONG: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
240 switch (pyarr->descr->elsize) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
241 case 1: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
242 pyarrobj_to_octvalueNd<int8NDArray>(octvalue, pyarr, dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
243 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
244 case 2: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
245 pyarrobj_to_octvalueNd<int16NDArray>(octvalue, pyarr, dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
246 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
247 case 4: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
248 pyarrobj_to_octvalueNd<int32NDArray>(octvalue, pyarr, dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
249 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
250 case 8: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
251 pyarrobj_to_octvalueNd<int64NDArray>(octvalue, pyarr, dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
252 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
253 default: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
254 throw object_convert_exception("Unknown integer."); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
255 } |
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 PyArray_FLOAT: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
258 pyarrobj_to_octvalueNd<FloatNDArray>(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 case PyArray_DOUBLE: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
261 pyarrobj_to_octvalueNd<NDArray>(octvalue, pyarr, dims); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
262 break; |
46 | 263 case PyArray_CFLOAT: |
264 pyarrobj_to_octvalueNd<FloatComplexNDArray>(octvalue, pyarr, dims); | |
265 break; | |
266 case PyArray_CDOUBLE: | |
267 pyarrobj_to_octvalueNd<ComplexNDArray>(octvalue, pyarr, dims); | |
268 break; | |
51
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
269 case PyArray_CHAR: |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
270 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
|
271 // FIXME: is the following needed? |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
272 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
|
273 break; |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
274 case PyArray_OBJECT: |
b001edc0f81a
implement Python->Octave conversions of Character and PyObject arrays
Jaroslav Hajek <highegg@gmail.com>
parents:
50
diff
changeset
|
275 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
|
276 break; |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
277 default: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
278 throw object_convert_exception( |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
279 PyEval_GetFuncDesc((PyObject*)(pyarr)) + string(" ") |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
280 + PyEval_GetFuncName((PyObject*)(pyarr)) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
281 + ": Encountered unsupported Python array"); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
282 break; |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
283 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
284 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
285 |
25 | 286 static void pylist_to_cellarray(octave_value &oct_value, |
287 const boost::python::list &list) { | |
288 | |
31
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
289 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
|
290 list.attr("__len__")()); |
9 | 291 octave_value_list values; |
292 | |
293 for(octave_idx_type i = 0; i < length; i++) { | |
25 | 294 octave_value val; |
9 | 295 |
296 pyobj_to_octvalue(val, list[i]); | |
297 values.append(val); | |
298 | |
299 } | |
25 | 300 |
9 | 301 oct_value = Cell(values); |
302 } | |
303 | |
25 | 304 static void pydict_to_octmap(octave_value &oct_value, |
305 const boost::python::dict &dict) { | |
9 | 306 |
307 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
|
308 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
|
309 list.attr("__len__")()); |
9 | 310 |
311 dim_vector dims = dim_vector(1, 1); | |
312 | |
25 | 313 bool has_dimensions = false; |
9 | 314 |
43
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
315 Array<octave_value> vals (length); |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
316 Array<std::string> keys (length); |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
317 |
9 | 318 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
|
319 |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
320 std::string& key = keys(i); |
9 | 321 |
322 boost::python::tuple tuple = | |
323 boost::python::extract<boost::python::tuple>(list[i])(); | |
324 | |
43
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
325 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
|
326 if(!str.check()) { |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
327 throw object_convert_exception( |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
328 string("Can not convert key of type ") |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
329 + 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
|
330 + 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
|
331 + " 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
|
332 } |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
333 |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
334 key = str(); |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
335 |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
336 if (!valid_identifier(key)) { |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
337 throw object_convert_exception( |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
338 string("Can not convert key `") + key + "' to a structure " |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
339 "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
|
340 } |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
341 |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
342 octave_value& val = vals(i); |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
343 |
9 | 344 pyobj_to_octvalue(val, tuple[1]); |
345 | |
346 if(val.is_cell()) { | |
347 const Cell c(val.cell_value()); | |
31
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
348 if (error_state) |
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
349 throw object_convert_exception("Octave error"); |
9 | 350 |
27
c3cba408a7e6
Stop incorrect conversion of multi-row strings. More strict check for undefined values. Check for invalid structure field names. Better error messages. Documentation about dict/list conversion.
David Grundberg <individ@acc.umu.se>
parents:
25
diff
changeset
|
351 // We do not bother measuring 1x1 values, since they are replicated |
c3cba408a7e6
Stop incorrect conversion of multi-row strings. More strict check for undefined values. Check for invalid structure field names. Better error messages. Documentation about dict/list conversion.
David Grundberg <individ@acc.umu.se>
parents:
25
diff
changeset
|
352 // to fill up the necessary dimensions. |
31
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
353 if(!(c.dims().length() == 2 && c.dims()(0) == 1 && c.dims()(1) == 1)) { |
9 | 354 |
355 if(!has_dimensions) { | |
356 dims = c.dims(); | |
357 has_dimensions = true; | |
358 } else if(c.dims() != dims) { | |
359 throw object_convert_exception( | |
27
c3cba408a7e6
Stop incorrect conversion of multi-row strings. More strict check for undefined values. Check for invalid structure field names. Better error messages. Documentation about dict/list conversion.
David Grundberg <individ@acc.umu.se>
parents:
25
diff
changeset
|
360 "Dimensions of the struct fields do not match"); |
9 | 361 } |
362 } | |
363 } | |
364 } | |
365 | |
366 Octave_map map = Octave_map(dims); | |
367 | |
368 for(octave_idx_type i = 0; i < length; i++) { | |
369 | |
43
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
370 std::string& key = keys(i); |
31df83060183
avoid duplicate conversions in python dict->octave map
Jaroslav Hajek <highegg@gmail.com>
parents:
31
diff
changeset
|
371 octave_value val = vals(i); |
9 | 372 |
31
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
373 if(!val.is_cell()) { |
9 | 374 map.assign(key, Cell(dims, val)); |
31
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
375 } else { |
9 | 376 const Cell c(val.cell_value()); |
377 | |
31
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
378 if (error_state) |
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
379 throw object_convert_exception("Octave error"); |
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
380 |
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
381 if(c.dims().length() == 2 && c.dims()(0) == 1 && c.dims()(1) == 1) { |
9 | 382 map.assign(key, Cell(dims, c(0))); |
31
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
383 } |
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
384 else { |
9 | 385 map.assign(key, c); |
31
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
386 } |
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
387 } |
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
388 if (error_state) { |
d3c4fa6c6272
Fixed incorrect cell wrapping. Removed misc compiler warnings.
David Grundberg <individ@acc.umu.se>
parents:
27
diff
changeset
|
389 throw object_convert_exception("Octave error"); |
9 | 390 } |
391 } | |
392 oct_value = map; | |
393 } | |
394 | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
395 void pyobj_to_octvalue(octave_value &oct_value, |
25 | 396 const boost::python::object &py_object) { |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
397 extract<int> intx(py_object); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
398 extract<double> doublex(py_object); |
46 | 399 extract<Complex> complexx(py_object); |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
400 extract<string> stringx(py_object); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
401 extract<numeric::array> arrayx(py_object); |
9 | 402 extract<boost::python::list> listx(py_object); |
403 extract<boost::python::dict> dictx(py_object); | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
404 if (intx.check()) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
405 oct_value = intx(); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
406 } else if (doublex.check()) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
407 oct_value = doublex(); |
46 | 408 } else if (complexx.check()) { |
409 oct_value = complexx(); | |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
410 } else if (arrayx.check()) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
411 pyarr_to_octvalue(oct_value, (PyArrayObject*)py_object.ptr()); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
412 } else if (stringx.check()) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
413 oct_value = stringx(); |
9 | 414 } else if (listx.check()) { |
415 pylist_to_cellarray(oct_value, (boost::python::list&)py_object); | |
416 } else if (dictx.check()) { | |
417 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
|
418 } else { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
419 throw object_convert_exception( |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
420 PyEval_GetFuncName(py_object.ptr()) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
421 + (PyEval_GetFuncDesc(py_object.ptr()) |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
422 + string(": Unsupported Python object type, " |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
423 "cannot convert to Octave value"))); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
424 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
425 } |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
426 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
427 void pytuple_to_octlist(octave_value_list &octave_list, |
25 | 428 const boost::python::tuple &python_tuple) { |
0
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
429 int length = extract<int>(python_tuple.attr("__len__")()); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
430 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
431 for (int i = 0; i < length; i++) { |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
432 pyobj_to_octvalue(octave_list(i), python_tuple[i]); |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
433 } |
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 /* Emacs |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
438 * Local Variables: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
439 * fill-column:79 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
440 * coding:utf-8 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
441 * indent-tabs-mode:nil |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
442 * c-basic-offset:3 |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
443 * End: |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
444 * vim: set textwidth=79 expandtab shiftwidth=3 : |
4da14cce0890
First launchpad.net check in.
David Grundberg <c04dgg@cs.umu.se>
parents:
diff
changeset
|
445 */ |