pub struct BitPackedInts { /* private fields */ }Expand description
Stores integers using only as many bits as the largest value needs.
Pass your values to pack() and we’ll figure out the optimal
bit width automatically. Random access via get() is O(1).
§Storage
Phase 3c: word storage has two shapes.
Inline(Vec<u64>) is used for in-RAM builds (pack, from_raw_parts)
so scans can iterate the &[u64] slice directly with no per-element
decode. Mapped(Bytes) is used for mmap-backed loads
(from_bytes_storage) so the column shares the underlying allocation
without copying. Per-element access via word_at
works for both; callers that want zero-decode iteration should use
as_words_slice and fall back to word_at
when it returns None.
Implementations§
Source§impl BitPackedInts
impl BitPackedInts
Sourcepub fn from_raw_parts(data: Vec<u64>, bits_per_value: u8, count: usize) -> Self
pub fn from_raw_parts(data: Vec<u64>, bits_per_value: u8, count: usize) -> Self
Reconstructs from pre-packed raw parts.
Used by section deserialization. The caller is responsible for ensuring the data is consistent (correct word count for the given bits and count).
Sourcepub fn from_bytes_storage(data: Bytes, bits_per_value: u8, count: usize) -> Self
pub fn from_bytes_storage(data: Bytes, bits_per_value: u8, count: usize) -> Self
Reconstructs from pre-encoded bytes (Phase 3c entry point).
The byte slice must be word_count * 8 bytes of little-endian
u64 words. Used by the mmap path so a column can hold a slice
of mapped memory without copying.
Sourcepub fn pack_with_bits(values: &[u64], bits_per_value: u8) -> Self
pub fn pack_with_bits(values: &[u64], bits_per_value: u8) -> Self
Packs values using a specified bit width.
§Panics
Panics if any value doesn’t fit in the specified bit width.
Sourcepub fn scan_eq(&self, target: u64) -> Vec<usize>
pub fn scan_eq(&self, target: u64) -> Vec<usize>
Returns the row offsets where the unpacked value equals target.
Hoists the WordStore discriminant check, the bits_per_value
constants, and the values_per_word / mask computation out of the
per-row loop. CodSpeed callgrind counts every retired instruction, so
re-deriving these per row (as (0..len).filter(|i| get(*i) == ...) did)
inflated the instruction count materially even though wall-time on
real CPUs was unaffected.
Sourcepub fn bits_per_value(&self) -> u8
pub fn bits_per_value(&self) -> u8
Returns the number of bits per value.
Sourcepub fn data_bytes(&self) -> Bytes
pub fn data_bytes(&self) -> Bytes
Returns the raw packed bytes.
Phase 3b/3c: when storage is Inline, we materialise an LE-encoded
view; when storage is Mapped, we return the existing refcount.
Callers that hold the result must accept either ownership shape.
Sourcepub fn word_count(&self) -> usize
pub fn word_count(&self) -> usize
Returns the number of u64 words backing this column.
Sourcepub fn as_words_slice(&self) -> Option<&[u64]>
pub fn as_words_slice(&self) -> Option<&[u64]>
Returns a direct &[u64] view when the column lives in RAM.
Some(slice) means the caller can iterate words without per-element
decode. None means the column is mmap-backed; callers should fall
back to Self::word_at (one safe LE decode per access).
Sourcepub fn word_at(&self, idx: usize) -> Option<u64>
pub fn word_at(&self, idx: usize) -> Option<u64>
Returns the word at idx, or None if out of range.
Sourcepub fn compression_ratio(&self) -> f64
pub fn compression_ratio(&self) -> f64
Returns the compression ratio compared to storing full u64s.
Sourcepub fn bits_needed(value: u64) -> u8
pub fn bits_needed(value: u64) -> u8
Returns the number of bits needed to represent a value.
The result is always in 1..=64.
§Panics
Cannot panic: the result of 64 - leading_zeros() is always in
1..=64, which fits u8.
Sourcepub fn from_bytes(bytes: &[u8]) -> Result<Self>
pub fn from_bytes(bytes: &[u8]) -> Result<Self>
Deserializes from bytes.
§Errors
Returns Err if the byte slice is too short or contains invalid data.
Trait Implementations§
Source§impl Clone for BitPackedInts
impl Clone for BitPackedInts
Source§fn clone(&self) -> BitPackedInts
fn clone(&self) -> BitPackedInts
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl !Freeze for BitPackedInts
impl RefUnwindSafe for BitPackedInts
impl Send for BitPackedInts
impl Sync for BitPackedInts
impl Unpin for BitPackedInts
impl UnsafeUnpin for BitPackedInts
impl UnwindSafe for BitPackedInts
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<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more