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 implementsDeref<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>
impl<B> SplinterRef<B>
Sourcepub fn inner(&self) -> &B
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());
Sourcepub fn into_inner(self) -> B
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>
impl SplinterRef<Bytes>
Sourcepub fn encode_to_bytes(&self) -> Bytes
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>
impl<B: Deref<Target = [u8]>> SplinterRef<B>
Sourcepub fn decode_to_splinter(&self) -> Splinter
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));
Sourcepub fn from_bytes(data: B) -> Result<Self, DecodeErr>
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
DecodeErr::Length
: Not enough bytes in the bufferDecodeErr::Magic
: Invalid magic bytesDecodeErr::Checksum
: Data corruption detectedDecodeErr::Validity
: Invalid internal structureDecodeErr::SplinterV1
: Data is from incompatible v1 format
§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>
impl<B: Clone> Clone for SplinterRef<B>
Source§fn clone(&self) -> SplinterRef<B>
fn clone(&self) -> SplinterRef<B>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl<B: Deref<Target = [u8]>> Encodable for SplinterRef<B>
impl<B: Deref<Target = [u8]>> Encodable for SplinterRef<B>
Source§impl From<CowSplinter<Bytes>> for SplinterRef<Bytes>
impl From<CowSplinter<Bytes>> for SplinterRef<Bytes>
Source§fn from(cow: CowSplinter<Bytes>) -> Self
fn from(cow: CowSplinter<Bytes>) -> Self
Source§impl<B> From<SplinterRef<B>> for CowSplinter<B>
impl<B> From<SplinterRef<B>> for CowSplinter<B>
Source§fn from(splinter_ref: SplinterRef<B>) -> Self
fn from(splinter_ref: SplinterRef<B>) -> Self
Source§impl<B: Deref<Target = [u8]>> Merge<SplinterRef<B>> for Splinter
impl<B: Deref<Target = [u8]>> Merge<SplinterRef<B>> for Splinter
Source§fn merge(&mut self, rhs: &SplinterRef<B>)
fn merge(&mut self, rhs: &SplinterRef<B>)
Source§impl<B: Deref<Target = [u8]>, B2: Deref<Target = [u8]>> PartialEq<SplinterRef<B2>> for SplinterRef<B>
impl<B: Deref<Target = [u8]>, B2: Deref<Target = [u8]>> PartialEq<SplinterRef<B2>> for SplinterRef<B>
Source§impl<B: Deref<Target = [u8]>> PartitionRead<High> for SplinterRef<B>
impl<B: Deref<Target = [u8]>> PartitionRead<High> for SplinterRef<B>
Source§fn cardinality(&self) -> usize
fn cardinality(&self) -> usize
Source§fn contains(&self, value: u32) -> bool
fn contains(&self, value: u32) -> bool
Source§fn rank(&self, value: u32) -> usize
fn rank(&self, value: u32) -> usize
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> 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> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.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 moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
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
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
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
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.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
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.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
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.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
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.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
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.