Make buffer_info::as_pybuffer a memoryview ctor

This commit is contained in:
Ivan Smirnov 2016-07-18 22:24:53 +01:00
parent 41c3399021
commit bf2510ee86
2 changed files with 22 additions and 27 deletions

View File

@ -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;
}; };

View File

@ -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");
} }