SplinterRef

Struct SplinterRef 

Source
pub struct SplinterRef<B> { /* private fields */ }
Expand description

A zero-copy reference to serialized splinter data.

SplinterRef allows efficient querying of compressed bitmap data without deserializing the underlying structure. It wraps any type that can be dereferenced to [u8] and provides all the same read operations as Splinter, but with minimal memory overhead and no allocation during queries.

This is the preferred type for read-only operations on serialized splinter data, especially when the data comes from files, network, or other external sources.

§Type Parameter

  • B: Any type that implements Deref<Target = [u8]> such as &[u8], Vec<u8>, Bytes, Arc<[u8]>, etc.

§Examples

Creating from serialized bytes:

use splinter_rs::{Splinter, SplinterRef, PartitionWrite, PartitionRead, Encodable};

// Create and populate a splinter
let mut splinter = Splinter::EMPTY;
splinter.insert(100);
splinter.insert(200);

// Serialize it to bytes
let bytes = splinter.encode_to_bytes();

// Create a zero-copy reference
let splinter_ref = SplinterRef::from_bytes(bytes).unwrap();
assert_eq!(splinter_ref.cardinality(), 2);
assert!(splinter_ref.contains(100));

Working with different buffer types:

use splinter_rs::{Splinter, SplinterRef, PartitionWrite, PartitionRead, Encodable};
use std::sync::Arc;

let mut splinter = Splinter::EMPTY;
splinter.insert(42);

let bytes = splinter.encode_to_bytes();
let shared_bytes: Arc<[u8]> = bytes.to_vec().into();

let splinter_ref = SplinterRef::from_bytes(shared_bytes).unwrap();
assert!(splinter_ref.contains(42));

Implementations§

Source§

impl<B> SplinterRef<B>

Source

pub fn inner(&self) -> &B

Returns a reference to the underlying data buffer.

This provides access to the raw bytes that store the serialized splinter data.

§Examples
use splinter_rs::{Splinter, SplinterRef, PartitionWrite, Encodable};

let mut splinter = Splinter::EMPTY;
splinter.insert(42);
let bytes = splinter.encode_to_bytes();
let splinter_ref = SplinterRef::from_bytes(bytes).unwrap();

let inner_bytes = splinter_ref.inner();
assert!(!inner_bytes.is_empty());
Source

pub fn into_inner(self) -> B

Consumes the SplinterRef and returns the underlying data buffer.

This is useful when you need to take ownership of the underlying data after you’re done querying the splinter.

§Examples
use splinter_rs::{Splinter, SplinterRef, PartitionWrite, Encodable};

let mut splinter = Splinter::EMPTY;
splinter.insert(42);
let bytes = splinter.encode_to_bytes();
let splinter_ref = SplinterRef::from_bytes(bytes.clone()).unwrap();

let recovered_bytes = splinter_ref.into_inner();
assert_eq!(recovered_bytes, bytes);
Source§

impl SplinterRef<Bytes>

Source

pub fn encode_to_bytes(&self) -> Bytes

Returns a clone of the underlying bytes.

This is efficient for Bytes since it uses reference counting internally and doesn’t actually copy the data.

§Examples
use splinter_rs::{Splinter, PartitionWrite};

let mut splinter = Splinter::EMPTY;
splinter.insert(42);
let splinter_ref = splinter.encode_to_splinter_ref();

let bytes_copy = splinter_ref.encode_to_bytes();
assert!(!bytes_copy.is_empty());
Source§

impl<B: Deref<Target = [u8]>> SplinterRef<B>

Source

pub fn decode_to_splinter(&self) -> Splinter

Converts this reference back to an owned Splinter.

This method deserializes the underlying data and creates a new owned Splinter that supports mutation. This involves iterating through all values and rebuilding the data structure, so it has a cost proportional to the number of elements.

§Examples
use splinter_rs::{Splinter, SplinterRef, PartitionWrite, PartitionRead};

let mut original = Splinter::EMPTY;
original.insert(100);
original.insert(200);

let splinter_ref = original.encode_to_splinter_ref();
let decoded = splinter_ref.decode_to_splinter();

assert_eq!(decoded.cardinality(), 2);
assert!(decoded.contains(100));
assert!(decoded.contains(200));
Source

pub fn from_bytes(data: B) -> Result<Self, DecodeErr>

Creates a SplinterRef from raw bytes, validating the format.

This method parses and validates the serialized splinter format, checking:

  • Sufficient data length
  • Valid magic bytes
  • Correct checksum

