mirror of
https://github.com/pybind/pybind11.git
synced 2025-02-22 16:39:29 +00:00
Add a basic test for recarrays and complex dtypes
This commit is contained in:
parent
2488b32066
commit
bb4015ded3
@ -26,6 +26,7 @@ set(PYBIND11_EXAMPLES
|
|||||||
example-stl-binder-vector.cpp
|
example-stl-binder-vector.cpp
|
||||||
example-eval.cpp
|
example-eval.cpp
|
||||||
example-custom-exceptions.cpp
|
example-custom-exceptions.cpp
|
||||||
|
example20.cpp
|
||||||
issues.cpp
|
issues.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -65,4 +66,3 @@ foreach(VALUE ${PYBIND11_EXAMPLES})
|
|||||||
string(REGEX REPLACE "^(.+).cpp$" "\\1" EXAMPLE_NAME "${VALUE}")
|
string(REGEX REPLACE "^(.+).cpp$" "\\1" EXAMPLE_NAME "${VALUE}")
|
||||||
add_test(NAME ${EXAMPLE_NAME} COMMAND ${RUN_TEST} ${EXAMPLE_NAME})
|
add_test(NAME ${EXAMPLE_NAME} COMMAND ${RUN_TEST} ${EXAMPLE_NAME})
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
|
@ -29,6 +29,7 @@ void init_ex_inheritance(py::module &);
|
|||||||
void init_ex_stl_binder_vector(py::module &);
|
void init_ex_stl_binder_vector(py::module &);
|
||||||
void init_ex_eval(py::module &);
|
void init_ex_eval(py::module &);
|
||||||
void init_ex_custom_exceptions(py::module &);
|
void init_ex_custom_exceptions(py::module &);
|
||||||
|
void init_ex20(py::module &);
|
||||||
void init_issues(py::module &);
|
void init_issues(py::module &);
|
||||||
|
|
||||||
#if defined(PYBIND11_TEST_EIGEN)
|
#if defined(PYBIND11_TEST_EIGEN)
|
||||||
@ -72,6 +73,7 @@ PYBIND11_PLUGIN(example) {
|
|||||||
init_ex_stl_binder_vector(m);
|
init_ex_stl_binder_vector(m);
|
||||||
init_ex_eval(m);
|
init_ex_eval(m);
|
||||||
init_ex_custom_exceptions(m);
|
init_ex_custom_exceptions(m);
|
||||||
|
init_ex20(m);
|
||||||
init_issues(m);
|
init_issues(m);
|
||||||
|
|
||||||
#if defined(PYBIND11_TEST_EIGEN)
|
#if defined(PYBIND11_TEST_EIGEN)
|
||||||
|
57
example/example20.cpp
Normal file
57
example/example20.cpp
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
example/example20.cpp -- Usage of structured numpy dtypes
|
||||||
|
|
||||||
|
Copyright (c) 2016 Ivan Smirnov
|
||||||
|
|
||||||
|
All rights reserved. Use of this source code is governed by a
|
||||||
|
BSD-style license that can be found in the LICENSE file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "example.h"
|
||||||
|
|
||||||
|
#include <pybind11/numpy.h>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
namespace py = pybind11;
|
||||||
|
|
||||||
|
struct Struct {
|
||||||
|
bool x;
|
||||||
|
uint32_t y;
|
||||||
|
float z;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PackedStruct {
|
||||||
|
bool x;
|
||||||
|
uint32_t y;
|
||||||
|
float z;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
struct NestedStruct {
|
||||||
|
Struct a;
|
||||||
|
PackedStruct b;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename S>
|
||||||
|
py::array_t<S> create_recarray(size_t n) {
|
||||||
|
auto arr = py::array(py::buffer_info(nullptr, sizeof(S),
|
||||||
|
py::format_descriptor<S>::value(),
|
||||||
|
1, { n }, { sizeof(S) }));
|
||||||
|
auto buf = arr.request();
|
||||||
|
auto ptr = static_cast<S*>(buf.ptr);
|
||||||
|
for (size_t i = 0; i < n; i++) {
|
||||||
|
ptr[i].x = i % 2;
|
||||||
|
ptr[i].y = i;
|
||||||
|
ptr[i].z = i * 1.5;
|
||||||
|
}
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_ex20(py::module &m) {
|
||||||
|
PYBIND11_DTYPE(Struct, x, y, z);
|
||||||
|
PYBIND11_DTYPE(PackedStruct, x, y, z);
|
||||||
|
PYBIND11_DTYPE(NestedStruct, a, b);
|
||||||
|
|
||||||
|
m.def("create_rec_simple", &create_recarray<Struct>);
|
||||||
|
m.def("create_rec_packed", &create_recarray<PackedStruct>);
|
||||||
|
}
|
19
example/example20.py
Normal file
19
example/example20.py
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
from example import create_rec_simple
|
||||||
|
|
||||||
|
|
||||||
|
def check_eq(arr, data, dtype):
|
||||||
|
np.testing.assert_equal(arr, np.array(data, dtype=dtype))
|
||||||
|
|
||||||
|
dtype = np.dtype({'names': ['x', 'y', 'z'],
|
||||||
|
'formats': ['?', 'u4', 'f4'],
|
||||||
|
'offsets': [0, 4, 8]})
|
||||||
|
base_dtype = np.dtype([('x', '?'), ('y', 'u4'), ('z', 'f4')])
|
||||||
|
|
||||||
|
arr = create_rec_simple(3)
|
||||||
|
assert arr.dtype == dtype
|
||||||
|
check_eq(arr, [(False, 0, 0.0), (True, 1, 1.5), (False, 2, 3.0)], dtype)
|
||||||
|
check_eq(arr, [(False, 0, 0.0), (True, 1, 1.5), (False, 2, 3.0)], base_dtype)
|
0
example/example20.ref
Normal file
0
example/example20.ref
Normal file
Loading…
Reference in New Issue
Block a user