20 auto ndim = shape.size();
21 std::vector<ssize_t> strides(ndim, itemsize);
23 for (
size_t i = ndim - 1;
i > 0; --
i)
24 strides[
i - 1] = strides[
i] * shape[
i];
29 inline std::vector<ssize_t>
f_strides(
const std::vector<ssize_t> &shape,
ssize_t itemsize) {
30 auto ndim = shape.size();
31 std::vector<ssize_t> strides(ndim, itemsize);
32 for (
size_t i = 1;
i < ndim; ++
i)
33 strides[
i] = strides[
i - 1] * shape[
i - 1];
48 bool readonly =
false;
53 detail::any_container<ssize_t> shape_in, detail::any_container<ssize_t> strides_in,
bool readonly=
false)
54 : ptr(ptr), itemsize(itemsize),
size(1), format(format), ndim(ndim),
55 shape(std::
move(shape_in)), strides(std::
move(strides_in)), readonly(readonly) {
56 if (ndim != (
ssize_t) shape.size() || ndim != (
ssize_t) strides.size())
57 pybind11_fail(
"buffer_info: ndim doesn't match shape and/or strides length");
58 for (
size_t i = 0;
i < (
size_t) ndim; ++
i)
63 buffer_info(T *ptr, detail::any_container<ssize_t> shape_in, detail::any_container<ssize_t> strides_in,
bool readonly=
false)
67 :
buffer_info(ptr, itemsize, format, 1, {
size}, {itemsize}, readonly) { }
78 :
buffer_info(view->buf, view->itemsize, view->format, view->ndim,
79 {view->shape, view->shape + view->ndim},
84 ? std::vector<ssize_t>(view->strides, view->strides + view->ndim)
88 this->ownview = ownview;
100 itemsize = rhs.itemsize;
106 std::swap(m_view, rhs.m_view);
107 std::swap(ownview, rhs.ownview);
108 readonly = rhs.readonly;
113 if (m_view && ownview) { PyBuffer_Release(m_view);
delete m_view; }
116 Py_buffer *
view()
const {
return m_view; }
117 Py_buffer *&
view() {
return m_view; }
119 struct private_ctr_tag { };
122 detail::any_container<ssize_t> &&shape_in, detail::any_container<ssize_t> &&strides_in,
bool readonly)
123 :
buffer_info(ptr, itemsize, format, ndim, std::
move(shape_in), std::
move(strides_in), readonly) { }
125 Py_buffer *m_view =
nullptr;
126 bool ownview =
false;