pub struct IndexedMerkleTreeZeroCopyMut<'a, H, I, const HEIGHT: usize>where
H: Hasher,
I: CheckedAdd + CheckedSub + Copy + Clone + PartialOrd + ToBytes + TryFrom<usize> + Unsigned + Pod,
usize: From<I>,{
pub merkle_tree: &'a mut IndexedMerkleTree<'a, H, I, HEIGHT>,
}Fields§
§merkle_tree: &'a mut IndexedMerkleTree<'a, H, I, HEIGHT>Implementations§
source§impl<'a, H, I, const HEIGHT: usize> IndexedMerkleTreeZeroCopyMut<'a, H, I, HEIGHT>where
H: Hasher,
I: CheckedAdd + CheckedSub + Copy + Clone + PartialOrd + ToBytes + TryFrom<usize> + Unsigned + Pod,
usize: From<I>,
impl<'a, H, I, const HEIGHT: usize> IndexedMerkleTreeZeroCopyMut<'a, H, I, HEIGHT>where
H: Hasher,
I: CheckedAdd + CheckedSub + Copy + Clone + PartialOrd + ToBytes + TryFrom<usize> + Unsigned + Pod,
usize: From<I>,
sourcepub unsafe fn struct_from_bytes_zero_copy_mut(
bytes_struct: &'a [u8]
) -> Result<Self, IndexedMerkleTreeError>
pub unsafe fn struct_from_bytes_zero_copy_mut( bytes_struct: &'a [u8] ) -> Result<Self, IndexedMerkleTreeError>
Casts a byte slice into wrapped IndexedMerkleTree structure mutable
reference, without dynamic fields.
§Purpose
This method is meant to be used mostly in Solana programs, where memory constraints are tight and we want to make sure no data is copied.
§Safety
This is highly unsafe. Ensuring the alignment and that the slice provides actual data of the hash set is the caller’s responsibility.
Calling it in async context (or anyhwere where the underlying data can be moved in the memory) is certainly going to cause undefined behavior.
sourcepub unsafe fn fill_vectors_mut(
&mut self,
bytes_filled_subtrees: &'a mut [u8],
bytes_changelog: &'a mut [u8],
bytes_roots: &'a mut [u8],
bytes_canopy: &'a mut [u8],
subtrees_length: usize,
changelog_length: usize,
changelog_capacity: usize,
changelog_first_index: usize,
changelog_last_index: usize,
roots_length: usize,
roots_capacity: usize,
roots_first_index: usize,
roots_last_index: usize,
canopy_length: usize,
bytes_indexed_changelog: &'a mut [u8],
indexed_changelog_length: usize,
indexed_changelog_capacity: usize,
indexed_changelog_first_index: usize,
indexed_changelog_last_index: usize
) -> Result<(), IndexedMerkleTreeError>
pub unsafe fn fill_vectors_mut( &mut self, bytes_filled_subtrees: &'a mut [u8], bytes_changelog: &'a mut [u8], bytes_roots: &'a mut [u8], bytes_canopy: &'a mut [u8], subtrees_length: usize, changelog_length: usize, changelog_capacity: usize, changelog_first_index: usize, changelog_last_index: usize, roots_length: usize, roots_capacity: usize, roots_first_index: usize, roots_last_index: usize, canopy_length: usize, bytes_indexed_changelog: &'a mut [u8], indexed_changelog_length: usize, indexed_changelog_capacity: usize, indexed_changelog_first_index: usize, indexed_changelog_last_index: usize ) -> Result<(), IndexedMerkleTreeError>
Fills the dynamic fields (vectors) of a newly created
IndexerMerkleTreeZeroCopyMut with the data from provided buffers.
§Safety
This is highly unsafe. Ensuring the alignment and that the slice provides actual data of the hash set is the caller’s responsibility.
Calling it in async context (or anyhwere where the underlying data can be moved in the memory) is certainly going to cause undefined behavior.
sourcepub unsafe fn from_bytes_zero_copy_init(
bytes_struct: &'a mut [u8],
bytes_filled_subtrees: &'a mut [u8],
bytes_changelog: &'a mut [u8],
bytes_roots: &'a mut [u8],
bytes_canopy: &'a mut [u8],
height: usize,
changelog_size: usize,
roots_size: usize,
canopy_depth: usize,
bytes_indexed_changelog: &'a mut [u8],
indexed_changelog_size: usize
) -> Result<Self, IndexedMerkleTreeError>
pub unsafe fn from_bytes_zero_copy_init( bytes_struct: &'a mut [u8], bytes_filled_subtrees: &'a mut [u8], bytes_changelog: &'a mut [u8], bytes_roots: &'a mut [u8], bytes_canopy: &'a mut [u8], height: usize, changelog_size: usize, roots_size: usize, canopy_depth: usize, bytes_indexed_changelog: &'a mut [u8], indexed_changelog_size: usize ) -> Result<Self, IndexedMerkleTreeError>
Casts byte slices into IndexedMerkleTreeZeroCopyMut and initializes
the underlying Merkle tree.
§Safety
This is highly unsafe. Ensuring the size and alignment of the byte slices is the caller’s responsibility.
sourcepub unsafe fn from_bytes_zero_copy_mut(
bytes_struct: &'a mut [u8],
bytes_filled_subtrees: &'a mut [u8],
bytes_changelog: &'a mut [u8],
bytes_roots: &'a mut [u8],
bytes_canopy: &'a mut [u8],
bytes_indexed_changelog: &'a mut [u8]
) -> Result<Self, IndexedMerkleTreeError>
pub unsafe fn from_bytes_zero_copy_mut( bytes_struct: &'a mut [u8], bytes_filled_subtrees: &'a mut [u8], bytes_changelog: &'a mut [u8], bytes_roots: &'a mut [u8], bytes_canopy: &'a mut [u8], bytes_indexed_changelog: &'a mut [u8] ) -> Result<Self, IndexedMerkleTreeError>
Casts byte slices into IndexedMerkleTreeZeroCopyMut.
§Safety
This is highly unsafe. Ensuring the size and alignment of the byte slices is the caller’s responsibility.
Trait Implementations§
source§impl<'a, H, I, const HEIGHT: usize> Debug for IndexedMerkleTreeZeroCopyMut<'a, H, I, HEIGHT>where
H: Hasher + Debug,
I: CheckedAdd + CheckedSub + Copy + Clone + PartialOrd + ToBytes + TryFrom<usize> + Unsigned + Pod + Debug,
usize: From<I>,
impl<'a, H, I, const HEIGHT: usize> Debug for IndexedMerkleTreeZeroCopyMut<'a, H, I, HEIGHT>where
H: Hasher + Debug,
I: CheckedAdd + CheckedSub + Copy + Clone + PartialOrd + ToBytes + TryFrom<usize> + Unsigned + Pod + Debug,
usize: From<I>,
Auto Trait Implementations§
impl<'a, H, I, const HEIGHT: usize> Freeze for IndexedMerkleTreeZeroCopyMut<'a, H, I, HEIGHT>
impl<'a, H, I, const HEIGHT: usize> RefUnwindSafe for IndexedMerkleTreeZeroCopyMut<'a, H, I, HEIGHT>
impl<'a, H, I, const HEIGHT: usize> Send for IndexedMerkleTreeZeroCopyMut<'a, H, I, HEIGHT>
impl<'a, H, I, const HEIGHT: usize> Sync for IndexedMerkleTreeZeroCopyMut<'a, H, I, HEIGHT>
impl<'a, H, I, const HEIGHT: usize> Unpin for IndexedMerkleTreeZeroCopyMut<'a, H, I, HEIGHT>
impl<'a, H, I, const HEIGHT: usize> !UnwindSafe for IndexedMerkleTreeZeroCopyMut<'a, H, I, HEIGHT>
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> 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 more