@@ -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,36 +72,55 @@ 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
this ->m_view = view;
95
119
this ->ownview = ownview;
96
120
}
97
121
98
122
buffer_info (const buffer_info &) = delete ;
99
- buffer_info& operator =(const buffer_info &) = delete ;
123
+ buffer_info & operator =(const buffer_info &) = delete ;
100
124
101
125
buffer_info (buffer_info &&other) noexcept { (*this ) = std::move (other); }
102
126
@@ -115,35 +139,51 @@ struct buffer_info {
115
139
}
116
140
117
141
~buffer_info () {
118
- if (m_view && ownview) { PyBuffer_Release (m_view); delete m_view; }
142
+ if (m_view && ownview) {
143
+ PyBuffer_Release (m_view);
144
+ delete m_view;
145
+ }
119
146
}
120
147
121
148
Py_buffer *view () const { return m_view; }
122
149
Py_buffer *&view () { return m_view; }
123
- private:
124
- struct private_ctr_tag { };
125
150
126
- buffer_info (private_ctr_tag, void *ptr, ssize_t itemsize, const std::string &format, ssize_t ndim,
127
- detail::any_container<ssize_t > &&shape_in, detail::any_container<ssize_t > &&strides_in, bool readonly)
128
- : buffer_info (ptr, itemsize, format, ndim, std::move (shape_in), std::move (strides_in), readonly) { }
151
+ private:
152
+ struct private_ctr_tag {};
153
+
154
+ buffer_info (private_ctr_tag,
155
+ void *ptr,
156
+ ssize_t itemsize,
157
+ const std::string &format,
158
+ ssize_t ndim,
159
+ detail::any_container<ssize_t > &&shape_in,
160
+ detail::any_container<ssize_t > &&strides_in,
161
+ bool readonly)
162
+ : buffer_info (
163
+ ptr, itemsize, format, ndim, std::move (shape_in), std::move (strides_in), readonly) {}
129
164
130
165
Py_buffer *m_view = nullptr ;
131
166
bool ownview = false ;
132
167
};
133
168
134
169
PYBIND11_NAMESPACE_BEGIN (detail)
135
170
136
- template <typename T, typename SFINAE = void> struct compare_buffer_info {
137
- static bool compare (const buffer_info& b) {
171
+ template <typename T, typename SFINAE = void>
172
+ struct compare_buffer_info {
173
+ static bool compare (const buffer_info &b) {
138
174
return b.format == format_descriptor<T>::format () && b.itemsize == (ssize_t ) sizeof (T);
139
175
}
140
176
};
141
177
142
- template <typename T> struct compare_buffer_info <T, detail::enable_if_t <std::is_integral<T>::value>> {
143
- static bool compare (const buffer_info& b) {
144
- return (size_t ) b.itemsize == sizeof (T) && (b.format == format_descriptor<T>::value ||
145
- ((sizeof (T) == sizeof (long )) && b.format == (std::is_unsigned<T>::value ? " L" : " l" )) ||
146
- ((sizeof (T) == sizeof (size_t )) && b.format == (std::is_unsigned<T>::value ? " N" : " n" )));
178
+ template <typename T>
179
+ struct compare_buffer_info <T, detail::enable_if_t <std::is_integral<T>::value>> {
180
+ static bool compare (const buffer_info &b) {
181
+ return (size_t ) b.itemsize == sizeof (T)
182
+ && (b.format == format_descriptor<T>::value
183
+ || ((sizeof (T) == sizeof (long ))
184
+ && b.format == (std::is_unsigned<T>::value ? " L" : " l" ))
185
+ || ((sizeof (T) == sizeof (size_t ))
186
+ && b.format == (std::is_unsigned<T>::value ? " N" : " n" )));
147
187
}
148
188
};
149
189
0 commit comments