pub struct BooleanBuffer { /* private fields */ }Expand description
A slice-able Buffer containing bit-packed booleans
This structure represents a sequence of boolean values packed into a
byte-aligned Buffer. Both the offset and length are represented in bits.
§Layout
The values are represented as little endian bit-packed values, where the least significant bit of each byte represents the first boolean value and then proceeding to the most significant bit.
For example, the 10 bit bitmask 0b0111001101 has length 10, and is
represented using 2 bytes with offset 0 like this:
┌─────────────────────────────────┐ ┌─────────────────────────────────┐
│┌───┬───┬───┬───┬───┬───┬───┬───┐│ │┌───┬───┬───┬───┬───┬───┬───┬───┐│
││ 1 │ 0 │ 1 │ 1 │ 0 │ 0 │ 1 │ 1 ││ ││ 1 │ 0 │ ? │ ? │ ? │ ? │ ? │ ? ││
│└───┴───┴───┴───┴───┴───┴───┴───┘│ │└───┴───┴───┴───┴───┴───┴───┴───┘│
bit └─────────────────────────────────┘ └─────────────────────────────────┘
offset 0 Byte 0 7 0 Byte 1 7
length = 10 bits, offset = 0The same bitmask with length 10 and offset 3 would be represented using 2 bytes like this:
┌─────────────────────────────────┐ ┌─────────────────────────────────┐
│┌───┬───┬───┬───┬───┬───┬───┬───┐│ │┌───┬───┬───┬───┬───┬───┬───┬───┐│
││ ? │ ? │ ? │ 1 │ 0 │ 1 │ 1 │ 0 ││ ││ 0 │ 1 │ 1 │ 1 │ 0 │ ? │ ? │ ? ││
│└───┴───┴───┴───┴───┴───┴───┴───┘│ │└───┴───┴───┴───┴───┴───┴───┴───┘│
bit └─────────────────────────────────┘ └─────────────────────────────────┘
offset 0 Byte 0 7 0 Byte 1 7
length = 10 bits, offset = 3Note that the bits marked ? are not logically part of the mask and may
contain either 0 or 1
§See Also
BooleanBufferBuilderfor buildingBooleanBufferinstancesNullBufferfor representing null values in Arrow arrays
Implementations§
Source§impl BooleanBuffer
impl BooleanBuffer
Sourcepub fn new(buffer: Buffer, bit_offset: usize, bit_len: usize) -> BooleanBuffer
pub fn new(buffer: Buffer, bit_offset: usize, bit_len: usize) -> BooleanBuffer
Create a new BooleanBuffer from a Buffer, bit_offset offset and bit_len length
§Panics
This method will panic if buffer is not large enough
Sourcepub fn new_set(length: usize) -> BooleanBuffer
pub fn new_set(length: usize) -> BooleanBuffer
Create a new BooleanBuffer of length bits (not bytes) where all values are true
Sourcepub fn new_unset(length: usize) -> BooleanBuffer
pub fn new_unset(length: usize) -> BooleanBuffer
Create a new BooleanBuffer of length bits (not bytes) where all values are false
Sourcepub fn collect_bool<F>(len: usize, f: F) -> BooleanBuffer
pub fn collect_bool<F>(len: usize, f: F) -> BooleanBuffer
Invokes f with indexes 0..len collecting the boolean results into a new BooleanBuffer
Sourcepub fn from_bits(
src: impl AsRef<[u8]>,
offset_in_bits: usize,
len_in_bits: usize,
) -> BooleanBuffer
pub fn from_bits( src: impl AsRef<[u8]>, offset_in_bits: usize, len_in_bits: usize, ) -> BooleanBuffer
Create a new BooleanBuffer by copying the relevant bits from an
input buffer.
§Notes:
- The new
BooleanBuffermay have non zero offset and/or padding bits outside the logical range.
§Example: Create a new BooleanBuffer copying a bit slice from in input slice
let input = [0b11001100u8, 0b10111010u8];
// // Copy bits 4..16 from input
let result = BooleanBuffer::from_bits(&input, 4, 12);
// output is 12 bits long starting from bit offset 4
assert_eq!(result.len(), 12);
assert_eq!(result.offset(), 4);
// the expected 12 bits are 0b101110101100 (bits 4..16 of the input)
let expected_bits = [false, false, true, true, false, true, false, true, true, true, false, true];
for (i, v) in expected_bits.into_iter().enumerate() {
assert_eq!(result.value(i), v);
}
// However, underlying buffer has (ignored) bits set outside the requested range
assert_eq!(result.values(), &[0b11001100u8, 0b10111010, 0, 0, 0, 0, 0, 0]);Sourcepub fn from_bitwise_unary_op<F>(
src: impl AsRef<[u8]>,
offset_in_bits: usize,
len_in_bits: usize,
op: F,
) -> BooleanBuffer
pub fn from_bitwise_unary_op<F>( src: impl AsRef<[u8]>, offset_in_bits: usize, len_in_bits: usize, op: F, ) -> BooleanBuffer
Create a new BooleanBuffer by applying the bitwise operation to op
to an input buffer.
This function is faster than applying the operation bit by bit as it processes input buffers in chunks of 64 bits (8 bytes) at a time
§Notes:
optakes a singleu64inputs and produces oneu64output.opmust only apply bitwise operations on the relevant bits; the inputu64may contain irrelevant bits and may be processed differently on different endian architectures.opmay be called with input bits outside the requested range- Returned
BooleanBuffermay have non zero offset - Returned
BooleanBuffermay have bits set outside the requested range
§See Also
BooleanBuffer::from_bitwise_binary_opto create a new buffer from a binary operationapply_bitwise_unary_opfor in-place unary bitwise operations
§Example: Create new BooleanBuffer from bitwise NOT
let input = [0b11001100u8, 0b10111010u8]; // 2 bytes = 16 bits
// NOT of bits 4..16
let result = BooleanBuffer::from_bitwise_unary_op(
&input, 4, 12, |a| !a
);
// output is 12 bits long starting from bit offset 4
assert_eq!(result.len(), 12);
assert_eq!(result.offset(), 4);
// the expected 12 bits are 0b001100110101, (NOT of the requested bits)
let expected_bits = [true, true, false, false, true, false, true, false, false, false, true, false];
for (i, v) in expected_bits.into_iter().enumerate() {
assert_eq!(result.value(i), v);
}
// However, underlying buffer has (ignored) bits set outside the requested range
let expected = [0b00110011u8, 0b01000101u8, 255, 255, 255, 255, 255, 255];
assert_eq!(result.values(), &expected);Sourcepub fn from_bitwise_binary_op<F>(
left: impl AsRef<[u8]>,
left_offset_in_bits: usize,
right: impl AsRef<[u8]>,
right_offset_in_bits: usize,
len_in_bits: usize,
op: F,
) -> BooleanBuffer
pub fn from_bitwise_binary_op<F>( left: impl AsRef<[u8]>, left_offset_in_bits: usize, right: impl AsRef<[u8]>, right_offset_in_bits: usize, len_in_bits: usize, op: F, ) -> BooleanBuffer
Create a new BooleanBuffer by applying the bitwise operation op to
the relevant bits from two input buffers.
This function is faster than applying the operation bit by bit as it processes input buffers in chunks of 64 bits (8 bytes) at a time
§Notes:
optakes twou64inputs and produces oneu64output.opmust only apply bitwise operations on the relevant bits; the inputu64values may contain irrelevant bits and may be processed differently on different endian architectures.opmay be called with input bits outside the requested range.- The returned
BooleanBufferalways has zero offset.
§See Also
BooleanBuffer::from_bitwise_unary_opfor unary operations on a single input buffer.apply_bitwise_binary_opfor in-place binary bitwise operations
§Example: Create new BooleanBuffer from bitwise AND of two Buffers
let left = Buffer::from(vec![0b11001100u8, 0b10111010u8]); // 2 bytes = 16 bits
let right = Buffer::from(vec![0b10101010u8, 0b11011100u8, 0b11110000u8]); // 3 bytes = 24 bits
// AND of the first 12 bits
let result = BooleanBuffer::from_bitwise_binary_op(
&left, 0, &right, 0, 12, |a, b| a & b
);
assert_eq!(result.inner().as_slice(), &[0b10001000u8, 0b00001000u8]);§Example: Create new BooleanBuffer from bitwise OR of two byte slices
let left = [0b11001100u8, 0b10111010u8];
let right = [0b10101010u8, 0b11011100u8];
// OR of bits 4..16 from left and bits 0..12 from right
let result = BooleanBuffer::from_bitwise_binary_op(
&left, 4, &right, 0, 12, |a, b| a | b
);
assert_eq!(result.inner().as_slice(), &[0b10101110u8, 0b00001111u8]);Sourcepub fn count_set_bits(&self) -> usize
pub fn count_set_bits(&self) -> usize
Returns the number of set bits in this buffer
Sourcepub fn find_nth_set_bit_position(&self, start: usize, n: usize) -> usize
pub fn find_nth_set_bit_position(&self, start: usize, n: usize) -> usize
Finds the position of the n-th set bit (1-based) starting from start index.
If fewer than n set bits are found, returns the length of the buffer.
Sourcepub fn bit_chunks(&self) -> BitChunks<'_>
pub fn bit_chunks(&self) -> BitChunks<'_>
Returns a BitChunks instance which can be used to iterate over
this buffer’s bits in u64 chunks
Sourcepub fn offset(&self) -> usize
pub fn offset(&self) -> usize
Returns the offset of this BooleanBuffer in bits (not bytes)
Sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
Returns the length of this BooleanBuffer in bits (not bytes)
Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns true if this BooleanBuffer is empty
Sourcepub fn shrink_to_fit(&mut self)
pub fn shrink_to_fit(&mut self)
Free up unused memory.
Sourcepub unsafe fn value_unchecked(&self, i: usize) -> bool
pub unsafe fn value_unchecked(&self, i: usize) -> bool
Returns the boolean value at index i.
§Safety
This doesn’t check bounds, the caller must ensure that index < self.len()
Sourcepub fn values(&self) -> &[u8] ⓘ
pub fn values(&self) -> &[u8] ⓘ
Returns the packed values of this BooleanBuffer not including any offset
Sourcepub fn slice(&self, offset: usize, len: usize) -> BooleanBuffer
pub fn slice(&self, offset: usize, len: usize) -> BooleanBuffer
Slices this BooleanBuffer by the provided offset and length
Sourcepub fn sliced(&self) -> Buffer
pub fn sliced(&self) -> Buffer
Returns a Buffer containing the sliced contents of this BooleanBuffer
Equivalent to self.buffer.bit_slice(self.offset, self.len)
Sourcepub fn ptr_eq(&self, other: &BooleanBuffer) -> bool
pub fn ptr_eq(&self, other: &BooleanBuffer) -> bool
Returns true if this BooleanBuffer is equal to other, using pointer comparisons
to determine buffer equality. This is cheaper than PartialEq::eq but may
return false when the arrays are logically equal
Sourcepub fn inner(&self) -> &Buffer
pub fn inner(&self) -> &Buffer
Returns the inner Buffer
Note: this does not account for offset and length of this BooleanBuffer
Sourcepub fn into_inner(self) -> Buffer
pub fn into_inner(self) -> Buffer
Returns the inner Buffer, consuming self
Note: this does not account for offset and length of this BooleanBuffer
Sourcepub fn iter(&self) -> BitIterator<'_> ⓘ
pub fn iter(&self) -> BitIterator<'_> ⓘ
Returns an iterator over the bits in this BooleanBuffer
Sourcepub fn set_indices(&self) -> BitIndexIterator<'_> ⓘ
pub fn set_indices(&self) -> BitIndexIterator<'_> ⓘ
Returns an iterator over the set bit positions in this BooleanBuffer
Sourcepub fn set_indices_u32(&self) -> BitIndexU32Iterator<'_> ⓘ
pub fn set_indices_u32(&self) -> BitIndexU32Iterator<'_> ⓘ
Returns a u32 iterator over set bit positions without any usize->u32 conversion
Sourcepub fn set_slices(&self) -> BitSliceIterator<'_> ⓘ
pub fn set_slices(&self) -> BitSliceIterator<'_> ⓘ
Returns a BitSliceIterator yielding contiguous ranges of set bits
Trait Implementations§
Source§impl BitAnd<&BooleanBuffer> for &BooleanBuffer
impl BitAnd<&BooleanBuffer> for &BooleanBuffer
Source§type Output = BooleanBuffer
type Output = BooleanBuffer
& operator.Source§fn bitand(
self,
rhs: &BooleanBuffer,
) -> <&BooleanBuffer as BitAnd<&BooleanBuffer>>::Output
fn bitand( self, rhs: &BooleanBuffer, ) -> <&BooleanBuffer as BitAnd<&BooleanBuffer>>::Output
& operation. Read moreSource§impl BitOr<&BooleanBuffer> for &BooleanBuffer
impl BitOr<&BooleanBuffer> for &BooleanBuffer
Source§type Output = BooleanBuffer
type Output = BooleanBuffer
| operator.Source§fn bitor(
self,
rhs: &BooleanBuffer,
) -> <&BooleanBuffer as BitOr<&BooleanBuffer>>::Output
fn bitor( self, rhs: &BooleanBuffer, ) -> <&BooleanBuffer as BitOr<&BooleanBuffer>>::Output
| operation. Read moreSource§impl BitXor<&BooleanBuffer> for &BooleanBuffer
impl BitXor<&BooleanBuffer> for &BooleanBuffer
Source§type Output = BooleanBuffer
type Output = BooleanBuffer
^ operator.Source§fn bitxor(
self,
rhs: &BooleanBuffer,
) -> <&BooleanBuffer as BitXor<&BooleanBuffer>>::Output
fn bitxor( self, rhs: &BooleanBuffer, ) -> <&BooleanBuffer as BitXor<&BooleanBuffer>>::Output
^ operation. Read moreSource§impl Clone for BooleanBuffer
impl Clone for BooleanBuffer
Source§fn clone(&self) -> BooleanBuffer
fn clone(&self) -> BooleanBuffer
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for BooleanBuffer
impl Debug for BooleanBuffer
Source§impl From<&[bool]> for BooleanBuffer
impl From<&[bool]> for BooleanBuffer
Source§fn from(value: &[bool]) -> BooleanBuffer
fn from(value: &[bool]) -> BooleanBuffer
Source§impl<'a> From<&'a BooleanBuffer> for SlicesIterator<'a>
impl<'a> From<&'a BooleanBuffer> for SlicesIterator<'a>
Source§fn from(filter: &'a BooleanBuffer) -> SlicesIterator<'a> ⓘ
fn from(filter: &'a BooleanBuffer) -> SlicesIterator<'a> ⓘ
Source§impl From<BooleanBuffer> for BooleanArray
impl From<BooleanBuffer> for BooleanArray
Source§fn from(values: BooleanBuffer) -> BooleanArray
fn from(values: BooleanBuffer) -> BooleanArray
Source§impl From<BooleanBuffer> for NullBuffer
impl From<BooleanBuffer> for NullBuffer
Source§fn from(value: BooleanBuffer) -> NullBuffer
fn from(value: BooleanBuffer) -> NullBuffer
Source§impl From<BooleanBufferBuilder> for BooleanBuffer
impl From<BooleanBufferBuilder> for BooleanBuffer
Source§fn from(builder: BooleanBufferBuilder) -> BooleanBuffer
fn from(builder: BooleanBufferBuilder) -> BooleanBuffer
Source§impl FromIterator<bool> for BooleanBuffer
impl FromIterator<bool> for BooleanBuffer
Source§fn from_iter<T>(iter: T) -> BooleanBufferwhere
T: IntoIterator<Item = bool>,
fn from_iter<T>(iter: T) -> BooleanBufferwhere
T: IntoIterator<Item = bool>,
Source§impl<'a> IntoIterator for &'a BooleanBuffer
impl<'a> IntoIterator for &'a BooleanBuffer
Source§type IntoIter = BitIterator<'a>
type IntoIter = BitIterator<'a>
Source§fn into_iter(self) -> <&'a BooleanBuffer as IntoIterator>::IntoIter
fn into_iter(self) -> <&'a BooleanBuffer as IntoIterator>::IntoIter
Source§impl Not for &BooleanBuffer
impl Not for &BooleanBuffer
Source§impl PartialEq for BooleanBuffer
impl PartialEq for BooleanBuffer
impl Eq for BooleanBuffer
Auto Trait Implementations§
impl Freeze for BooleanBuffer
impl RefUnwindSafe for BooleanBuffer
impl Send for BooleanBuffer
impl Sync for BooleanBuffer
impl Unpin for BooleanBuffer
impl UnsafeUnpin for BooleanBuffer
impl UnwindSafe for BooleanBuffer
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.