pub struct Interpreter<S, Tx = (), Ecal = NotSupportedEcal> { /* private fields */ }
Expand description

VM interpreter.

The internal state of the VM isn’t expose because the intended usage is to either inspect the resulting receipts after a transaction execution, or the resulting mutated transaction.

These can be obtained with the help of a crate::transactor::Transactor or a client implementation.

Implementations§

source§

impl<S, Tx, Ecal> Interpreter<S, Tx, Ecal>where Tx: Default,

source

pub fn with_storage(storage: S, interpreter_params: InterpreterParams) -> Self

Create a new interpreter instance out of a storage implementation.

If the provided storage implements crate::storage::InterpreterStorage, the returned interpreter will provide full functionality.

source§

impl<S, Tx, Ecal> Interpreter<S, Tx, Ecal>where S: Clone, Tx: ExecutableTransaction, Ecal: Clone,

source

pub fn build(&mut self) -> Self

Build the interpreter

source§

impl<Tx, Ecal> Interpreter<MemoryStorage, Tx, Ecal>where Tx: ExecutableTransaction, Ecal: EcalHandler,

source

pub fn with_memory_storage() -> Self

Create a new storage with a provided in-memory storage.

It will have full capabilities.

source§

impl<S, Tx, Ecal> Interpreter<Record<S>, Tx, Ecal>where S: InterpreterStorage, Tx: ExecutableTransaction,

source

pub fn remove_recording(self) -> Interpreter<S, Tx, Ecal>

Remove the [Recording] wrapper from the storage. Recording storage changes has an overhead so it’s useful to be able to remove it once the diff is generated.

source

pub fn storage_diff(&self) -> Diff<Deltas>

Get the diff of changes to this VMs storage.

source§

impl<S, Tx, Ecal> Interpreter<S, Tx, Ecal>where S: InterpreterStorage, Tx: ExecutableTransaction,

source

pub fn add_recording(self) -> Interpreter<Record<S>, Tx, Ecal>

Add a [Recording] wrapper around the storage to record any changes this VM makes to it’s storage. Recording storage changes has an overhead so should be used in production.

source

pub fn reset_vm_state(&mut self, diff: &Diff<InitialVmState>)where Tx: Clone + 'static,

Change this VMs internal state to match the initial state from this diff.

source§

impl<S, Tx, Ecal> Interpreter<S, Tx, Ecal>

source

pub fn diff(&self, other: &Self) -> Diff<Deltas>where Tx: PartialEq + Clone + Debug + 'static,

The diff function generates a diff of VM state, represented by the Diff struct, between two VMs internal states.

source§

impl<S, Tx, Ecal> Interpreter<S, Tx, Ecal>where S: InterpreterStorage, Tx: ExecutableTransaction, Ecal: EcalHandler,

source

pub fn execute( &mut self ) -> Result<ExecuteState, InterpreterError<S::DataError>>

Execute the current instruction located in $m[$pc].

source

pub fn instruction<R: Into<RawInstruction> + Copy>( &mut self, raw: R ) -> Result<ExecuteState, InterpreterError<S::DataError>>

Execute a provided instruction

source§

impl<Tx> Interpreter<PredicateStorage, Tx>where Tx: ExecutableTransaction,

source

pub fn check_predicates( checked: &Checked<Tx>, params: &CheckPredicateParams ) -> Result<PredicatesChecked, PredicateVerificationFailed>where <Tx as IntoChecked>::Metadata: CheckedMetadata,

Initialize the VM with the provided transaction and check all predicates defined in the inputs.

The storage provider is not used since contract opcodes are not allowed for predicates.

source

pub async fn check_predicates_async<E>( checked: &Checked<Tx>, params: &CheckPredicateParams ) -> Result<PredicatesChecked, PredicateVerificationFailed>where Tx: Send + 'static, <Tx as IntoChecked>::Metadata: CheckedMetadata, E: ParallelExecutor,

Initialize the VM with the provided transaction and check all predicates defined in the inputs in parallel.

The storage provider is not used since contract opcodes are not allowed for predicates.

source

pub fn estimate_predicates( transaction: &mut Tx, params: &CheckPredicateParams ) -> Result<PredicatesChecked, PredicateVerificationFailed>

