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