|
20 | 20 | //! as an internal buffer in an [`ArrayData`](crate::array::ArrayData) |
21 | 21 | //! object. |
22 | 22 |
|
| 23 | +// use core::slice::SlicePattern; |
23 | 24 | use std::any::Any; |
24 | 25 | use std::collections::HashMap; |
25 | 26 | use std::fmt; |
@@ -86,6 +87,12 @@ pub struct BufferBuilder<T: ArrowNativeType> { |
86 | 87 | _marker: PhantomData<T>, |
87 | 88 | } |
88 | 89 |
|
| 90 | +impl<T: ArrowNativeType> Default for BufferBuilder<T> { |
| 91 | + fn default() -> Self { |
| 92 | + Self::new(0) |
| 93 | + } |
| 94 | +} |
| 95 | + |
89 | 96 | impl<T: ArrowNativeType> BufferBuilder<T> { |
90 | 97 | /// Creates a new builder with initial capacity for _at least_ `capacity` |
91 | 98 | /// elements of type `T`. |
@@ -134,6 +141,16 @@ impl<T: ArrowNativeType> BufferBuilder<T> { |
134 | 141 | self.len |
135 | 142 | } |
136 | 143 |
|
| 144 | + #[allow(missing_docs)] |
| 145 | + pub fn typed_data_mut(&mut self) -> &mut [T] { |
| 146 | + // TODO: Make faster. |
| 147 | + unsafe { |
| 148 | + let (_prefix, offsets, _suffix) = |
| 149 | + self.buffer.as_slice_mut().align_to_mut::<T>(); |
| 150 | + offsets |
| 151 | + } |
| 152 | + } |
| 153 | + |
137 | 154 | /// Returns whether the internal buffer is empty. |
138 | 155 | /// |
139 | 156 | /// # Example: |
@@ -297,11 +314,23 @@ impl BooleanBufferBuilder { |
297 | 314 | Self { buffer, len: 0 } |
298 | 315 | } |
299 | 316 |
|
| 317 | + #[inline] |
| 318 | + pub fn new_from_buffer(buffer: MutableBuffer, len: usize) -> BooleanBufferBuilder { |
| 319 | + assert_eq!(len.div_ceil(8), buffer.len()); |
| 320 | + Self { buffer, len } |
| 321 | + } |
| 322 | + |
300 | 323 | #[inline] |
301 | 324 | pub fn len(&self) -> usize { |
302 | 325 | self.len |
303 | 326 | } |
304 | 327 |
|
| 328 | + #[inline] |
| 329 | + pub fn get_bit(&self, index: usize) -> bool { |
| 330 | + bit_util::get_bit(self.buffer.as_ref(), index) |
| 331 | + } |
| 332 | + |
| 333 | + // TODO: Probably, make set_bit be branchless |
305 | 334 | #[inline] |
306 | 335 | pub fn set_bit(&mut self, index: usize, v: bool) { |
307 | 336 | if v { |
@@ -382,6 +411,12 @@ impl BooleanBufferBuilder { |
382 | 411 | self.len = 0; |
383 | 412 | buf.into() |
384 | 413 | } |
| 414 | + |
| 415 | + #[inline] |
| 416 | + /// Builds the [Buffer] without resetting the builder. |
| 417 | + pub fn finish_cloned(&self) -> Buffer { |
| 418 | + Buffer::from_slice_ref(&self.buffer.as_slice()) |
| 419 | + } |
385 | 420 | } |
386 | 421 |
|
387 | 422 | impl From<BooleanBufferBuilder> for Buffer { |
|
0 commit comments