mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-22 21:25:13 +00:00
Make buffer_info::as_pybuffer a memoryview ctor
This commit is contained in:
parent
41c3399021
commit
bf2510ee86
@ -232,30 +232,6 @@ struct buffer_info {
|
||||
if (view) { PyBuffer_Release(view); delete view; }
|
||||
}
|
||||
|
||||
Py_buffer& as_pybuffer() const {
|
||||
static Py_buffer buf { };
|
||||
// Py_buffer uses signed sizes, strides and shape!..
|
||||
static std::vector<Py_ssize_t> py_strides { };
|
||||
static std::vector<Py_ssize_t> py_shape { };
|
||||
buf.buf = ptr;
|
||||
buf.itemsize = (Py_ssize_t) itemsize;
|
||||
buf.format = const_cast<char *>(format.c_str());
|
||||
buf.ndim = (int) ndim;
|
||||
buf.len = (Py_ssize_t) size;
|
||||
py_strides.clear();
|
||||
py_shape.clear();
|
||||
for (size_t i = 0; i < ndim; ++i) {
|
||||
py_strides.push_back((Py_ssize_t) strides[i]);
|
||||
py_shape.push_back((Py_ssize_t) shape[i]);
|
||||
}
|
||||
buf.strides = py_strides.data();
|
||||
buf.shape = py_shape.data();
|
||||
buf.suboffsets = nullptr;
|
||||
buf.readonly = false;
|
||||
buf.internal = nullptr;
|
||||
return buf;
|
||||
}
|
||||
|
||||
private:
|
||||
Py_buffer *view = nullptr;
|
||||
};
|
||||
|
@ -572,10 +572,29 @@ public:
|
||||
|
||||
class memoryview : public object {
|
||||
public:
|
||||
memoryview(const buffer_info& info) : memoryview(&info.as_pybuffer()) { }
|
||||
memoryview(const buffer_info& info) {
|
||||
static Py_buffer buf { };
|
||||
// Py_buffer uses signed sizes, strides and shape!..
|
||||
static std::vector<Py_ssize_t> py_strides { };
|
||||
static std::vector<Py_ssize_t> py_shape { };
|
||||
buf.buf = info.ptr;
|
||||
buf.itemsize = (Py_ssize_t) info.itemsize;
|
||||
buf.format = const_cast<char *>(info.format.c_str());
|
||||
buf.ndim = (int) info.ndim;
|
||||
buf.len = (Py_ssize_t) info.size;
|
||||
py_strides.clear();
|
||||
py_shape.clear();
|
||||
for (size_t i = 0; i < info.ndim; ++i) {
|
||||
py_strides.push_back((Py_ssize_t) info.strides[i]);
|
||||
py_shape.push_back((Py_ssize_t) info.shape[i]);
|
||||
}
|
||||
buf.strides = py_strides.data();
|
||||
buf.shape = py_shape.data();
|
||||
buf.suboffsets = nullptr;
|
||||
buf.readonly = false;
|
||||
buf.internal = nullptr;
|
||||
|
||||
memoryview(Py_buffer* view)
|
||||
: object(PyMemoryView_FromBuffer(view), false) {
|
||||
m_ptr = PyMemoryView_FromBuffer(&buf);
|
||||
if (!m_ptr)
|
||||
pybind11_fail("Unable to create memoryview from buffer descriptor");
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user