Initialize the VM with the provided transaction, check all predicates defined in the inputs and set the predicate_gas_used to be the actual gas consumed during execution for each predicate.

The storage provider is not used since contract opcodes are not allowed for predicates.

source

pub async fn estimate_predicates_async<E>( transaction: &mut Tx, params: &CheckPredicateParams ) -> Result<PredicatesChecked, PredicateVerificationFailed>where Tx: Send + 'static, E: ParallelExecutor,

Initialize the VM with the provided transaction, check all predicates defined in the inputs and set the predicate_gas_used to be the actual gas consumed during execution for each predicate in parallel.

The storage provider is not used since contract opcodes are not allowed for predicates.

source§

impl<S, Tx, Ecal> Interpreter<S, Tx, Ecal>where S: InterpreterStorage, Tx: ExecutableTransaction, <Tx as IntoChecked>::Metadata: CheckedMetadata, Ecal: EcalHandler,

source

pub fn transact_owned( storage: S, tx: Checked<Tx>, params: InterpreterParams ) -> Result<StateTransition<Tx>, InterpreterError<S::DataError>>

Allocate internally a new instance of Interpreter with the provided storage, initialize it with the provided transaction and return the result of th execution in form of StateTransition

source

pub fn transact( &mut self, tx: Checked<Tx> ) -> Result<StateTransitionRef<'_, Tx>, InterpreterError<S::DataError>>

Initialize a pre-allocated instance of Interpreter with the provided transaction and execute it. The result will be bound to the lifetime of the interpreter and will avoid unnecessary copy with the data that can be referenced from the interpreter instance itself.

source§

impl<S, Tx, Ecal> Interpreter<S, Tx, Ecal>where S: InterpreterStorage,

source

pub fn deploy( &mut self, tx: Checked<Create> ) -> Result<Create, InterpreterError<S::DataError>>

Deploys Create transaction without initialization VM and without invalidation of the last state of execution of the Script transaction.

Returns Create transaction with all modifications after execution.

source§

impl<S, Tx, Ecal> Interpreter<S, Tx, Ecal>where S: InterpreterStorage, Tx: ExecutableTransaction, Ecal: EcalHandler,

source

pub fn resume(&mut self) -> Result<ProgramState, InterpreterError<S::DataError>>

Continue the execution from a previously interrupted program flow.

source§

impl<S, Tx, Ecal> Interpreter<S, Tx, Ecal>where S: InterpreterStorage, Tx: ExecutableTransaction,

source

pub fn prepare_call( &mut self, ra: RegId, rb: RegId, rc: RegId, rd: RegId ) -> IoResult<(), S::DataError>

Prepare a call instruction for execution

source§

impl<S, Tx, Ecal> Interpreter<S, Tx, Ecal>

source

pub fn remaining_gas(&self) -> Word

Global remaining gas amount

source

pub fn gas_charge(&mut self, gas: Word) -> SimpleResult<()>

Do a gas charge with the given amount, panicing when running out of gas.

source§

impl<S, Tx, Ecal> Interpreter<S, Tx, Ecal>where Tx: ExecutableTransaction, S: InterpreterStorage,

source

pub fn init_predicate( &mut self, context: Context, tx: Tx, gas_limit: Word ) -> Result<(), InterpreterError<S::DataError>>

Initialize the VM for a predicate context

source§

impl<S, Tx, Ecal> Interpreter<S, Tx, Ecal>where S: InterpreterStorage, <S as InterpreterStorage>::DataError: From<S::DataError>, Tx: ExecutableTransaction, <Tx as IntoChecked>::Metadata: CheckedMetadata,

source

pub fn init_script( &mut self, checked: Checked<Tx> ) -> Result<(), InterpreterError<S::DataError>>

Initialize the VM with a given transaction, backed by a storage provider that allows execution of contract opcodes.

For predicate estimation and verification, check Self::init_predicate

source§

impl<S, Tx, Ecal> Interpreter<S, Tx, Ecal>

source

pub fn allocate(&mut self, a: Word) -> SimpleResult<()>

Expand heap by a bytes.

source§

impl<S, Tx, Ecal> Interpreter<S, Tx, Ecal>where Tx: ExecutableTransaction,

