Struct linera_views::views::collection_view::ByteCollectionView
source · pub struct ByteCollectionView<C, W> { /* private fields */ }
Expand description
A view that supports accessing a collection of views of the same kind, indexed by a
Vec<u8>
, one subview at a time.
Implementations§
source§impl<C, W> ByteCollectionView<C, W>
impl<C, W> ByteCollectionView<C, W>
sourcepub async fn load_entry_mut(
&mut self,
short_key: &[u8],
) -> Result<&mut W, ViewError>
pub async fn load_entry_mut( &mut self, short_key: &[u8], ) -> Result<&mut W, ViewError>
Loads a subview for the data at the given index in the collection. If an entry is absent then a default entry is added to the collection. The resulting view can be modified.
let mut view: ByteCollectionView<_, RegisterView<_, String>> =
ByteCollectionView::load(context).await.unwrap();
let subview = view.load_entry_mut(&[0, 1]).await.unwrap();
let value = subview.get();
assert_eq!(*value, String::default());
sourcepub async fn load_entry_or_insert(
&mut self,
short_key: &[u8],
) -> Result<&W, ViewError>
pub async fn load_entry_or_insert( &mut self, short_key: &[u8], ) -> Result<&W, ViewError>
Loads a subview for the data at the given index in the collection. If an entry is absent then a default entry is added to the collection. The resulting view is read-only.
let mut view: ByteCollectionView<_, RegisterView<_, String>> =
ByteCollectionView::load(context).await.unwrap();
view.load_entry_mut(&[0, 1]).await.unwrap();
let subview = view.load_entry_or_insert(&[0, 1]).await.unwrap();
let value = subview.get();
assert_eq!(*value, String::default());
sourcepub async fn try_load_entry(
&self,
short_key: &[u8],
) -> Result<Option<ReadGuardedView<'_, W>>, ViewError>
pub async fn try_load_entry( &self, short_key: &[u8], ) -> Result<Option<ReadGuardedView<'_, W>>, ViewError>
Loads a subview for the data at the given index in the collection. If an entry
is absent then None
is returned. The resulting view cannot be modified.
May fail if one subview is already being visited.
let mut view: ByteCollectionView<_, RegisterView<_, String>> =
ByteCollectionView::load(context).await.unwrap();
{
let _subview = view.load_entry_or_insert(&[0, 1]).await.unwrap();
}
{
let subview = view.try_load_entry(&[0, 1]).await.unwrap().unwrap();
let value = subview.get();
assert_eq!(*value, String::default());
}
assert!(view.try_load_entry(&[0, 2]).await.unwrap().is_none());
sourcepub fn reset_entry_to_default(
&mut self,
short_key: &[u8],
) -> Result<(), ViewError>
pub fn reset_entry_to_default( &mut self, short_key: &[u8], ) -> Result<(), ViewError>
Resets an entry to the default value.
let mut view: ByteCollectionView<_, RegisterView<_, String>> =
ByteCollectionView::load(context).await.unwrap();
let subview = view.load_entry_mut(&[0, 1]).await.unwrap();
let value = subview.get_mut();
*value = String::from("Hello");
view.reset_entry_to_default(&[0, 1]).unwrap();
let subview = view.load_entry_mut(&[0, 1]).await.unwrap();
let value = subview.get_mut();
assert_eq!(*value, String::default());
sourcepub async fn contains_key(&self, short_key: &[u8]) -> Result<bool, ViewError>
pub async fn contains_key(&self, short_key: &[u8]) -> Result<bool, ViewError>
Tests if the collection contains a specified key and returns a boolean.
let mut view: ByteCollectionView<_, RegisterView<_, String>> =
ByteCollectionView::load(context).await.unwrap();
{
let _subview = view.load_entry_mut(&[0, 1]).await.unwrap();
}
assert!(view.contains_key(&[0, 1]).await.unwrap());
assert!(!view.contains_key(&[0, 2]).await.unwrap());
sourcepub fn remove_entry(&mut self, short_key: Vec<u8>)
pub fn remove_entry(&mut self, short_key: Vec<u8>)
Marks the entry as removed. If absent then nothing is done.
let mut view: ByteCollectionView<_, RegisterView<_, String>> =
ByteCollectionView::load(context).await.unwrap();
let subview = view.load_entry_mut(&[0, 1]).await.unwrap();
let value = subview.get_mut();
assert_eq!(*value, String::default());
view.remove_entry(vec![0, 1]);
let keys = view.keys().await.unwrap();
assert_eq!(keys.len(), 0);
source§impl<C, W> ByteCollectionView<C, W>
impl<C, W> ByteCollectionView<C, W>
sourcepub async fn for_each_key_while<F>(&self, f: F) -> Result<(), ViewError>
pub async fn for_each_key_while<F>(&self, f: F) -> Result<(), ViewError>
Applies a function f on each index (aka key). Keys are visited in the lexicographic order. If the function returns false, then the loop ends prematurely.
let mut view: ByteCollectionView<_, RegisterView<_, String>> =
ByteCollectionView::load(context).await.unwrap();
view.load_entry_mut(&[0, 1]).await.unwrap();
view.load_entry_mut(&[0, 2]).await.unwrap();
let mut count = 0;
view.for_each_key_while(|_key| {
count += 1;
Ok(count < 1)
})
.await
.unwrap();
assert_eq!(count, 1);
sourcepub async fn for_each_key<F>(&self, f: F) -> Result<(), ViewError>
pub async fn for_each_key<F>(&self, f: F) -> Result<(), ViewError>
Applies a function f on each index (aka key). Keys are visited in a lexicographic order.
let mut view: ByteCollectionView<_, RegisterView<_, String>> =
ByteCollectionView::load(context).await.unwrap();
view.load_entry_mut(&[0, 1]).await.unwrap();
view.load_entry_mut(&[0, 2]).await.unwrap();
let mut count = 0;
view.for_each_key(|_key| {
count += 1;
Ok(())
})
.await
.unwrap();
assert_eq!(count, 2);
sourcepub async fn keys(&self) -> Result<Vec<Vec<u8>>, ViewError>
pub async fn keys(&self) -> Result<Vec<Vec<u8>>, ViewError>
Returns the list of keys in the collection. The order is lexicographic.
let mut view: ByteCollectionView<_, RegisterView<_, String>> =
ByteCollectionView::load(context).await.unwrap();
view.load_entry_mut(&[0, 1]).await.unwrap();
view.load_entry_mut(&[0, 2]).await.unwrap();
let keys = view.keys().await.unwrap();
assert_eq!(keys, vec![vec![0, 1], vec![0, 2]]);
sourcepub async fn count(&self) -> Result<usize, ViewError>
pub async fn count(&self) -> Result<usize, ViewError>
Returns the number of entries in the collection.
let mut view: ByteCollectionView<_, RegisterView<_, String>> =
ByteCollectionView::load(context).await.unwrap();
view.load_entry_mut(&[0, 1]).await.unwrap();
view.load_entry_mut(&[0, 2]).await.unwrap();
assert_eq!(view.count().await.unwrap(), 2);
Trait Implementations§
source§impl<C, W> ClonableView<C> for ByteCollectionView<C, W>
impl<C, W> ClonableView<C> for ByteCollectionView<C, W>
source§fn clone_unchecked(&mut self) -> Result<Self, ViewError>
fn clone_unchecked(&mut self) -> Result<Self, ViewError>
source§impl<C, W> HashableView<C> for ByteCollectionView<C, W>
impl<C, W> HashableView<C> for ByteCollectionView<C, W>
§type Hasher = CoreWrapper<Sha3_256Core>
type Hasher = CoreWrapper<Sha3_256Core>
source§impl<C, W> View<C> for ByteCollectionView<C, W>
impl<C, W> View<C> for ByteCollectionView<C, W>
source§const NUM_INIT_KEYS: usize = 0usize
const NUM_INIT_KEYS: usize = 0usize
source§fn pre_load(_context: &C) -> Result<Vec<Vec<u8>>, ViewError>
fn pre_load(_context: &C) -> Result<Vec<Vec<u8>>, ViewError>
source§fn post_load(context: C, _values: &[Option<Vec<u8>>]) -> Result<Self, ViewError>
fn post_load(context: C, _values: &[Option<Vec<u8>>]) -> Result<Self, ViewError>
source§fn load<'async_trait>(
context: C,
) -> Pin<Box<dyn Future<Output = Result<Self, ViewError>> + Send + 'async_trait>>where
Self: 'async_trait,
fn load<'async_trait>(
context: C,
) -> Pin<Box<dyn Future<Output = Result<Self, ViewError>> + Send + 'async_trait>>where
Self: 'async_trait,
source§fn rollback(&mut self)
fn rollback(&mut self)
flush
should have no effect to storage.source§fn has_pending_changes<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = bool> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn has_pending_changes<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = bool> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
true
if flushing this view would result in changes to the persistent storage.source§fn flush(&mut self, batch: &mut Batch) -> Result<bool, ViewError>
fn flush(&mut self, batch: &mut Batch) -> Result<bool, ViewError>
batch
variable first. If the view is dropped without calling flush
, staged
changes are simply lost.
The returned boolean indicates whether the operation removes the view or not.Auto Trait Implementations§
impl<C, W> !Freeze for ByteCollectionView<C, W>
impl<C, W> !RefUnwindSafe for ByteCollectionView<C, W>
impl<C, W> Send for ByteCollectionView<C, W>
impl<C, W> Sync for ByteCollectionView<C, W>
impl<C, W> Unpin for ByteCollectionView<C, W>where
C: Unpin,
impl<C, W> UnwindSafe for ByteCollectionView<C, W>where
C: UnwindSafe,
W: RefUnwindSafe,
Blanket Implementations§
source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
§type ArchivedMetadata = ()
type ArchivedMetadata = ()
source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
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<Choices> CoproductSubsetter<CNil, HNil> for Choices
impl<Choices> CoproductSubsetter<CNil, HNil> for Choices
source§impl<F, W, T, D> Deserialize<With<T, W>, D> for F
impl<F, W, T, D> Deserialize<With<T, W>, D> for F
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> 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> LayoutRaw for T
impl<T> LayoutRaw for T
source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
source§impl<T> MockResults for T
impl<T> MockResults for T
§type Results = T
type Results = T
MockInstance
.source§impl<T> Pointable for T
impl<T> Pointable for T
source§impl<M, I> RuntimeMemory<&mut I> for Mwhere
M: RuntimeMemory<I>,
impl<M, I> RuntimeMemory<&mut I> for Mwhere
M: RuntimeMemory<I>,
source§fn read<'instance>(
&self,
instance: &'instance &mut I,
location: GuestPointer,
length: u32,
) -> Result<Cow<'instance, [u8]>, RuntimeError>
fn read<'instance>( &self, instance: &'instance &mut I, location: GuestPointer, length: u32, ) -> Result<Cow<'instance, [u8]>, RuntimeError>
Reads length
bytes from memory from the provided location
.
source§fn write(
&mut self,
instance: &mut &mut I,
location: GuestPointer,
bytes: &[u8],
) -> Result<(), RuntimeError>
fn write( &mut self, instance: &mut &mut I, location: GuestPointer, bytes: &[u8], ) -> Result<(), RuntimeError>
Writes the bytes
to memory at the provided location
.