IMPORTANT: This method does not recursively verify the entire splinter, opting instead to rely on the checksum to detect any corruption. Do not use Splinter with untrusted data as it’s trivial to construct a Splinter which will cause your program to panic at runtime.

Returns an error if the data is corrupted or in an invalid format.

§Errors
§Examples
use splinter_rs::{Splinter, SplinterRef, PartitionWrite, PartitionRead, Encodable};

let mut splinter = Splinter::EMPTY;
splinter.insert(42);
let bytes = splinter.encode_to_bytes();

let splinter_ref = SplinterRef::from_bytes(bytes).unwrap();
assert!(splinter_ref.contains(42));

Error handling:

use splinter_rs::{SplinterRef, codec::DecodeErr};

let invalid_bytes = vec![0u8; 5]; // Too short
let result = SplinterRef::from_bytes(invalid_bytes);
assert!(matches!(result.unwrap_err().ctx(), DecodeErr::Length));

Trait Implementations§

Source§

impl<B: Clone> Clone for SplinterRef<B>

Source§

fn clone(&self) -> SplinterRef<B>

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<B: Deref<Target = [u8]>> Cut<SplinterRef<B>> for Splinter

Source§

type Out = Splinter

Source§

fn cut(&mut self, rhs: &SplinterRef<B>) -> Self::Out

Returns the intersection between self and other while removing the intersection from self
Source§

impl<B: Deref<Target = [u8]>> Debug for SplinterRef<B>

Source§

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

Formats the value using the given formatter. Read more
Source§

impl<B: Deref<Target = [u8]>> Encodable for SplinterRef<B>

Source§

fn encoded_size(&self) -> usize

Returns the number of bytes required to encode this value. Read more
Source§

fn encode<T: BufMut>(&self, encoder: &mut Encoder<T>)

Encodes this value into the provided encoder.
Source§

fn encode_to_bytes(&self) -> Bytes

Convenience method that encodes this value to a Bytes buffer. Read more
Source§

impl From<CowSplinter<Bytes>> for SplinterRef<Bytes>

Source§

fn from(cow: CowSplinter<Bytes>) -> Self

Converts to this type from the input type.
Source§

impl<B> From<SplinterRef<B>> for CowSplinter<B>

Source§

fn from(splinter_ref: SplinterRef<B>) -> Self

Converts to this type from the input type.
Source§

impl<B: Deref<Target = [u8]>> Merge<SplinterRef<B>> for Splinter

Source§

fn merge(&mut self, rhs: &SplinterRef<B>)

Merges rhs into self
Source§

impl<B: Deref<Target = [u8]>> PartialEq<Splinter> for SplinterRef<B>

Source§

fn eq(&self, other: &Splinter) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<B: Deref<Target = [u8]>> PartialEq<SplinterRef<B>> for Splinter

Source§

fn eq(&self, other: &SplinterRef<B>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<B: Deref<Target = [u8]>, B2: Deref<Target = [u8]>> PartialEq<SplinterRef<B2>> for SplinterRef<B>

Source§

fn eq(&self, other: &SplinterRef<B2>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<B: Deref<Target = [u8]>> PartitionRead<High> for SplinterRef<B>

Source§

fn cardinality(&self) -> usize

the total number of values accessible via this partition.
Source§

fn is_empty(&self) -> bool

returns true if this partition is empty
Source§

fn contains(&self, value: u32) -> bool

returns true if this partition contains the given value
Source§

fn rank(&self, value: u32) -> usize

returns the number of values contained in this partition up to and including the value.
Source§

fn select(&self, idx: usize) -> Option<u32>

returns the value at position idx.
Source§

fn last(&self) -> Option<u32>

returns the last value in the partition
Source§

fn iter(&self) -> impl Iterator<Item = u32>

returns an iterator over all values in this partition
Source§

fn range<R>(&self, range: R) -> impl Iterator<Item = L::Value>
where R: RangeBounds<L::Value> + Clone,

returns an iterator over all values in this partition restricted by the provided range.
Source§

impl<B: Deref<Target = [u8]>> Eq for SplinterRef<B>

Auto Trait Implementations§

§

impl<B> Freeze for SplinterRef<B>
where B: Freeze,

§

impl<B> RefUnwindSafe for SplinterRef<B>
where B: RefUnwindSafe,

§

impl<B> Send for SplinterRef<B>
where B: Send,

§

impl<B> Sync for SplinterRef<B>
where B: Sync,

§

impl<B> Unpin for SplinterRef<B>
where B: Unpin,

§

impl<B> UnwindSafe for SplinterRef<B>
where B: UnwindSafe,

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> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. 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> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
Source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
Source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
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> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. 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.