source

pub const fn single_stepping(&self) -> bool

Get single-stepping mode

source

pub fn set_single_stepping(&mut self, single_stepping: bool)

Set single-stepping mode

source

pub fn set_breakpoint(&mut self, breakpoint: Breakpoint)

Set a new breakpoint for the provided location.

source

pub fn remove_breakpoint(&mut self, breakpoint: &Breakpoint)

Remove a previously set breakpoint.

source§

impl<S, Tx, Ecal> Interpreter<S, Tx, Ecal>

source

pub fn memory(&self) -> &[u8]

Returns the current state of the VM memory

source

pub fn memory_mut(&mut self) -> &mut [u8]

Returns mutable access to the vm memory

source

pub const fn registers(&self) -> &[Word]

Returns the current state of the registers

source

pub fn registers_mut(&mut self) -> &mut [Word]

Returns mutable access to the registers

source

pub const fn debugger(&self) -> &Debugger

Debug handler

source

pub fn transaction(&self) -> &Tx

The current transaction.

source

pub fn initial_balances(&self) -> &InitialBalances

The initial balances.

source

pub fn max_inputs(&self) -> u8

Get max_inputs value

source

pub fn gas_costs(&self) -> &GasCosts

Gas costs for opcodes

source

pub fn fee_params(&self) -> &FeeParameters

Get the Fee Parameters

source

pub fn base_asset_id(&self) -> &AssetId

Get the base Asset ID

source

pub fn contract_max_size(&self) -> u64

Get contract_max_size value

source

pub fn tx_offset(&self) -> usize

Get tx_offset value

source

pub fn max_message_data_length(&self) -> u64

Get max_message_data_length value

source

pub fn chain_id(&self) -> ChainId

Get the chain id

source

pub fn receipts(&self) -> &[Receipt]

Receipts generated by a transaction execution.

Trait Implementations§

source§

impl<S, Tx, Ecal> AsMut<S> for Interpreter<S, Tx, Ecal>

source§

fn as_mut(&mut self) -> &mut S

Converts this type into a mutable reference of the (usually inferred) input type.
source§

impl<S, Tx, Ecal> AsRef<Interpreter<S, Tx, Ecal>> for Transactor<S, Tx, Ecal>where Tx: ExecutableTransaction, S: InterpreterStorage,

source§

fn as_ref(&self) -> &Interpreter<S, Tx, Ecal>

Converts this type into a shared reference of the (usually inferred) input type.
source§

impl<S, Tx, Ecal> AsRef<S> for Interpreter<S, Tx, Ecal>

source§

fn as_ref(&self) -> &S

Converts this type into a shared reference of the (usually inferred) input type.
source§

impl<S: Clone, Tx: Clone, Ecal: Clone> Clone for Interpreter<S, Tx, Ecal>

source§

fn clone(&self) -> Interpreter<S, Tx, Ecal>

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<S: Debug, Tx: Debug, Ecal: Debug> Debug for Interpreter<S, Tx, Ecal>

source§

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

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

impl<S, Tx, Ecal> Default for Interpreter<S, Tx, Ecal>where S: Default, Tx: ExecutableTransaction, Ecal: EcalHandler,

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl<S, Tx, Ecal> From<Interpreter<S, Tx, Ecal>> for Transactor<S, Tx, Ecal>where Tx: ExecutableTransaction, S: InterpreterStorage,

source§

fn from(interpreter: Interpreter<S, Tx, Ecal>) -> Self

Converts to this type from the input type.
source§

impl<S, Tx, Ecal> From<Transactor<S, Tx, Ecal>> for Interpreter<S, Tx, Ecal>where Tx: ExecutableTransaction, S: InterpreterStorage,

source§

fn from(transactor: Transactor<S, Tx, Ecal>) -> Self

Converts to this type from the input type.
source§

impl<S, Tx, Ecal> PartialEq for Interpreter<S, Tx, Ecal>where Tx: PartialEq,

source§

fn eq(&self, other: &Self) -> bool

Does not compare storage, debugger or profiler

1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.

Auto Trait Implementations§

§

impl<S, Tx, Ecal> RefUnwindSafe for Interpreter<S, Tx, Ecal>where Ecal: RefUnwindSafe, S: RefUnwindSafe, Tx: RefUnwindSafe,

