@@ -185,6 +185,48 @@ def __setitem__(self, key: Any, value: Any) -> None:
185
185
self ._data .__setitem__ (key , value )
186
186
187
187
188
+ class DelayedBuffer (Buffer ):
189
+ """
190
+ A Buffer that is the virtual concatenation of other buffers.
191
+ """
192
+
193
+ def __init__ (self , array : NDArrayLike | list [NDArrayLike ] | None ) -> None :
194
+ if array is None :
195
+ self ._data_list = []
196
+ elif isinstance (array , list ):
197
+ self ._data_list = list (array )
198
+ else :
199
+ self ._data_list = [array ]
200
+ for array in self ._data_list :
201
+ if array .ndim != 1 :
202
+ raise ValueError ("array: only 1-dim allowed" )
203
+ if array .dtype != np .dtype ("b" ):
204
+ raise ValueError ("array: only byte dtype allowed" )
205
+
206
+ @property
207
+ def _data (self ) -> npt .NDArray [Any ]:
208
+ return np .concatenate (self ._data_list )
209
+
210
+ @classmethod
211
+ def from_buffer (cls , buffer : core .Buffer ) -> Self :
212
+ if isinstance (buffer , cls ):
213
+ return cls (buffer ._data_list )
214
+ else :
215
+ return cls (buffer ._data )
216
+
217
+ def __add__ (self , other : core .Buffer ) -> Self :
218
+ if isinstance (other , self .__class__ ):
219
+ return self .__class__ (self ._data_list + other ._data_list )
220
+ else :
221
+ return self .__class__ (self ._data_list + [other ._data ])
222
+
223
+ def __len__ (self ) -> int :
224
+ return sum (map (len , self ._data_list ))
225
+
226
+
227
+ Buffer .Delayed = DelayedBuffer
228
+
229
+
188
230
def as_numpy_array_wrapper (
189
231
func : Callable [[npt .NDArray [Any ]], bytes ], buf : core .Buffer , prototype : core .BufferPrototype
190
232
) -> core .Buffer :
0 commit comments