@@ -44,8 +44,8 @@ struct buffer_info {
44
44
void *ptr = nullptr ; // Pointer to the underlying storage
45
45
ssize_t itemsize = 0 ; // Size of individual items in bytes
46
46
ssize_t size = 0 ; // Total number of entries
47
- std::string format; // For homogeneous buffers, this should be set to
48
- // format_descriptor<T>::format()
47
+ std::string format; // For homogeneous buffers, this should be set to
48
+ // format_descriptor<T>::format()
49
49
ssize_t ndim = 0 ; // Number of dimensions
50
50
std::vector<ssize_t > shape; // Shape of the tensor (1 entry per dimension)
51
51
std::vector<ssize_t > strides; // Number of bytes between adjacent entries
@@ -54,10 +54,15 @@ struct buffer_info {
54
54
55
55
buffer_info () = default ;
56
56
57
- buffer_info (void *ptr, ssize_t itemsize, const std::string &format, ssize_t ndim,
58
- detail::any_container<ssize_t > shape_in, detail::any_container<ssize_t > strides_in, bool readonly=false )
59
- : ptr (ptr), itemsize (itemsize), size (1 ), format (format), ndim (ndim),
60
- shape (std::move (shape_in)), strides (std::move (strides_in)), readonly (readonly) {
57
+ buffer_info (void *ptr,
58
+ ssize_t itemsize,
59
+ const std::string &format,
60
+ ssize_t ndim,
61
+ detail::any_container<ssize_t > shape_in,
62
+ detail::any_container<ssize_t > strides_in,
63
+ bool readonly = false )
64
+ : ptr (ptr), itemsize (itemsize), size (1 ), format (format), ndim (ndim),
65
+ shape (std::move (shape_in)), strides (std::move (strides_in)), readonly (readonly) {
61
66
if (ndim != (ssize_t ) shape.size () || ndim != (ssize_t ) strides.size ()) {
62
67
pybind11_fail (" buffer_info: ndim doesn't match shape and/or strides length" );
63
68
}
@@ -67,29 +72,48 @@ struct buffer_info {
67
72
}
68
73
69
74
template <typename T>
70
- buffer_info (T *ptr, detail::any_container<ssize_t > shape_in, detail::any_container<ssize_t > strides_in, bool readonly=false )
71
- : 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) { }
72
-
73
- buffer_info (void *ptr, ssize_t itemsize, const std::string &format, ssize_t size, bool readonly=false )
74
- : buffer_info (ptr, itemsize, format, 1 , {size}, {itemsize}, readonly) { }
75
+ buffer_info (T *ptr,
76
+ detail::any_container<ssize_t > shape_in,
77
+ detail::any_container<ssize_t > strides_in,
78
+ bool readonly = false )
79
+ : buffer_info (private_ctr_tag (),
80
+ ptr,
81
+ sizeof (T),
82
+ format_descriptor<T>::format (),
83
+ static_cast <ssize_t >(shape_in->size ()),
84
+ std::move (shape_in),
85
+ std::move (strides_in),
86
+ readonly) {}
87
+
88
+ buffer_info (void *ptr,
89
+ ssize_t itemsize,
90
+ const std::string &format,
91
+ ssize_t size,
92
+ bool readonly = false )
93
+ : buffer_info (ptr, itemsize, format, 1 , {size}, {itemsize}, readonly) {}
75
94
76
95
template <typename T>
77
- buffer_info (T *ptr, ssize_t size, bool readonly= false )
78
- : buffer_info (ptr, sizeof (T), format_descriptor<T>::format (), size, readonly) { }
96
+ buffer_info (T *ptr, ssize_t size, bool readonly = false )
97
+ : buffer_info (ptr, sizeof (T), format_descriptor<T>::format (), size, readonly) {}
79
98
80
99
template <typename T>
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, readonly) { }
100
+ buffer_info (const T *ptr, ssize_t size, bool readonly = true )
101
+ : buffer_info (
102
+ const_cast <T *>(ptr), sizeof (T), format_descriptor<T>::format (), size, readonly) {}
83
103
84
104
explicit buffer_info (Py_buffer *view, bool ownview = true )
85
- : buffer_info (view->buf , view->itemsize , view->format , view->ndim ,
105
+ : buffer_info (
106
+ view->buf ,
107
+ view->itemsize ,
108
+ view->format ,
109
+ view->ndim ,
86
110
{view->shape , view->shape + view->ndim },
87
111
/* Though buffer::request() requests PyBUF_STRIDES, ctypes objects
88
112
* ignore this flag and return a view with NULL strides.
89
113
* When strides are NULL, build them manually. */
90
114
view->strides
91
- ? std::vector<ssize_t >(view->strides , view->strides + view->ndim )
92
- : detail::c_strides ({view->shape , view->shape + view->ndim }, view->itemsize ),
115
+ ? std::vector<ssize_t >(view->strides , view->strides + view->ndim )
116
+ : detail::c_strides ({view->shape , view->shape + view->ndim }, view->itemsize ),
93
117
(view->readonly != 0 )) {
94
118
// NOLINTNEXTLINE(cppcoreguidelines-prefer-member-initializer)
95
119
this ->m_view = view;
@@ -98,7 +122,7 @@ struct buffer_info {
98
122
}
99
123
100
124
buffer_info (const buffer_info &) = delete ;
101
- buffer_info& operator =(const buffer_info &) = delete ;
125
+ buffer_info & operator =(const buffer_info &) = delete ;
102
126
103
127
buffer_info (buffer_info &&other) noexcept { (*this ) = std::move (other); }
104
128
@@ -117,35 +141,51 @@ struct buffer_info {
117
141
}
118
142
119
143
~buffer_info () {
120
- if (m_view && ownview) { PyBuffer_Release (m_view); delete m_view; }
144
+ if (m_view && ownview) {
145
+ PyBuffer_Release (m_view);
146
+ delete m_view;
147
+ }
121
148
}
122
149
123
150
Py_buffer *view () const { return m_view; }
124
151
Py_buffer *&view () { return m_view; }
125
- private:
126
- struct private_ctr_tag { };
127
152
128
- buffer_info (private_ctr_tag, void *ptr, ssize_t itemsize, const std::string &format, ssize_t ndim,
129
- detail::any_container<ssize_t > &&shape_in, detail::any_container<ssize_t > &&strides_in, bool readonly)
130
- : buffer_info (ptr, itemsize, format, ndim, std::move (shape_in), std::move (strides_in), readonly) { }
153
+ private:
154
+ struct private_ctr_tag {};
155
+
156
+ buffer_info (private_ctr_tag,
157
+ void *ptr,
158
+ ssize_t itemsize,
159
+ const std::string &format,
160
+ ssize_t ndim,
161
+ detail::any_container<ssize_t > &&shape_in,
162
+ detail::any_container<ssize_t > &&strides_in,
163
+ bool readonly)
164
+ : buffer_info (
165
+ ptr, itemsize, format, ndim, std::move (shape_in), std::move (strides_in), readonly) {}
131
166
132
167
Py_buffer *m_view = nullptr ;
133
168
bool ownview = false ;
134
169
};
135
170
136
171
PYBIND11_NAMESPACE_BEGIN (detail)
137
172
138
- template <typename T, typename SFINAE = void> struct compare_buffer_info {
139
- static bool compare (const buffer_info& b) {
173
+ template <typename T, typename SFINAE = void>
174
+ struct compare_buffer_info {
175
+ static bool compare (const buffer_info &b) {
140
176
return b.format == format_descriptor<T>::format () && b.itemsize == (ssize_t ) sizeof (T);
141
177
}
142
178
};
143
179
144
- template <typename T> struct compare_buffer_info <T, detail::enable_if_t <std::is_integral<T>::value>> {
145
- static bool compare (const buffer_info& b) {
146
- return (size_t ) b.itemsize == sizeof (T) && (b.format == format_descriptor<T>::value ||
147
- ((sizeof (T) == sizeof (long )) && b.format == (std::is_unsigned<T>::value ? " L" : " l" )) ||
148
- ((sizeof (T) == sizeof (size_t )) && b.format == (std::is_unsigned<T>::value ? " N" : " n" )));
180
+ template <typename T>
181
+ struct compare_buffer_info <T, detail::enable_if_t <std::is_integral<T>::value>> {
182
+ static bool compare (const buffer_info &b) {
183
+ return (size_t ) b.itemsize == sizeof (T)
184
+ && (b.format == format_descriptor<T>::value
185
+ || ((sizeof (T) == sizeof (long ))
186
+ && b.format == (std::is_unsigned<T>::value ? " L" : " l" ))
187
+ || ((sizeof (T) == sizeof (size_t ))
188
+ && b.format == (std::is_unsigned<T>::value ? " N" : " n" )));
149
189
}
150
190
};
151
191
0 commit comments