mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-30 08:57:11 +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; }
|
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:
|
private:
|
||||||
Py_buffer *view = nullptr;
|
Py_buffer *view = nullptr;
|
||||||
};
|
};
|
||||||
|
@ -572,10 +572,29 @@ public:
|
|||||||
|
|
||||||
class memoryview : public object {
|
class memoryview : public object {
|
||||||
public:
|
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)
|
m_ptr = PyMemoryView_FromBuffer(&buf);
|
||||||
: object(PyMemoryView_FromBuffer(view), false) {
|
|
||||||
if (!m_ptr)
|
if (!m_ptr)
|
||||||
pybind11_fail("Unable to create memoryview from buffer descriptor");
|
pybind11_fail("Unable to create memoryview from buffer descriptor");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user