CowSplinter

Enum CowSplinter 

Source
pub enum CowSplinter<B> {
    Ref(SplinterRef<B>),
    Owned(Splinter),
}
Expand description

A clone-on-write splinter that can hold either a reference or an owned value.

CowSplinter is an enum that can contain either a SplinterRef<B> (for zero-copy read-only access) or an owned Splinter (for mutable operations). It automatically converts from read-only to owned when mutation is needed, providing an efficient way to work with splinter data that might come from different sources.

This is particularly useful when you want to:

  • Start with serialized/borrowed data for read-only operations
  • Potentially modify the data later
  • Avoid unnecessary copying until mutation is actually needed
  • Or work with a collection of Splinters which may or may not be owned

§Examples

Starting with a reference and converting to owned when needed:

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

// Create a CowSplinter from a reference
let original = Splinter::from_iter([100, 200]);
let splinter_ref = original.encode_to_splinter_ref();
let mut cow = CowSplinter::from_ref(splinter_ref);

// Read operations work on the reference
assert_eq!(cow.cardinality(), 2);

// First write operation converts to owned
cow.insert(300); // This triggers clone-on-write
assert_eq!(cow.cardinality(), 3);

Creating from different sources:

use splinter_rs::{Splinter, CowSplinter, PartitionWrite, PartitionRead, Encodable};
use bytes::Bytes;

// From owned splinter
let owned = Splinter::EMPTY;
let cow1: CowSplinter<Bytes> = CowSplinter::from_owned(owned);

// From iterator
let cow2 = CowSplinter::<Bytes>::from_iter([1u32, 2, 3]);

// From bytes
let bytes = cow2.encode_to_bytes();
let cow3 = CowSplinter::from_bytes(bytes).unwrap();

Variants§

§

Ref(SplinterRef<B>)

Contains a zero-copy reference to serialized data

§

Owned(Splinter)

Contains an owned, mutable splinter

Implementations§

Source§

impl<B> CowSplinter<B>

Source

pub fn from_owned(splinter: Splinter) -> Self

Creates a CowSplinter from an owned Splinter.

§Examples
use splinter_rs::{Splinter, CowSplinter, PartitionRead, Encodable};

let splinter = Splinter::from_iter([42]);
let cow: CowSplinter<Vec<u8>> = CowSplinter::from_owned(splinter);
assert!(cow.contains(42));
Source

pub fn from_ref(splinter: SplinterRef<B>) -> Self

Creates a CowSplinter from a SplinterRef.

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

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

let cow = CowSplinter::from_ref(splinter_ref);
assert!(cow.contains(42));
Source§

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

Source

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

Creates a CowSplinter from raw bytes, validating the format.

This is equivalent to creating a SplinterRef from the bytes and wrapping it in a CowSplinter::Ref. All the same validation rules apply.

§Errors

Returns the same errors as SplinterRef::from_bytes.

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

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

let cow = CowSplinter::from_bytes(bytes).unwrap();
assert!(cow.contains(42));
Source

pub fn into_owned(self) -> Splinter

Converts this CowSplinter into an owned Splinter.

If this is already an owned splinter, it returns it directly. If this is a reference, it deserializes the data into a new owned splinter.

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

let mut original = Splinter::EMPTY;
original.insert(100);
let splinter_ref = original.encode_to_splinter_ref();
let cow = CowSplinter::from_ref(splinter_ref);

let owned = cow.into_owned();
assert_eq!(owned.cardinality(), 1);
assert!(owned.contains(100));
Source

pub fn to_mut(&mut self) -> &mut Splinter

Returns a mutable reference to the underlying Splinter.

This method implements the “clone-on-write” behavior: if the current value is a Ref, it will be converted to Owned by deserializing the data. Subsequent calls will return the same mutable reference without additional conversions.

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

let mut original = Splinter::EMPTY;
original.insert(100);
let splinter_ref = original.encode_to_splinter_ref();
let mut cow = CowSplinter::from_ref(splinter_ref);

// This triggers the clone-on-write conversion
let mutable_ref = cow.to_mut();
mutable_ref.insert(200);

assert_eq!(cow.cardinality(), 2);
Source§

impl CowSplinter<Bytes>

Source

pub fn encode_to_bytes(&self) -> Bytes

Returns the serialized bytes representation of this splinter.

For the Ref variant, this clones the underlying Bytes (which is efficient due to reference counting). For the Owned variant, this encodes the splinter to bytes.

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

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

let bytes = cow.encode_to_bytes();
assert!(!bytes.is_empty());

Trait Implementations§

Source§

impl<B: Clone> Clone for CowSplinter<B>

Source§

fn clone(&self) -> CowSplinter<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<CowSplinter<B>> for Splinter

Source§

type Out = Splinter

Source§

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

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

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

Source§

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

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

impl<B> Default for CowSplinter<B>

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl<B: Deref<Target = [u8]>> Encodable for CowSplinter<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<B: Deref<Target = [u8]>> From<CowSplinter<B>> for Splinter

Source§

fn from(cow_splinter: CowSplinter<B>) -> Self

Converts to this type from the input type.
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<Splinter> for CowSplinter<B>

Source§

fn from(splinter: Splinter) -> 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, K: Into<u32>> FromIterator<K> for CowSplinter<B>
where B: Deref<Target = [u8]>,

Source§

fn from_iter<I: IntoIterator<Item = K>>(iter: I) -> Self

Creates a value from an iterator. Read more
Source§

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

Source§

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

Merges rhs into self
Source§

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

Source§

fn eq(&self, other: &CowSplinter<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<CowSplinter<B2>> for CowSplinter<B>

Source§

fn eq(&self, other: &CowSplinter<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 CowSplinter<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]>> PartitionWrite<High> for CowSplinter<B>

Source§

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

Inserts the value into the partition unless it already exists. Returns true if the insertion occurred, false otherwise.
Source§

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

Removes the value from the partition if it exists. Returns true if the removal occurred, false otherwise.
Source§

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

Auto Trait Implementations§

§

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

§

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

§

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

§

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

§

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

§

impl<B> UnwindSafe for CowSplinter<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.