@@ -38,58 +38,67 @@ PYBIND11_NAMESPACE_END(detail)
38
38
39
39
// / Information record describing a Python buffer object
40
40
struct buffer_info {
41
- void *ptr = nullptr ; // Pointer to the underlying storage
42
- ssize_t itemsize = 0 ; // Size of individual items in bytes
43
- ssize_t size = 0 ; // Total number of entries
44
- std::string format; // For homogeneous buffers, this should be set to format_descriptor<T>::format()
45
- ssize_t ndim = 0 ; // Number of dimensions
46
- std::vector<ssize_t > shape; // Shape of the tensor (1 entry per dimension)
47
- std::vector<ssize_t > strides; // Number of bytes between adjacent entries (for each per dimension)
48
- bool readonly = false ; // flag to indicate if the underlying storage may be written to
41
+ void *ptr = nullptr ; // Pointer to the underlying storage
42
+ ssize_t itemsize = 0 ; // Size of individual items in bytes
43
+ ssize_t size = 0 ; // Total number of entries
44
+ std::string
45
+ format; // For homogeneous buffers, this should be set to format_descriptor<T>::format()
46
+ ssize_t ndim = 0 ; // Number of dimensions
47
+ std::vector<ssize_t > shape; // Shape of the tensor (1 entry per dimension)
48
+ std::vector<ssize_t >
49
+ strides; // Number of bytes between adjacent entries (for each per dimension)
50
+ bool readonly = false ; // flag to indicate if the underlying storage may be written to
49
51
50
52
buffer_info () = default ;
51
53
52
54
buffer_info (void *ptr, ssize_t itemsize, const std::string &format, ssize_t ndim,
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 ())
55
+ detail::any_container<ssize_t > shape_in, detail::any_container<ssize_t > strides_in,
56
+ bool readonly = false )
57
+ : ptr (ptr), itemsize (itemsize), size (1 ), format (format), ndim (ndim),
58
+ shape (std::move (shape_in)), strides (std::move (strides_in)), readonly (readonly) {
59
+ if (ndim != (ssize_t )shape.size () || ndim != (ssize_t )strides.size ())
57
60
pybind11_fail (" buffer_info: ndim doesn't match shape and/or strides length" );
58
- for (size_t i = 0 ; i < (size_t ) ndim; ++i)
61
+ for (size_t i = 0 ; i < (size_t )ndim; ++i)
59
62
size *= shape[i];
60
63
}
61
64
62
65
template <typename T>
63
- buffer_info (T *ptr, detail::any_container<ssize_t > shape_in, detail::any_container<ssize_t > strides_in, bool readonly=false )
64
- : 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) { }
66
+ buffer_info (T *ptr, detail::any_container<ssize_t > shape_in,
67
+ detail::any_container<ssize_t > strides_in, bool readonly = false )
68
+ : buffer_info (private_ctr_tag (), ptr, sizeof (T), format_descriptor<T>::format (),
69
+ static_cast <ssize_t >(shape_in->size ()), std::move (shape_in),
70
+ std::move (strides_in), readonly) {}
65
71
66
- buffer_info (void *ptr, ssize_t itemsize, const std::string &format, ssize_t size, bool readonly=false )
67
- : buffer_info (ptr, itemsize, format, 1 , {size}, {itemsize}, readonly) { }
72
+ buffer_info (void *ptr, ssize_t itemsize, const std::string &format, ssize_t size,
73
+ bool readonly = false )
74
+ : buffer_info (ptr, itemsize, format, 1 , {size}, {itemsize}, readonly) {}
68
75
69
76
template <typename T>
70
- buffer_info (T *ptr, ssize_t size, bool readonly= false )
71
- : buffer_info (ptr, sizeof (T), format_descriptor<T>::format (), size, readonly) { }
77
+ buffer_info (T *ptr, ssize_t size, bool readonly = false )
78
+ : buffer_info (ptr, sizeof (T), format_descriptor<T>::format (), size, readonly) {}
72
79
73
80
template <typename T>
74
- buffer_info (const T *ptr, ssize_t size, bool readonly=true )
75
- : buffer_info (const_cast <T*>(ptr), sizeof (T), format_descriptor<T>::format (), size, readonly) { }
81
+ buffer_info (const T *ptr, ssize_t size, bool readonly = true )
82
+ : buffer_info (const_cast <T *>(ptr), sizeof (T), format_descriptor<T>::format (), size,
83
+ readonly) {}
76
84
77
85
explicit buffer_info (Py_buffer *view, bool ownview = true )
78
- : buffer_info (view->buf , view->itemsize , view->format , view->ndim ,
79
- {view->shape , view->shape + view->ndim },
80
- /* Though buffer::request() requests PyBUF_STRIDES, ctypes objects
81
- * ignore this flag and return a view with NULL strides.
82
- * When strides are NULL, build them manually. */
83
- view->strides
84
- ? std::vector<ssize_t >(view->strides , view->strides + view->ndim )
85
- : detail::c_strides ({view->shape , view->shape + view->ndim }, view->itemsize ),
86
- view->readonly ) {
86
+ : buffer_info (
87
+ view->buf , view->itemsize , view->format , view->ndim ,
88
+ {view->shape , view->shape + view->ndim },
89
+ /* Though buffer::request() requests PyBUF_STRIDES, ctypes objects
90
+ * ignore this flag and return a view with NULL strides.
91
+ * When strides are NULL, build them manually. */
92
+ view->strides
93
+ ? std::vector<ssize_t >(view->strides , view->strides + view->ndim )
94
+ : detail::c_strides ({view->shape , view->shape + view->ndim }, view->itemsize ),
95
+ view->readonly ) {
87
96
this ->m_view = view;
88
97
this ->ownview = ownview;
89
98
}
90
99
91
100
buffer_info (const buffer_info &) = delete ;
92
- buffer_info& operator =(const buffer_info &) = delete ;
101
+ buffer_info & operator =(const buffer_info &) = delete ;
93
102
94
103
buffer_info (buffer_info &&other) noexcept { (*this ) = std::move (other); }
95
104
@@ -108,17 +117,23 @@ struct buffer_info {
108
117
}
109
118
110
119
~buffer_info () {
111
- if (m_view && ownview) { PyBuffer_Release (m_view); delete m_view; }
120
+ if (m_view && ownview) {
121
+ PyBuffer_Release (m_view);
122
+ delete m_view;
123
+ }
112
124
}
113
125
114
126
Py_buffer *view () const { return m_view; }
115
127
Py_buffer *&view () { return m_view; }
128
+
116
129
private:
117
- struct private_ctr_tag { };
130
+ struct private_ctr_tag {};
118
131
119
- buffer_info (private_ctr_tag, void *ptr, ssize_t itemsize, const std::string &format, ssize_t ndim,
120
- detail::any_container<ssize_t > &&shape_in, detail::any_container<ssize_t > &&strides_in, bool readonly)
121
- : buffer_info (ptr, itemsize, format, ndim, std::move (shape_in), std::move (strides_in), readonly) { }
132
+ buffer_info (private_ctr_tag, void *ptr, ssize_t itemsize, const std::string &format,
133
+ ssize_t ndim, detail::any_container<ssize_t > &&shape_in,
134
+ detail::any_container<ssize_t > &&strides_in, bool readonly)
135
+ : buffer_info (ptr, itemsize, format, ndim, std::move (shape_in), std::move (strides_in),
136
+ readonly) {}
122
137
123
138
Py_buffer *m_view = nullptr ;
124
139
bool ownview = false ;
@@ -127,16 +142,20 @@ struct buffer_info {
127
142
PYBIND11_NAMESPACE_BEGIN (detail)
128
143
129
144
template <typename T, typename SFINAE = void> struct compare_buffer_info {
130
- static bool compare (const buffer_info& b) {
131
- return b.format == format_descriptor<T>::format () && b.itemsize == (ssize_t ) sizeof (T);
145
+ static bool compare (const buffer_info & b) {
146
+ return b.format == format_descriptor<T>::format () && b.itemsize == (ssize_t )sizeof (T);
132
147
}
133
148
};
134
149
135
- template <typename T> struct compare_buffer_info <T, detail::enable_if_t <std::is_integral<T>::value>> {
136
- static bool compare (const buffer_info& b) {
137
- return (size_t ) b.itemsize == sizeof (T) && (b.format == format_descriptor<T>::value ||
138
- ((sizeof (T) == sizeof (long )) && b.format == (std::is_unsigned<T>::value ? " L" : " l" )) ||
139
- ((sizeof (T) == sizeof (size_t )) && b.format == (std::is_unsigned<T>::value ? " N" : " n" )));
150
+ template <typename T>
151
+ struct compare_buffer_info <T, detail::enable_if_t <std::is_integral<T>::value>> {
152
+ static bool compare (const buffer_info &b) {
153
+ return (size_t )b.itemsize == sizeof (T) &&
154
+ (b.format == format_descriptor<T>::value ||
155
+ ((sizeof (T) == sizeof (long )) &&
156
+ b.format == (std::is_unsigned<T>::value ? " L" : " l" )) ||
157
+ ((sizeof (T) == sizeof (size_t )) &&
158
+ b.format == (std::is_unsigned<T>::value ? " N" : " n" )));
140
159
}
141
160
};
142
161
0 commit comments