243 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			243 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			C++
		
	
	
	
|  | // Copyright David Abrahams 2002.
 | ||
|  | // Distributed under the Boost Software License, Version 1.0. (See
 | ||
|  | // accompanying file LICENSE_1_0.txt or copy at
 | ||
|  | // http://www.boost.org/LICENSE_1_0.txt)
 | ||
|  | #ifndef NUMARRAY_DWA2002922_HPP
 | ||
|  | # define NUMARRAY_DWA2002922_HPP
 | ||
|  | 
 | ||
|  | # include <boost/python/detail/prefix.hpp>
 | ||
|  | 
 | ||
|  | # include <boost/python/tuple.hpp>
 | ||
|  | # include <boost/python/str.hpp>
 | ||
|  | # include <boost/preprocessor/iteration/local.hpp>
 | ||
|  | # include <boost/preprocessor/cat.hpp>
 | ||
|  | # include <boost/preprocessor/repetition/enum.hpp>
 | ||
|  | # include <boost/preprocessor/repetition/enum_params.hpp>
 | ||
|  | # include <boost/preprocessor/repetition/enum_binary_params.hpp>
 | ||
|  | 
 | ||
|  | namespace boost { namespace python { namespace numeric { | ||
|  | 
 | ||
|  | class array; | ||
|  | 
 | ||
|  | namespace aux | ||
|  | { | ||
|  |   struct BOOST_PYTHON_DECL array_base : object | ||
|  |   { | ||
|  | # define BOOST_PP_LOCAL_MACRO(n)                                \
 | ||
|  |       array_base(BOOST_PP_ENUM_PARAMS_Z(1, n, object const& x)); | ||
|  | # define BOOST_PP_LOCAL_LIMITS (1, 7)
 | ||
|  | # include BOOST_PP_LOCAL_ITERATE()
 | ||
|  | 
 | ||
|  |       object argmax(long axis=-1); | ||
|  |       object argmin(long axis=-1); | ||
|  |       object argsort(long axis=-1); | ||
|  |       object astype(object const& type = object()); | ||
|  |       void byteswap(); | ||
|  |       object copy() const; | ||
|  |       object diagonal(long offset = 0, long axis1 = 0, long axis2 = 1) const; | ||
|  |       void info() const; | ||
|  |       bool is_c_array() const; | ||
|  |       bool isbyteswapped() const; | ||
|  |       array new_(object type) const; | ||
|  |       void sort(); | ||
|  |       object trace(long offset = 0, long axis1 = 0, long axis2 = 1) const; | ||
|  |       object type() const; | ||
|  |       char typecode() const; | ||
|  | 
 | ||
|  |       object factory( | ||
|  |           object const& sequence = object() | ||
|  |         , object const& typecode = object() | ||
|  |         , bool copy = true | ||
|  |         , bool savespace = false | ||
|  |         , object type = object() | ||
|  |         , object shape = object()); | ||
|  | 
 | ||
|  |       object getflat() const; | ||
|  |       long getrank() const; | ||
|  |       object getshape() const; | ||
|  |       bool isaligned() const; | ||
|  |       bool iscontiguous() const; | ||
|  |       long itemsize() const; | ||
|  |       long nelements() const; | ||
|  |       object nonzero() const; | ||
|  |     | ||
|  |       void put(object const& indices, object const& values); | ||
|  |     | ||
|  |       void ravel(); | ||
|  |     | ||
|  |       object repeat(object const& repeats, long axis=0); | ||
|  |     | ||
|  |       void resize(object const& shape); | ||
|  |        | ||
|  |       void setflat(object const& flat); | ||
|  |       void setshape(object const& shape); | ||
|  |     | ||
|  |       void swapaxes(long axis1, long axis2); | ||
|  |     | ||
|  |       object take(object const& sequence, long axis = 0) const; | ||
|  |     | ||
|  |       void tofile(object const& file) const; | ||
|  |     | ||
|  |       str tostring() const; | ||
|  |     | ||
|  |       void transpose(object const& axes = object()); | ||
|  |     | ||
|  |       object view() const; | ||
|  | 
 | ||
|  |    public: // implementation detail - do not touch.
 | ||
|  |       BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(array_base, object); | ||
|  |   }; | ||
|  | 
 | ||
|  |   struct BOOST_PYTHON_DECL array_object_manager_traits | ||
|  |   { | ||
|  |       static bool check(PyObject* obj); | ||
|  |       static detail::new_non_null_reference adopt(PyObject* obj); | ||
|  |       static PyTypeObject const* get_pytype() ; | ||
|  |   }; | ||
|  | } // namespace aux
 | ||
|  | 
 | ||
|  | class array : public aux::array_base | ||
|  | { | ||
|  |     typedef aux::array_base base; | ||
|  |  public: | ||
|  | 
 | ||
|  |     object astype() { return base::astype(); } | ||
|  |      | ||
|  |     template <class Type> | ||
|  |     object astype(Type const& type_) | ||
|  |     { | ||
|  |         return base::astype(object(type_)); | ||
|  |     } | ||
|  | 
 | ||
|  |     template <class Type> | ||
|  |     array new_(Type const& type_) const | ||
|  |     { | ||
|  |         return base::new_(object(type_)); | ||
|  |     } | ||
|  | 
 | ||
|  |     template <class Sequence> | ||
|  |     void resize(Sequence const& x) | ||
|  |     { | ||
|  |         base::resize(object(x)); | ||
|  |     } | ||
|  |      | ||
|  | # define BOOST_PP_LOCAL_MACRO(n)                                \
 | ||
|  |       void resize(BOOST_PP_ENUM_PARAMS_Z(1, n, long x))              \ | ||
|  |       {                                                         \ | ||
|  |           resize(make_tuple(BOOST_PP_ENUM_PARAMS_Z(1, n, x)));       \ | ||
|  |       } | ||
|  | # define BOOST_PP_LOCAL_LIMITS (1, BOOST_PYTHON_MAX_ARITY)
 | ||
|  | # include BOOST_PP_LOCAL_ITERATE()
 | ||
|  | 
 | ||
|  |     template <class Sequence> | ||
|  |     void setshape(Sequence const& x) | ||
|  |     { | ||
|  |         base::setshape(object(x)); | ||
|  |     } | ||
|  |      | ||
|  | # define BOOST_PP_LOCAL_MACRO(n)                                \
 | ||
|  |     void setshape(BOOST_PP_ENUM_PARAMS_Z(1, n, long x))              \ | ||
|  |     {                                                           \ | ||
|  |         setshape(make_tuple(BOOST_PP_ENUM_PARAMS_Z(1, n, x)));       \ | ||
|  |     } | ||
|  | # define BOOST_PP_LOCAL_LIMITS (1, BOOST_PYTHON_MAX_ARITY)
 | ||
|  | # include BOOST_PP_LOCAL_ITERATE()
 | ||
|  | 
 | ||
|  |     template <class Indices, class Values> | ||
|  |     void put(Indices const& indices, Values const& values) | ||
|  |     { | ||
|  |         base::put(object(indices), object(values)); | ||
|  |     } | ||
|  |      | ||
|  |     template <class Sequence> | ||
|  |     object take(Sequence const& sequence, long axis = 0) | ||
|  |     { | ||
|  |         return base::take(object(sequence), axis); | ||
|  |     } | ||
|  | 
 | ||
|  |     template <class File> | ||
|  |     void tofile(File const& f) const | ||
|  |     { | ||
|  |         base::tofile(object(f)); | ||
|  |     } | ||
|  | 
 | ||
|  |     object factory() | ||
|  |     { | ||
|  |         return base::factory(); | ||
|  |     } | ||
|  |      | ||
|  |     template <class Sequence> | ||
|  |     object factory(Sequence const& sequence) | ||
|  |     { | ||
|  |         return base::factory(object(sequence)); | ||
|  |     } | ||
|  |      | ||
|  |     template <class Sequence, class Typecode> | ||
|  |     object factory( | ||
|  |         Sequence const& sequence | ||
|  |       , Typecode const& typecode_ | ||
|  |       , bool copy = true | ||
|  |       , bool savespace = false | ||
|  |     ) | ||
|  |     { | ||
|  |         return base::factory(object(sequence), object(typecode_), copy, savespace); | ||
|  |     } | ||
|  | 
 | ||
|  |     template <class Sequence, class Typecode, class Type> | ||
|  |     object factory( | ||
|  |         Sequence const& sequence | ||
|  |       , Typecode const& typecode_ | ||
|  |       , bool copy | ||
|  |       , bool savespace | ||
|  |       , Type const& type | ||
|  |     ) | ||
|  |     { | ||
|  |         return base::factory(object(sequence), object(typecode_), copy, savespace, object(type)); | ||
|  |     } | ||
|  |      | ||
|  |     template <class Sequence, class Typecode, class Type, class Shape> | ||
|  |     object factory( | ||
|  |         Sequence const& sequence | ||
|  |       , Typecode const& typecode_ | ||
|  |       , bool copy | ||
|  |       , bool savespace | ||
|  |       , Type const& type | ||
|  |       , Shape const& shape | ||
|  |     ) | ||
|  |     { | ||
|  |         return base::factory(object(sequence), object(typecode_), copy, savespace, object(type), object(shape)); | ||
|  |     } | ||
|  |      | ||
|  | # define BOOST_PYTHON_ENUM_AS_OBJECT(z, n, x) object(BOOST_PP_CAT(x,n))
 | ||
|  | # define BOOST_PP_LOCAL_MACRO(n)                                        \
 | ||
|  |     template <BOOST_PP_ENUM_PARAMS_Z(1, n, class T)>                    \ | ||
|  |     explicit array(BOOST_PP_ENUM_BINARY_PARAMS_Z(1, n, T, const& x))    \ | ||
|  |     : base(BOOST_PP_ENUM_1(n, BOOST_PYTHON_ENUM_AS_OBJECT, x))          \ | ||
|  |     {} | ||
|  | # define BOOST_PP_LOCAL_LIMITS (1, 7)
 | ||
|  | # include BOOST_PP_LOCAL_ITERATE()
 | ||
|  | # undef BOOST_PYTHON_AS_OBJECT
 | ||
|  | 
 | ||
|  |     static BOOST_PYTHON_DECL void set_module_and_type(char const* package_name = 0, char const* type_attribute_name = 0); | ||
|  |     static BOOST_PYTHON_DECL std::string get_module_name(); | ||
|  | 
 | ||
|  |  public: // implementation detail -- for internal use only
 | ||
|  |     BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(array, base); | ||
|  | }; | ||
|  | 
 | ||
|  | } // namespace boost::python::numeric
 | ||
|  | 
 | ||
|  | namespace converter | ||
|  | { | ||
|  |   template <> | ||
|  |   struct object_manager_traits< numeric::array > | ||
|  |       : numeric::aux::array_object_manager_traits | ||
|  |   { | ||
|  |       BOOST_STATIC_CONSTANT(bool, is_specialized = true); | ||
|  |   }; | ||
|  | } | ||
|  | 
 | ||
|  | }} // namespace boost::python
 | ||
|  | 
 | ||
|  | #endif // NUMARRAY_DWA2002922_HPP
 |