Verified Commit a4fa076c authored by Justin Carpentier's avatar Justin Carpentier
Browse files

user types: allow template specialization of getitem

parent f53d37e0
Pipeline #18767 failed with stage
in 17 minutes and 8 seconds
...@@ -38,6 +38,27 @@ static void cast(void* from_, void* to_, npy_intp n, void* /*fromarr*/, ...@@ -38,6 +38,27 @@ static void cast(void* from_, void* to_, npy_intp n, void* /*fromarr*/,
} }
} }
template <typename T>
struct getitem {
///
/// \brief Get a python object from an array
/// It returns a standard Python object from
/// a single element of the array object arr pointed to by data.
/// \param[in] data Pointer to the first element of the C++ data stream
/// \param[in] arr Pointer to the first element of the Python object data
/// stream
///
/// \returns PyObject corresponding to the python datastream.
///
static PyObject* run(void* data, void* /* arr */) {
// std::cout << "getitem" << std::endl;
T* elt_ptr = static_cast<T*>(data);
bp::object m(boost::ref(*elt_ptr));
Py_INCREF(m.ptr());
return m.ptr();
}
};
template <typename T, int type_code = NumpyEquivalentType<T>::type_code> template <typename T, int type_code = NumpyEquivalentType<T>::type_code>
struct SpecialMethods { struct SpecialMethods {
inline static void copyswap(void* /*dst*/, void* /*src*/, int /*swap*/, inline static void copyswap(void* /*dst*/, void* /*src*/, int /*swap*/,
...@@ -71,8 +92,8 @@ struct OffsetOf { ...@@ -71,8 +92,8 @@ struct OffsetOf {
template <typename T> template <typename T>
struct SpecialMethods<T, NPY_USERDEF> { struct SpecialMethods<T, NPY_USERDEF> {
inline static void copyswap(void* dst, void* src, int swap, void* /*arr*/) { static void copyswap(void* dst, void* src, int swap, void* /*arr*/) {
// std::cout << "copyswap" << std::endl; // std::cout << "copyswap" << std::endl;
if (src != NULL) { if (src != NULL) {
T& t1 = *static_cast<T*>(dst); T& t1 = *static_cast<T*>(dst);
T& t2 = *static_cast<T*>(src); T& t2 = *static_cast<T*>(src);
...@@ -86,22 +107,8 @@ struct SpecialMethods<T, NPY_USERDEF> { ...@@ -86,22 +107,8 @@ struct SpecialMethods<T, NPY_USERDEF> {
} }
} }
/// static PyObject* getitem(void* ip, void* ap) {
/// \brief Get a python object from an array return eigenpy::internal::getitem<T>::run(ip, ap);
/// It returns a standard Python object from
/// a single element of the array object arr pointed to by data.
/// \param[in] data Pointer to the first element of the C++ data stream
/// \param[in] arr Pointer to the first element of the Python object data
/// stream
///
/// \returns PyObject corresponding to the python datastream.
///
inline static PyObject* getitem(void* ip, void* /*ap*/) {
// std::cout << "getitem" << std::endl;
T* elt_ptr = static_cast<T*>(ip);
bp::object m(*elt_ptr);
Py_INCREF(m.ptr());
return m.ptr();
} }
/// ///
...@@ -120,7 +127,7 @@ struct SpecialMethods<T, NPY_USERDEF> { ...@@ -120,7 +127,7 @@ struct SpecialMethods<T, NPY_USERDEF> {
/// ///
inline static int setitem(PyObject* src_obj, void* dest_ptr, void* array) { inline static int setitem(PyObject* src_obj, void* dest_ptr, void* array) {
// std::cout << "setitem" << std::endl; // std::cout << "setitem" << std::endl;
if (array == NULL) { if (array == NULL) {
eigenpy::Exception("Cannot retrieve the type stored in the array."); eigenpy::Exception("Cannot retrieve the type stored in the array.");
return -1; return -1;
...@@ -158,7 +165,7 @@ struct SpecialMethods<T, NPY_USERDEF> { ...@@ -158,7 +165,7 @@ struct SpecialMethods<T, NPY_USERDEF> {
inline static void copyswapn(void* dst, long dstride, void* src, long sstride, inline static void copyswapn(void* dst, long dstride, void* src, long sstride,
long n, int swap, void* array) { long n, int swap, void* array) {
// std::cout << "copyswapn" << std::endl; // std::cout << "copyswapn" << std::endl;
char* dstptr = static_cast<char*>(dst); char* dstptr = static_cast<char*>(dst);
char* srcptr = static_cast<char*>(src); char* srcptr = static_cast<char*>(src);
...@@ -174,7 +181,7 @@ struct SpecialMethods<T, NPY_USERDEF> { ...@@ -174,7 +181,7 @@ struct SpecialMethods<T, NPY_USERDEF> {
} }
inline static npy_bool nonzero(void* ip, void* array) { inline static npy_bool nonzero(void* ip, void* array) {
// std::cout << "nonzero" << std::endl; // std::cout << "nonzero" << std::endl;
static const T ZeroValue = T(0); static const T ZeroValue = T(0);
PyArrayObject* py_array = static_cast<PyArrayObject*>(array); PyArrayObject* py_array = static_cast<PyArrayObject*>(array);
if (py_array == NULL || PyArray_ISBEHAVED_RO(py_array)) { if (py_array == NULL || PyArray_ISBEHAVED_RO(py_array)) {
...@@ -190,7 +197,7 @@ struct SpecialMethods<T, NPY_USERDEF> { ...@@ -190,7 +197,7 @@ struct SpecialMethods<T, NPY_USERDEF> {
inline static void dotfunc(void* ip0_, npy_intp is0, void* ip1_, npy_intp is1, inline static void dotfunc(void* ip0_, npy_intp is0, void* ip1_, npy_intp is1,
void* op, npy_intp n, void* /*arr*/) { void* op, npy_intp n, void* /*arr*/) {
// std::cout << "dotfunc" << std::endl; // std::cout << "dotfunc" << std::endl;
typedef Eigen::Matrix<T, Eigen::Dynamic, 1> VectorT; typedef Eigen::Matrix<T, Eigen::Dynamic, 1> VectorT;
typedef Eigen::InnerStride<Eigen::Dynamic> InputStride; typedef Eigen::InnerStride<Eigen::Dynamic> InputStride;
typedef const Eigen::Map<const VectorT, 0, InputStride> ConstMapType; typedef const Eigen::Map<const VectorT, 0, InputStride> ConstMapType;
...@@ -205,7 +212,7 @@ struct SpecialMethods<T, NPY_USERDEF> { ...@@ -205,7 +212,7 @@ struct SpecialMethods<T, NPY_USERDEF> {
inline static int fillwithscalar(void* buffer_, npy_intp length, void* value, inline static int fillwithscalar(void* buffer_, npy_intp length, void* value,
void* /*arr*/) { void* /*arr*/) {
// std::cout << "fillwithscalar" << std::endl; // std::cout << "fillwithscalar" << std::endl;
T r = *static_cast<T*>(value); T r = *static_cast<T*>(value);
T* buffer = static_cast<T*>(buffer_); T* buffer = static_cast<T*>(buffer_);
npy_intp i; npy_intp i;
...@@ -216,7 +223,7 @@ struct SpecialMethods<T, NPY_USERDEF> { ...@@ -216,7 +223,7 @@ struct SpecialMethods<T, NPY_USERDEF> {
} }
static int fill(void* data_, npy_intp length, void* /*arr*/) { static int fill(void* data_, npy_intp length, void* /*arr*/) {
// std::cout << "fillwithscalar" << std::endl; // std::cout << "fill" << std::endl;
T* data = static_cast<T*>(data_); T* data = static_cast<T*>(data_);
const T delta = data[1] - data[0]; const T delta = data[1] - data[0];
T r = data[1]; T r = data[1];
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment