Struct PageRange

Source
pub struct PageRange<'a, K> { /* private fields */ }
Expand description

A serialised representation of the range of keys contained within the sub-tree rooted at a given Page, and the associated PageDigest.

A PageRange contains all the information needed to perform a tree difference calculation, used as the input to the diff() function.

The contents of this type can be serialised and transmitted over the network, and reconstructed by the receiver by calling PageRange::new() with the serialised values.

§Exchanging Between Peers

Exchange the ordered sets of PageRange between peers by serialising their content, accessed through the accessor methods:

/// A network wire representation used by the application.
struct NetworkPage {
    start_bounds: String,
    end_bounds: String,
    hash: [u8; 16],
}

let mut t = MerkleSearchTree::default();
t.upsert("bananas".to_string(), &"platanos".to_string());
t.root_hash();

let network_request: Vec<NetworkPage> = t
    .serialise_page_ranges()
    .unwrap()
    .into_iter()
    .map(|page| NetworkPage {
        start_bounds: page.start().clone(),
        end_bounds: page.end().clone(),
        hash: *page.hash().as_bytes(),
    })
    .collect();

// Send network_request to a peer over the network

And reconstruct the PageRange on the receiver:

// Receive network_request from a peer over the network

// PageRange construction is zero-copy for the page keys, borrowing the keys
// from the underlying network request.
let page_refs = network_request
    .iter()
    .map(|p| {
        // If this request is coming from an untrusted source, validate that
        // start <= end to avoid the PageRange constructor panic.
        PageRange::new(&p.start_bounds, &p.end_bounds, PageDigest::new(p.hash))
    })
    .collect::<Vec<_>>();

// Feed page_refs into diff()

§Borrowed vs. Owned

A PageRange borrows the keys from the tree to avoid unnecessary clones, retaining an immutable reference to the tree.

If an owned / long-lived set of PageRange is desired (avoiding the immutable reference to the tree), generate a PageRangeSnapshot from the set of PageRange.

Implementations§

Source§

impl<'a, K> PageRange<'a, K>

Source

pub fn new(start: &'a K, end: &'a K, hash: PageDigest) -> Self
where K: PartialOrd,

Construct a PageRange for the given key interval and PageDigest.

§Panics

If start is greater than end, this method panics.

Source

pub fn start(&self) -> &'a K

Returns the inclusive start of this PageRange.

Source

pub fn end(&self) -> &'a K

Returns the inclusive end of this PageRange

Source

pub fn hash(&self) -> &PageDigest

Returns the PageDigest of this page, representing the content of the page and all pages within the sub-tree rooted at it.

Source

pub fn into_hash(self) -> PageDigest

Consume this PageRange, returning the PageDigest that covers the subtree rooted at this page.

Trait Implementations§

Source§

impl<'a, K> Clone for PageRange<'a, K>

Source§

fn clone(&self) -> Self

Returns a copy 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<'a, K: Debug> Debug for PageRange<'a, K>

Source§

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

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

impl<'a, K> Display for PageRange<'a, K>
where K: Display,

Source§

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

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

impl<'a, const N: usize, K> From<&'a Page<N, K>> for PageRange<'a, K>

Source§

fn from(page: &'a Page<N, K>) -> Self

Converts to this type from the input type.
Source§

impl<'a, K> From<PageRange<'a, K>> for OwnedPageRange<K>
where K: Clone,

Source§

fn from(v: PageRange<'a, K>) -> Self

Converts to this type from the input type.
Source§

impl<'a, K> FromIterator<PageRange<'a, K>> for PageRangeSnapshot<K>
where K: Clone + 'a,

Source§

fn from_iter<T: IntoIterator<Item = PageRange<'a, K>>>(iter: T) -> Self

Creates a value from an iterator. Read more
Source§

impl<'a, K: PartialEq> PartialEq for PageRange<'a, K>

Source§

fn eq(&self, other: &PageRange<'a, K>) -> 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<'a, K> StructuralPartialEq for PageRange<'a, K>

Auto Trait Implementations§

§

impl<'a, K> Freeze for PageRange<'a, K>

§

impl<'a, K> RefUnwindSafe for PageRange<'a, K>
where K: RefUnwindSafe,

§

impl<'a, K> Send for PageRange<'a, K>
where K: Sync,

§

impl<'a, K> Sync for PageRange<'a, K>
where K: Sync,

§

impl<'a, K> Unpin for PageRange<'a, K>

§

impl<'a, K> UnwindSafe for PageRange<'a, K>
where K: RefUnwindSafe,

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

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> 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> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. 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.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more