use crate::arch::Arch;
use crate::state::{AsSystemState, SystemState};
mod complex;
mod gpreg;
mod simple;
pub use complex::*;
pub use gpreg::*;
pub use simple::*;
#[derive(Clone)]
pub enum MaybeJitState<'j, A: Arch> {
SimpleJit(SimpleJitState<'j, A>),
ComplexJit(ComplexJitState<'j, A>),
Normal(SystemState<A>),
}
impl<A: Arch> std::fmt::Debug for MaybeJitState<'_, A> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Debug::fmt(self.as_system_state().as_ref(), f)
}
}
impl<A: Arch> From<SystemState<A>> for MaybeJitState<'_, A> {
fn from(value: SystemState<A>) -> Self {
Self::Normal(value)
}
}
impl<'j, A: Arch> From<SimpleJitState<'j, A>> for MaybeJitState<'j, A> {
fn from(value: SimpleJitState<'j, A>) -> Self {
Self::SimpleJit(value)
}
}
impl<'j, A: Arch> From<ComplexJitState<'j, A>> for MaybeJitState<'j, A> {
fn from(value: ComplexJitState<'j, A>) -> Self {
Self::ComplexJit(value)
}
}
impl<A: Arch> AsSystemState<A> for MaybeJitState<'_, A> {
type Output<'a>
= MaybeRef<'a, A>
where
Self: 'a;
fn as_system_state(&self) -> Self::Output<'_> {
match self {
MaybeJitState::SimpleJit(jit) => MaybeRef::Ref(jit.as_system_state()),
MaybeJitState::ComplexJit(jit) => MaybeRef::ComplexRef(jit.as_system_state()),
MaybeJitState::Normal(state) => MaybeRef::Normal(state),
}
}
fn num_memory_mappings(&self) -> usize {
match self {
MaybeJitState::SimpleJit(v) => v.num_memory_mappings(),
MaybeJitState::ComplexJit(v) => v.num_memory_mappings(),
MaybeJitState::Normal(v) => v.num_memory_mappings(),
}
}
}
impl<A: Arch> AsSystemState<A> for &'_ MaybeJitState<'_, A> {
type Output<'a>
= MaybeRef<'a, A>
where
Self: 'a;
fn as_system_state(&self) -> Self::Output<'_> {
match self {
MaybeJitState::SimpleJit(jit) => MaybeRef::Ref(jit.as_system_state()),
MaybeJitState::ComplexJit(jit) => MaybeRef::ComplexRef(jit.as_system_state()),
MaybeJitState::Normal(state) => MaybeRef::Normal(state),
}
}
fn num_memory_mappings(&self) -> usize {
match self {
MaybeJitState::SimpleJit(v) => v.num_memory_mappings(),
MaybeJitState::ComplexJit(v) => v.num_memory_mappings(),
MaybeJitState::Normal(v) => v.num_memory_mappings(),
}
}
}
pub enum MaybeRef<'a, A: Arch> {
Ref(SimpleStateRef<'a, A>),
ComplexRef(ComplexStateRef<'a, A>),
Normal(&'a SystemState<A>),
}
impl<A: Arch> AsRef<SystemState<A>> for MaybeRef<'_, A> {
fn as_ref(&self) -> &SystemState<A> {
match self {
MaybeRef::Ref(r) => r.as_ref(),
MaybeRef::ComplexRef(r) => r.as_ref(),
MaybeRef::Normal(v) => v,
}
}
}