Skip to main content

BitPackedInts

Struct BitPackedInts 

Source
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

Source

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).

Source

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.

Source

pub fn pack(values: &[u64]) -> Self

Packs a slice of u64 values using the minimum bits needed.

Source

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.

Source

pub fn unpack(&self) -> Vec<u64>

Unpacks all values back to u64.

Source

pub fn get(&self, index: usize) -> Option<u64>

Gets a single value at the given index.

Source

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.

Source

pub fn len(&self) -> usize

Returns the number of values.

Source

pub fn is_empty(&self) -> bool

Returns whether the encoding is empty.

Source

pub fn bits_per_value(&self) -> u8

Returns the number of bits per value.

Source

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.

Source

pub fn word_count(&self) -> usize

Returns the number of u64 words backing this column.

Source

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).

Source

pub fn word_at(&self, idx: usize) -> Option<u64>

Returns the word at idx, or None if out of range.

Source

pub fn compression_ratio(&self) -> f64

Returns the compression ratio compared to storing full u64s.

Source

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.

Source

pub fn to_bytes(&self) -> Result<Vec<u8>>

Serializes to bytes.

§Errors

Returns Err if the value count exceeds u32::MAX.

Source

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

Source§

fn clone(&self) -> BitPackedInts

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for BitPackedInts

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.