pub struct PodStateWithExtensionsMut<'data, S: BaseState> {
pub base: &'data mut S,
/* private fields */
}
Expand description
Encapsulates mutable base state data (mint or account) with possible extensions, where the base state is Pod for zero-copy serde.
Fields§
§base: &'data mut S
Unpacked base data
Implementations§
source§impl<'data, S: BaseState + Pod> PodStateWithExtensionsMut<'data, S>
impl<'data, S: BaseState + Pod> PodStateWithExtensionsMut<'data, S>
sourcepub fn unpack(input: &'data mut [u8]) -> Result<Self, ProgramError>
pub fn unpack(input: &'data mut [u8]) -> Result<Self, ProgramError>
Unpack base state, leaving the extension data as a mutable slice
Fails if the base state is not initialized.
sourcepub fn unpack_uninitialized(
input: &'data mut [u8],
) -> Result<Self, ProgramError>
pub fn unpack_uninitialized( input: &'data mut [u8], ) -> Result<Self, ProgramError>
Unpack an uninitialized base state, leaving the extension data as a mutable slice
Fails if the base state has already been initialized.
Trait Implementations§
source§impl<'a, S: BaseState> BaseStateWithExtensions<S> for PodStateWithExtensionsMut<'a, S>
impl<'a, S: BaseState> BaseStateWithExtensions<S> for PodStateWithExtensionsMut<'a, S>
source§fn get_tlv_data(&self) -> &[u8] ⓘ
fn get_tlv_data(&self) -> &[u8] ⓘ
Get the buffer containing all extension data
source§fn get_extension_bytes<V: Extension>(&self) -> Result<&[u8], ProgramError>
fn get_extension_bytes<V: Extension>(&self) -> Result<&[u8], ProgramError>
Fetch the bytes for a TLV entry
source§fn get_extension<V: Extension + Pod>(&self) -> Result<&V, ProgramError>
fn get_extension<V: Extension + Pod>(&self) -> Result<&V, ProgramError>
Unpack a portion of the TLV data as the desired type
source§fn get_variable_len_extension<V: Extension + VariableLenPack>(
&self,
) -> Result<V, ProgramError>
fn get_variable_len_extension<V: Extension + VariableLenPack>( &self, ) -> Result<V, ProgramError>
Unpacks a portion of the TLV data as the desired variable-length type
source§fn get_extension_types(&self) -> Result<Vec<ExtensionType>, ProgramError>
fn get_extension_types(&self) -> Result<Vec<ExtensionType>, ProgramError>
Iterates through the TLV entries, returning only the types
source§fn get_first_extension_type(
&self,
) -> Result<Option<ExtensionType>, ProgramError>
fn get_first_extension_type( &self, ) -> Result<Option<ExtensionType>, ProgramError>
Get just the first extension type, useful to track mixed initializations
source§fn try_get_account_len(&self) -> Result<usize, ProgramError>
fn try_get_account_len(&self) -> Result<usize, ProgramError>
Get the total number of bytes used by TLV entries and the base type
source§fn try_get_new_account_len<V: Extension + Pod>(
&self,
) -> Result<usize, ProgramError>
fn try_get_new_account_len<V: Extension + Pod>( &self, ) -> Result<usize, ProgramError>
Calculate the new expected size if the state allocates the given
fixed-length extension instance.
If the state already has the extension, the resulting account length
will be unchanged.
source§fn try_get_new_account_len_for_variable_len_extension<V: Extension + VariableLenPack>(
&self,
new_extension: &V,
) -> Result<usize, ProgramError>
fn try_get_new_account_len_for_variable_len_extension<V: Extension + VariableLenPack>( &self, new_extension: &V, ) -> Result<usize, ProgramError>
Calculate the new expected size if the state allocates the given
variable-length extension instance.
source§impl<'a, S: BaseState> BaseStateWithExtensionsMut<S> for PodStateWithExtensionsMut<'a, S>
impl<'a, S: BaseState> BaseStateWithExtensionsMut<S> for PodStateWithExtensionsMut<'a, S>
source§fn get_tlv_data_mut(&mut self) -> &mut [u8] ⓘ
fn get_tlv_data_mut(&mut self) -> &mut [u8] ⓘ
Get the underlying TLV data as mutable
source§fn get_account_type_mut(&mut self) -> &mut [u8] ⓘ
fn get_account_type_mut(&mut self) -> &mut [u8] ⓘ
Get the underlying account type as mutable
source§fn get_extension_bytes_mut<V: Extension>(
&mut self,
) -> Result<&mut [u8], ProgramError>
fn get_extension_bytes_mut<V: Extension>( &mut self, ) -> Result<&mut [u8], ProgramError>
Unpack a portion of the TLV data as the base mutable bytes
source§fn get_extension_mut<V: Extension + Pod>(
&mut self,
) -> Result<&mut V, ProgramError>
fn get_extension_mut<V: Extension + Pod>( &mut self, ) -> Result<&mut V, ProgramError>
Unpack a portion of the TLV data as the desired type that allows
modifying the type
source§fn pack_variable_len_extension<V: Extension + VariableLenPack>(
&mut self,
extension: &V,
) -> Result<(), ProgramError>
fn pack_variable_len_extension<V: Extension + VariableLenPack>( &mut self, extension: &V, ) -> Result<(), ProgramError>
Packs a variable-length extension into its appropriate data segment.
Fails if space hasn’t already been allocated for the given extension
source§fn init_extension<V: Extension + Pod + Default>(
&mut self,
overwrite: bool,
) -> Result<&mut V, ProgramError>
fn init_extension<V: Extension + Pod + Default>( &mut self, overwrite: bool, ) -> Result<&mut V, ProgramError>
Packs the default extension data into an open slot if not already found
in the data buffer. If extension is already found in the buffer, it
overwrites the existing extension with the default state if
overwrite
is set. If extension found, but overwrite
is not set,
it returns error.source§fn realloc_variable_len_extension<V: Extension + VariableLenPack>(
&mut self,
new_extension: &V,
) -> Result<(), ProgramError>
fn realloc_variable_len_extension<V: Extension + VariableLenPack>( &mut self, new_extension: &V, ) -> Result<(), ProgramError>
Reallocate and overwite the TLV entry for the given variable-length
extension. Read more
source§fn realloc<V: Extension + VariableLenPack>(
&mut self,
length: usize,
) -> Result<&mut [u8], ProgramError>
fn realloc<V: Extension + VariableLenPack>( &mut self, length: usize, ) -> Result<&mut [u8], ProgramError>
Reallocate the TLV entry for the given extension to the given number of
bytes. Read more
source§fn init_variable_len_extension<V: Extension + VariableLenPack>(
&mut self,
extension: &V,
overwrite: bool,
) -> Result<(), ProgramError>
fn init_variable_len_extension<V: Extension + VariableLenPack>( &mut self, extension: &V, overwrite: bool, ) -> Result<(), ProgramError>
Allocate the given number of bytes for the given variable-length
extension and write its contents into the TLV buffer. Read more
source§fn alloc<V: Extension>(
&mut self,
length: usize,
overwrite: bool,
) -> Result<&mut [u8], ProgramError>
fn alloc<V: Extension>( &mut self, length: usize, overwrite: bool, ) -> Result<&mut [u8], ProgramError>
Allocate some space for the extension in the TLV data
source§fn init_account_extension_from_type(
&mut self,
extension_type: ExtensionType,
) -> Result<(), ProgramError>
fn init_account_extension_from_type( &mut self, extension_type: ExtensionType, ) -> Result<(), ProgramError>
If
extension_type
is an Account-associated ExtensionType that requires
initialization on InitializeAccount, this method packs the default
relevant Extension of an ExtensionType into an open slot if not
already found in the data buffer, otherwise overwrites the
existing extension with the default state. For all other ExtensionTypes,
this is a no-op.source§fn init_account_type(&mut self) -> Result<(), ProgramError>
fn init_account_type(&mut self) -> Result<(), ProgramError>
Write the account type into the buffer, done during the base
state initialization
Noops if there is no room for an extension in the account, needed for
pure base mints / accounts.
source§fn check_account_type_matches_extension_type(&self) -> Result<(), ProgramError>
fn check_account_type_matches_extension_type(&self) -> Result<(), ProgramError>
Check that the account type on the account (if initialized) matches the
account type for any extensions initialized on the TLV data
source§impl<'data, S: PartialEq + BaseState> PartialEq for PodStateWithExtensionsMut<'data, S>
impl<'data, S: PartialEq + BaseState> PartialEq for PodStateWithExtensionsMut<'data, S>
source§fn eq(&self, other: &PodStateWithExtensionsMut<'data, S>) -> bool
fn eq(&self, other: &PodStateWithExtensionsMut<'data, S>) -> bool
This method tests for
self
and other
values to be equal, and is used
by ==
.impl<'data, S: BaseState> StructuralPartialEq for PodStateWithExtensionsMut<'data, S>
Auto Trait Implementations§
impl<'data, S> Freeze for PodStateWithExtensionsMut<'data, S>
impl<'data, S> RefUnwindSafe for PodStateWithExtensionsMut<'data, S>where
S: RefUnwindSafe,
impl<'data, S> Send for PodStateWithExtensionsMut<'data, S>where
S: Send,
impl<'data, S> Sync for PodStateWithExtensionsMut<'data, S>where
S: Sync,
impl<'data, S> Unpin for PodStateWithExtensionsMut<'data, S>
impl<'data, S> !UnwindSafe for PodStateWithExtensionsMut<'data, S>
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
Mutably borrows from an owned value. Read more
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>
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 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>
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