use crate::{
SMut, SRef, State, StateMachineImpl, StateStorage, StateTrait, StateUnionDiscriminant,
};
use core::marker::PhantomData;
use core::ops::{Deref, DerefMut};
#[doc(hidden)]
pub struct StateWithProof<Storage, T, From, Proof>
where
T: StateMachineImpl,
Storage: StateStorage,
{
pub(crate) state: State<Storage, T, From>,
pub(crate) proof: Proof,
}
#[doc(hidden)]
pub struct StateUnionProvenState<Storage, T, From, Marker, To>
where
T: StateMachineImpl,
Storage: StateStorage,
From: StateTrait,
Marker: StateUnionDiscriminant,
To: StateTrait,
{
pub(crate) state: State<Storage, T, From>,
pub(crate) marker: PhantomData<fn() -> (Marker, To)>,
}
#[doc(hidden)]
pub struct StateConcreteProvenState<Storage, T, From, Marker, To>
where
T: StateMachineImpl,
Storage: StateStorage,
From: StateTrait,
Marker: StateUnionDiscriminant,
To: StateTrait,
{
pub(crate) state: State<Storage, T, From>,
pub(crate) marker: PhantomData<fn() -> (Marker, To)>,
}
impl<Storage, T, From, Marker, To> Deref for StateUnionProvenState<Storage, T, From, Marker, To>
where
T: StateMachineImpl,
Storage: SRef,
From: StateTrait,
Marker: StateUnionDiscriminant,
To: StateTrait,
{
type Target = T;
fn deref(&self) -> &Self::Target {
Storage::s_ref(&self.state.inner)
}
}
impl<Storage, T, From, Marker, To> DerefMut for StateUnionProvenState<Storage, T, From, Marker, To>
where
T: StateMachineImpl,
Storage: SMut,
From: StateTrait,
Marker: StateUnionDiscriminant,
To: StateTrait,
{
fn deref_mut(&mut self) -> &mut Self::Target {
Storage::s_mut(&mut self.state.inner)
}
}
impl<Storage, T, From, Marker, To> Deref for StateConcreteProvenState<Storage, T, From, Marker, To>
where
T: StateMachineImpl,
Storage: SRef,
From: StateTrait,
Marker: StateUnionDiscriminant,
To: StateTrait,
{
type Target = T;
fn deref(&self) -> &Self::Target {
Storage::s_ref(&self.state.inner)
}
}
impl<Storage, T, From, Marker, To> DerefMut
for StateConcreteProvenState<Storage, T, From, Marker, To>
where
T: StateMachineImpl,
Storage: SMut,
From: StateTrait,
Marker: StateUnionDiscriminant,
To: StateTrait,
{
fn deref_mut(&mut self) -> &mut Self::Target {
Storage::s_mut(&mut self.state.inner)
}
}