243 lines
6.9 KiB
C++
243 lines
6.9 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
|