@@ -22,33 +22,38 @@ struct buffer_info {
22
22
ssize_t ndim = 0 ; // Number of dimensions
23
23
std::vector<ssize_t > shape; // Shape of the tensor (1 entry per dimension)
24
24
std::vector<ssize_t > strides; // Number of bytes between adjacent entries (for each per dimension)
25
+ bool readonly = false ; // flag to indicate if the underlying storage may be written to
25
26
26
27
buffer_info () { }
27
28
28
29
buffer_info (void *ptr, ssize_t itemsize, const std::string &format, ssize_t ndim,
29
- detail::any_container<ssize_t > shape_in, detail::any_container<ssize_t > strides_in)
30
+ detail::any_container<ssize_t > shape_in, detail::any_container<ssize_t > strides_in, bool readonly= false )
30
31
: ptr (ptr), itemsize (itemsize), size (1 ), format (format), ndim (ndim),
31
- shape (std::move (shape_in)), strides (std::move (strides_in)) {
32
+ shape (std::move (shape_in)), strides (std::move (strides_in)), readonly (readonly) {
32
33
if (ndim != (ssize_t ) shape.size () || ndim != (ssize_t ) strides.size ())
33
34
pybind11_fail (" buffer_info: ndim doesn't match shape and/or strides length" );
34
35
for (size_t i = 0 ; i < (size_t ) ndim; ++i)
35
36
size *= shape[i];
36
37
}
37
38
38
39
template <typename T>
39
- buffer_info (T *ptr, detail::any_container<ssize_t > shape_in, detail::any_container<ssize_t > strides_in)
40
- : buffer_info (private_ctr_tag (), ptr, sizeof (T), format_descriptor<T>::format (), static_cast <ssize_t >(shape_in->size ()), std::move (shape_in), std::move (strides_in)) { }
40
+ buffer_info (T *ptr, detail::any_container<ssize_t > shape_in, detail::any_container<ssize_t > strides_in, bool readonly= false )
41
+ : buffer_info (private_ctr_tag (), ptr, sizeof (T), format_descriptor<T>::format (), static_cast <ssize_t >(shape_in->size ()), std::move (shape_in), std::move (strides_in), readonly ) { }
41
42
42
- buffer_info (void *ptr, ssize_t itemsize, const std::string &format, ssize_t size)
43
- : buffer_info (ptr, itemsize, format, 1 , {size}, {itemsize}) { }
43
+ buffer_info (void *ptr, ssize_t itemsize, const std::string &format, ssize_t size, bool readonly= false )
44
+ : buffer_info (ptr, itemsize, format, 1 , {size}, {itemsize}, readonly ) { }
44
45
45
46
template <typename T>
46
- buffer_info (T *ptr, ssize_t size)
47
- : buffer_info (ptr, sizeof (T), format_descriptor<T>::format (), size) { }
47
+ buffer_info (T *ptr, ssize_t size, bool readonly=false )
48
+ : buffer_info (ptr, sizeof (T), format_descriptor<T>::format (), size, readonly) { }
49
+
50
+ template <typename T>
51
+ buffer_info (const T *ptr, ssize_t size, bool readonly=true )
52
+ : buffer_info (const_cast <T*>(ptr), sizeof (T), format_descriptor<T>::format (), size, readonly) { }
48
53
49
54
explicit buffer_info (Py_buffer *view, bool ownview = true )
50
55
: buffer_info (view->buf , view->itemsize , view->format , view->ndim ,
51
- {view->shape , view->shape + view->ndim }, {view->strides , view->strides + view->ndim }) {
56
+ {view->shape , view->shape + view->ndim }, {view->strides , view->strides + view->ndim }, view-> readonly ) {
52
57
this ->view = view;
53
58
this ->ownview = ownview;
54
59
}
@@ -70,6 +75,7 @@ struct buffer_info {
70
75
strides = std::move (rhs.strides );
71
76
std::swap (view, rhs.view );
72
77
std::swap (ownview, rhs.ownview );
78
+ readonly = rhs.readonly ;
73
79
return *this ;
74
80
}
75
81
@@ -81,8 +87,8 @@ struct buffer_info {
81
87
struct private_ctr_tag { };
82
88
83
89
buffer_info (private_ctr_tag, void *ptr, ssize_t itemsize, const std::string &format, ssize_t ndim,
84
- detail::any_container<ssize_t > &&shape_in, detail::any_container<ssize_t > &&strides_in)
85
- : buffer_info (ptr, itemsize, format, ndim, std::move (shape_in), std::move (strides_in)) { }
90
+ detail::any_container<ssize_t > &&shape_in, detail::any_container<ssize_t > &&strides_in, bool readonly )
91
+ : buffer_info (ptr, itemsize, format, ndim, std::move (shape_in), std::move (strides_in), readonly ) { }
86
92
87
93
Py_buffer *view = nullptr ;
88
94
bool ownview = false ;
0 commit comments