Chris@16
|
1 // Copyright David Abrahams 2002.
|
Chris@16
|
2 // Distributed under the Boost Software License, Version 1.0. (See
|
Chris@16
|
3 // accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
4 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
5 #ifndef NUMARRAY_DWA2002922_HPP
|
Chris@16
|
6 # define NUMARRAY_DWA2002922_HPP
|
Chris@16
|
7
|
Chris@16
|
8 # include <boost/python/detail/prefix.hpp>
|
Chris@16
|
9
|
Chris@16
|
10 # include <boost/python/tuple.hpp>
|
Chris@16
|
11 # include <boost/python/str.hpp>
|
Chris@16
|
12 # include <boost/preprocessor/iteration/local.hpp>
|
Chris@16
|
13 # include <boost/preprocessor/cat.hpp>
|
Chris@16
|
14 # include <boost/preprocessor/repetition/enum.hpp>
|
Chris@16
|
15 # include <boost/preprocessor/repetition/enum_params.hpp>
|
Chris@16
|
16 # include <boost/preprocessor/repetition/enum_binary_params.hpp>
|
Chris@16
|
17
|
Chris@16
|
18 namespace boost { namespace python { namespace numeric {
|
Chris@16
|
19
|
Chris@16
|
20 class array;
|
Chris@16
|
21
|
Chris@16
|
22 namespace aux
|
Chris@16
|
23 {
|
Chris@16
|
24 struct BOOST_PYTHON_DECL array_base : object
|
Chris@16
|
25 {
|
Chris@16
|
26 # define BOOST_PP_LOCAL_MACRO(n) \
|
Chris@16
|
27 array_base(BOOST_PP_ENUM_PARAMS_Z(1, n, object const& x));
|
Chris@16
|
28 # define BOOST_PP_LOCAL_LIMITS (1, 7)
|
Chris@16
|
29 # include BOOST_PP_LOCAL_ITERATE()
|
Chris@16
|
30
|
Chris@16
|
31 object argmax(long axis=-1);
|
Chris@16
|
32 object argmin(long axis=-1);
|
Chris@16
|
33 object argsort(long axis=-1);
|
Chris@16
|
34 object astype(object const& type = object());
|
Chris@16
|
35 void byteswap();
|
Chris@16
|
36 object copy() const;
|
Chris@16
|
37 object diagonal(long offset = 0, long axis1 = 0, long axis2 = 1) const;
|
Chris@16
|
38 void info() const;
|
Chris@16
|
39 bool is_c_array() const;
|
Chris@16
|
40 bool isbyteswapped() const;
|
Chris@16
|
41 array new_(object type) const;
|
Chris@16
|
42 void sort();
|
Chris@16
|
43 object trace(long offset = 0, long axis1 = 0, long axis2 = 1) const;
|
Chris@16
|
44 object type() const;
|
Chris@16
|
45 char typecode() const;
|
Chris@16
|
46
|
Chris@16
|
47 object factory(
|
Chris@16
|
48 object const& sequence = object()
|
Chris@16
|
49 , object const& typecode = object()
|
Chris@16
|
50 , bool copy = true
|
Chris@16
|
51 , bool savespace = false
|
Chris@16
|
52 , object type = object()
|
Chris@16
|
53 , object shape = object());
|
Chris@16
|
54
|
Chris@16
|
55 object getflat() const;
|
Chris@16
|
56 long getrank() const;
|
Chris@16
|
57 object getshape() const;
|
Chris@16
|
58 bool isaligned() const;
|
Chris@16
|
59 bool iscontiguous() const;
|
Chris@16
|
60 long itemsize() const;
|
Chris@16
|
61 long nelements() const;
|
Chris@16
|
62 object nonzero() const;
|
Chris@16
|
63
|
Chris@16
|
64 void put(object const& indices, object const& values);
|
Chris@16
|
65
|
Chris@16
|
66 void ravel();
|
Chris@16
|
67
|
Chris@16
|
68 object repeat(object const& repeats, long axis=0);
|
Chris@16
|
69
|
Chris@16
|
70 void resize(object const& shape);
|
Chris@16
|
71
|
Chris@16
|
72 void setflat(object const& flat);
|
Chris@16
|
73 void setshape(object const& shape);
|
Chris@16
|
74
|
Chris@16
|
75 void swapaxes(long axis1, long axis2);
|
Chris@16
|
76
|
Chris@16
|
77 object take(object const& sequence, long axis = 0) const;
|
Chris@16
|
78
|
Chris@16
|
79 void tofile(object const& file) const;
|
Chris@16
|
80
|
Chris@16
|
81 str tostring() const;
|
Chris@16
|
82
|
Chris@16
|
83 void transpose(object const& axes = object());
|
Chris@16
|
84
|
Chris@16
|
85 object view() const;
|
Chris@16
|
86
|
Chris@16
|
87 public: // implementation detail - do not touch.
|
Chris@16
|
88 BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(array_base, object);
|
Chris@16
|
89 };
|
Chris@16
|
90
|
Chris@16
|
91 struct BOOST_PYTHON_DECL array_object_manager_traits
|
Chris@16
|
92 {
|
Chris@16
|
93 static bool check(PyObject* obj);
|
Chris@16
|
94 static detail::new_non_null_reference adopt(PyObject* obj);
|
Chris@16
|
95 static PyTypeObject const* get_pytype() ;
|
Chris@16
|
96 };
|
Chris@16
|
97 } // namespace aux
|
Chris@16
|
98
|
Chris@16
|
99 class array : public aux::array_base
|
Chris@16
|
100 {
|
Chris@16
|
101 typedef aux::array_base base;
|
Chris@16
|
102 public:
|
Chris@16
|
103
|
Chris@16
|
104 object astype() { return base::astype(); }
|
Chris@16
|
105
|
Chris@16
|
106 template <class Type>
|
Chris@16
|
107 object astype(Type const& type_)
|
Chris@16
|
108 {
|
Chris@16
|
109 return base::astype(object(type_));
|
Chris@16
|
110 }
|
Chris@16
|
111
|
Chris@16
|
112 template <class Type>
|
Chris@16
|
113 array new_(Type const& type_) const
|
Chris@16
|
114 {
|
Chris@16
|
115 return base::new_(object(type_));
|
Chris@16
|
116 }
|
Chris@16
|
117
|
Chris@16
|
118 template <class Sequence>
|
Chris@16
|
119 void resize(Sequence const& x)
|
Chris@16
|
120 {
|
Chris@16
|
121 base::resize(object(x));
|
Chris@16
|
122 }
|
Chris@16
|
123
|
Chris@16
|
124 # define BOOST_PP_LOCAL_MACRO(n) \
|
Chris@16
|
125 void resize(BOOST_PP_ENUM_PARAMS_Z(1, n, long x)) \
|
Chris@16
|
126 { \
|
Chris@16
|
127 resize(make_tuple(BOOST_PP_ENUM_PARAMS_Z(1, n, x))); \
|
Chris@16
|
128 }
|
Chris@16
|
129 # define BOOST_PP_LOCAL_LIMITS (1, BOOST_PYTHON_MAX_ARITY)
|
Chris@16
|
130 # include BOOST_PP_LOCAL_ITERATE()
|
Chris@16
|
131
|
Chris@16
|
132 template <class Sequence>
|
Chris@16
|
133 void setshape(Sequence const& x)
|
Chris@16
|
134 {
|
Chris@16
|
135 base::setshape(object(x));
|
Chris@16
|
136 }
|
Chris@16
|
137
|
Chris@16
|
138 # define BOOST_PP_LOCAL_MACRO(n) \
|
Chris@16
|
139 void setshape(BOOST_PP_ENUM_PARAMS_Z(1, n, long x)) \
|
Chris@16
|
140 { \
|
Chris@16
|
141 setshape(make_tuple(BOOST_PP_ENUM_PARAMS_Z(1, n, x))); \
|
Chris@16
|
142 }
|
Chris@16
|
143 # define BOOST_PP_LOCAL_LIMITS (1, BOOST_PYTHON_MAX_ARITY)
|
Chris@16
|
144 # include BOOST_PP_LOCAL_ITERATE()
|
Chris@16
|
145
|
Chris@16
|
146 template <class Indices, class Values>
|
Chris@16
|
147 void put(Indices const& indices, Values const& values)
|
Chris@16
|
148 {
|
Chris@16
|
149 base::put(object(indices), object(values));
|
Chris@16
|
150 }
|
Chris@16
|
151
|
Chris@16
|
152 template <class Sequence>
|
Chris@16
|
153 object take(Sequence const& sequence, long axis = 0)
|
Chris@16
|
154 {
|
Chris@16
|
155 return base::take(object(sequence), axis);
|
Chris@16
|
156 }
|
Chris@16
|
157
|
Chris@16
|
158 template <class File>
|
Chris@16
|
159 void tofile(File const& f) const
|
Chris@16
|
160 {
|
Chris@16
|
161 base::tofile(object(f));
|
Chris@16
|
162 }
|
Chris@16
|
163
|
Chris@16
|
164 object factory()
|
Chris@16
|
165 {
|
Chris@16
|
166 return base::factory();
|
Chris@16
|
167 }
|
Chris@16
|
168
|
Chris@16
|
169 template <class Sequence>
|
Chris@16
|
170 object factory(Sequence const& sequence)
|
Chris@16
|
171 {
|
Chris@16
|
172 return base::factory(object(sequence));
|
Chris@16
|
173 }
|
Chris@16
|
174
|
Chris@16
|
175 template <class Sequence, class Typecode>
|
Chris@16
|
176 object factory(
|
Chris@16
|
177 Sequence const& sequence
|
Chris@16
|
178 , Typecode const& typecode_
|
Chris@16
|
179 , bool copy = true
|
Chris@16
|
180 , bool savespace = false
|
Chris@16
|
181 )
|
Chris@16
|
182 {
|
Chris@16
|
183 return base::factory(object(sequence), object(typecode_), copy, savespace);
|
Chris@16
|
184 }
|
Chris@16
|
185
|
Chris@16
|
186 template <class Sequence, class Typecode, class Type>
|
Chris@16
|
187 object factory(
|
Chris@16
|
188 Sequence const& sequence
|
Chris@16
|
189 , Typecode const& typecode_
|
Chris@16
|
190 , bool copy
|
Chris@16
|
191 , bool savespace
|
Chris@16
|
192 , Type const& type
|
Chris@16
|
193 )
|
Chris@16
|
194 {
|
Chris@16
|
195 return base::factory(object(sequence), object(typecode_), copy, savespace, object(type));
|
Chris@16
|
196 }
|
Chris@16
|
197
|
Chris@16
|
198 template <class Sequence, class Typecode, class Type, class Shape>
|
Chris@16
|
199 object factory(
|
Chris@16
|
200 Sequence const& sequence
|
Chris@16
|
201 , Typecode const& typecode_
|
Chris@16
|
202 , bool copy
|
Chris@16
|
203 , bool savespace
|
Chris@16
|
204 , Type const& type
|
Chris@16
|
205 , Shape const& shape
|
Chris@16
|
206 )
|
Chris@16
|
207 {
|
Chris@16
|
208 return base::factory(object(sequence), object(typecode_), copy, savespace, object(type), object(shape));
|
Chris@16
|
209 }
|
Chris@16
|
210
|
Chris@16
|
211 # define BOOST_PYTHON_ENUM_AS_OBJECT(z, n, x) object(BOOST_PP_CAT(x,n))
|
Chris@16
|
212 # define BOOST_PP_LOCAL_MACRO(n) \
|
Chris@16
|
213 template <BOOST_PP_ENUM_PARAMS_Z(1, n, class T)> \
|
Chris@16
|
214 explicit array(BOOST_PP_ENUM_BINARY_PARAMS_Z(1, n, T, const& x)) \
|
Chris@16
|
215 : base(BOOST_PP_ENUM_1(n, BOOST_PYTHON_ENUM_AS_OBJECT, x)) \
|
Chris@16
|
216 {}
|
Chris@16
|
217 # define BOOST_PP_LOCAL_LIMITS (1, 7)
|
Chris@16
|
218 # include BOOST_PP_LOCAL_ITERATE()
|
Chris@16
|
219 # undef BOOST_PYTHON_AS_OBJECT
|
Chris@16
|
220
|
Chris@16
|
221 static BOOST_PYTHON_DECL void set_module_and_type(char const* package_name = 0, char const* type_attribute_name = 0);
|
Chris@16
|
222 static BOOST_PYTHON_DECL std::string get_module_name();
|
Chris@16
|
223
|
Chris@16
|
224 public: // implementation detail -- for internal use only
|
Chris@16
|
225 BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(array, base);
|
Chris@16
|
226 };
|
Chris@16
|
227
|
Chris@16
|
228 } // namespace boost::python::numeric
|
Chris@16
|
229
|
Chris@16
|
230 namespace converter
|
Chris@16
|
231 {
|
Chris@16
|
232 template <>
|
Chris@16
|
233 struct object_manager_traits< numeric::array >
|
Chris@16
|
234 : numeric::aux::array_object_manager_traits
|
Chris@16
|
235 {
|
Chris@16
|
236 BOOST_STATIC_CONSTANT(bool, is_specialized = true);
|
Chris@16
|
237 };
|
Chris@16
|
238 }
|
Chris@16
|
239
|
Chris@16
|
240 }} // namespace boost::python
|
Chris@16
|
241
|
Chris@16
|
242 #endif // NUMARRAY_DWA2002922_HPP
|