§

impl<S, Tx, Ecal> Send for Interpreter<S, Tx, Ecal>where Ecal: Send, S: Send, Tx: Send,

§

impl<S, Tx, Ecal> Sync for Interpreter<S, Tx, Ecal>where Ecal: Sync, S: Sync, Tx: Sync,

§

impl<S, Tx, Ecal> Unpin for Interpreter<S, Tx, Ecal>where Ecal: Unpin, S: Unpin, Tx: Unpin,

§

impl<S, Tx, Ecal> UnwindSafe for Interpreter<S, Tx, Ecal>where Ecal: UnwindSafe, S: UnwindSafe, Tx: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> AnyDebug for Twhere T: Any + Debug,

source§

fn as_any_ref(&self) -> &(dyn Any + 'static)

Returns a reference to the underlying type as Any.
§

impl<A, T> AsBits<T> for Awhere A: AsRef<[T]>, T: BitStore,

§

fn as_bits<O>(&self) -> &BitSlice<T, O> where O: BitOrder,

Views self as an immutable bit-slice region with the O ordering.
§

fn try_as_bits<O>(&self) -> Result<&BitSlice<T, O>, BitSpanError<T>>where O: BitOrder,

Attempts to view self as an immutable bit-slice region with the O ordering. Read more
§

impl<A, T> AsMutBits<T> for Awhere A: AsMut<[T]>, T: BitStore,

§

fn as_mut_bits<O>(&mut self) -> &mut BitSlice<T, O> where O: BitOrder,

Views self as a mutable bit-slice region with the O ordering.
§

fn try_as_mut_bits<O>(&mut self) -> Result<&mut BitSlice<T, O>, BitSpanError<T>>where O: BitOrder,

Attempts to view self as a mutable bit-slice region with the O ordering. Read more
§

impl<T> Base32Len for Twhere T: AsRef<[u8]>,

§

fn base32_len(&self) -> usize

Calculate the base32 serialized length
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CheckBase32<Vec<u5>> for Twhere T: AsRef<[u8]>,

§

type Err = Error

Error type if conversion fails
§

fn check_base32(self) -> Result<Vec<u5>, <T as CheckBase32<Vec<u5>>>::Err>

Check if all values are in range and return array-like struct of u5 values
§

impl<T> Conv for T

§

fn conv<T>(self) -> Twhere Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere 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.

§

impl<T> Pipe for Twhere T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R ) -> Rwhere Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> Rwhere Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R ) -> Rwhere Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> StorageAsMut for T

source§

fn storage<Type>(&mut self) -> StorageMut<'_, Self, Type>where Type: Mappable,

source§

fn storage_as_mut<Type>(&mut self) -> StorageMut<'_, Self, Type>where Type: Mappable,

source§

impl<T> StorageAsRef for T

source§

fn storage<Type>(&self) -> StorageRef<'_, Self, Type>where Type: Mappable,

source§

fn storage_as_ref<Type>(&self) -> StorageRef<'_, Self, Type>where Type: Mappable,

§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Selfwhere Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
§

impl<T> ToBase32 for Twhere T: AsRef<[u8]>,

§

fn write_base32<W>(&self, writer: &mut W) -> Result<(), <W as WriteBase32>::Err>where W: WriteBase32,

Encode as base32 and write it to the supplied writer Implementations shouldn’t allocate.
§

fn to_base32(&self) -> Vec<u5>

Convert Self to base32 vector
source§

impl<T> ToHex for Twhere T: AsRef<[u8]>,

source§

fn encode_hex<U>(&self) -> Uwhere U: FromIterator<char>,

Encode the hex strict representing self into the result. Lower case letters are used (e.g. f9b4ca)
source§

fn encode_hex_upper<U>(&self) -> Uwhere U: FromIterator<char>,

Encode the hex strict representing self into the result. Upper case letters are used (e.g. F9B4CA)
source§

impl<T> ToOwned for Twhere T: Clone,

§

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
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

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 Twhere U: TryFrom<T>,

§

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.
§

impl<V, T> VZip<V> for Twhere V: MultiLane<T>,

§

fn vzip(self) -> V