pub struct Storage<D = InMemoryDB>where
D: DB,{
pub arena: Arena<D>,
}Expand description
A factory for various storage objects
Fields§
§arena: Arena<D>The inner storage arena
Implementations§
Source§impl<D> Storage<D>where
D: DB,
impl<D> Storage<D>where
D: DB,
Sourcepub fn new(cache_size: usize, db: D) -> Storage<D>
pub fn new(cache_size: usize, db: D) -> Storage<D>
Create a new Storage type with given cache size and db.
If the cache_size is zero, then the StorageBackend caches will be
unbounded. Otherwise, the read cache will be strictly bounded by
cache_size, and the write cache will be truncated to at most that size
on StorageBackend flush operations.
Note: the cache size is in number of objects, not number of megabytes
of memory! See self::DEFAULT_CACHE_SIZE for a default choice.
Sourcepub fn new_from_arena(arena: Arena<D>) -> Storage<D>
pub fn new_from_arena(arena: Arena<D>) -> Storage<D>
Create a new Storage type from an existing Arena
Methods from Deref<Target = Arena<D>>§
Sourcepub fn with_backend<R>(&self, f: impl FnOnce(&mut StorageBackend<D>) -> R) -> R
pub fn with_backend<R>(&self, f: impl FnOnce(&mut StorageBackend<D>) -> R) -> R
Apply a function to the back-end.
This is the only pub way to access the back-end, since safe use of the
back-end requires locking.
Sourcepub fn alloc<T>(&self, value: T) -> Sp<T, D>where
T: Storable<D>,
pub fn alloc<T>(&self, value: T) -> Sp<T, D>where
T: Storable<D>,
Insert value into the arena, and cache its data in the back-end until
all Sps for this data are dropped.
Sourcepub fn get<T>(
&self,
key: &TypedArenaKey<T, <D as DB>::Hasher>,
) -> Result<Sp<T, D>, Error>where
T: Storable<D>,
pub fn get<T>(
&self,
key: &TypedArenaKey<T, <D as DB>::Hasher>,
) -> Result<Sp<T, D>, Error>where
T: Storable<D>,
Get a pointer into the arena.
This attempts to load the value eagerly, but will fall back on any
existing cached value if available, regardless of whether that value is
fully forced or not. Will return an Err if the protocol_version in the key
does not match that of the Arena.
§Warning
This function may perform unbounded recursion, to the depth of the
deepest nesting of Sps contained in the result, since it works by
recursing down to the leaves and building DAG up from there. If this is
not acceptable, then use Self::get_lazy instead, which has no
unbounded recursion, and instead loads nested Sps on demand.
Sourcepub fn children(
&self,
key: &ArenaHash<<D as DB>::Hasher>,
) -> Result<Vec<ArenaKey<<D as DB>::Hasher>>, Error>
pub fn children( &self, key: &ArenaHash<<D as DB>::Hasher>, ) -> Result<Vec<ArenaKey<<D as DB>::Hasher>>, Error>
Retrieves the child keys of a given key.
Sourcepub fn get_lazy<T>(
&self,
key: &TypedArenaKey<T, <D as DB>::Hasher>,
) -> Result<Sp<T, D>, Error>
pub fn get_lazy<T>( &self, key: &TypedArenaKey<T, <D as DB>::Hasher>, ) -> Result<Sp<T, D>, Error>
Get a pointer into the arena.
This attempts to load the value lazily, but will fall back on any
existing cached value if available, regardless of whether that value is
fully forced or not. Will return an Err if the protocol_version in the key
does not match that of the Arena.
Sourcepub fn deserialize_sp<T, R>(
&self,
reader: &mut R,
recursive_depth: u32,
) -> Result<Sp<T, D>, Error>
pub fn deserialize_sp<T, R>( &self, reader: &mut R, recursive_depth: u32, ) -> Result<Sp<T, D>, Error>
Deserializes an SP.
§Note
This is a boundary for user controlled input, namely the serialization
in reader. So we need to be careful here to gracefully handle
malformed (or even maliciously formed?) input. In contrast, the
StorageBackend assumes its inputs are sanitized, and panics when
receiving malformed inputs (e.g. parents with pointers to non-existent
children).
Trait Implementations§
Auto Trait Implementations§
impl<D> Freeze for Storage<D>
impl<D = InMemoryDB> !RefUnwindSafe for Storage<D>
impl<D> Send for Storage<D>
impl<D> Sync for Storage<D>
impl<D> Unpin for Storage<D>
impl<D> UnsafeUnpin for Storage<D>
impl<D = InMemoryDB> !UnwindSafe for Storage<D>
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> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§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> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
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.