diff --git a/include/pybind11/buffer_info.h b/include/pybind11/buffer_info.h index 08877ef30..6d1167d21 100644 --- a/include/pybind11/buffer_info.h +++ b/include/pybind11/buffer_info.h @@ -35,9 +35,17 @@ struct buffer_info { size *= shape[i]; } + template + buffer_info(T *ptr, detail::any_container shape_in, detail::any_container strides_in) + : buffer_info(private_ctr_tag(), ptr, sizeof(T), format_descriptor::format(), static_cast(shape_in->size()), std::move(shape_in), std::move(strides_in)) { } + buffer_info(void *ptr, ssize_t itemsize, const std::string &format, ssize_t size) : buffer_info(ptr, itemsize, format, 1, {size}, {itemsize}) { } + template + buffer_info(T *ptr, ssize_t size) + : buffer_info(ptr, sizeof(T), format_descriptor::format(), size) { } + explicit buffer_info(Py_buffer *view, bool ownview = true) : buffer_info(view->buf, view->itemsize, view->format, view->ndim, {view->shape, view->shape + view->ndim}, {view->strides, view->strides + view->ndim}) { @@ -70,6 +78,12 @@ struct buffer_info { } private: + struct private_ctr_tag { }; + + buffer_info(private_ctr_tag, void *ptr, ssize_t itemsize, const std::string &format, ssize_t ndim, + detail::any_container &&shape_in, detail::any_container &&strides_in) + : buffer_info(ptr, itemsize, format, ndim, std::move(shape_in), std::move(strides_in)) { } + Py_buffer *view = nullptr; bool ownview = false; }; diff --git a/tests/test_buffers.cpp b/tests/test_buffers.cpp index cbd234ffa..9e92e5dd9 100644 --- a/tests/test_buffers.cpp +++ b/tests/test_buffers.cpp @@ -136,9 +136,6 @@ test_initializer buffers([](py::module &m) { .def_buffer([](Matrix &m) -> py::buffer_info { return py::buffer_info( m.data(), /* Pointer to buffer */ - sizeof(float), /* Size of one scalar */ - py::format_descriptor::format(), /* Python struct-style format descriptor */ - 2, /* Number of dimensions */ { m.rows(), m.cols() }, /* Buffer dimensions */ { sizeof(float) * size_t(m.rows()), /* Strides (in bytes) for each index */ sizeof(float) }