use crate::analysis::cpa::residue::Residue;
use crate::analysis::cpa::state::LocationState;
use crate::analysis::cpa::{
ConfigurableProgramAnalysis, IntoState, RunnableConfigurableProgramAnalysis,
};
use crate::analysis::pcode_store::{EntryPoint, PcodeStore};
use crate::modeling::machine::cpu::concrete::ConcretePcodeAddress;
pub mod cfg;
pub mod compound;
pub mod cpa;
pub mod ctl;
pub mod location;
#[expect(unused)]
mod path;
pub mod pcode_store;
pub mod valuation;
pub mod varnode;
pub mod varnode_map;
pub trait Analysis
where
Self: RunnableConfigurableProgramAnalysis,
Self::State: LocationState,
{
fn run<'op, T: PcodeStore<'op> + ?Sized, I: IntoState<Self>>(
&self,
store: &'op T,
initial_state: I,
) -> <<Self as ConfigurableProgramAnalysis>::Reducer<'op> as Residue<'op, Self::State>>::Output
where
Self::State: 'op,
{
let initial = initial_state.into_state(self);
self.run_cpa(initial, store)
}
}
impl<T> Analysis for T
where
T: RunnableConfigurableProgramAnalysis,
T::State: LocationState,
{
}
pub trait AnalyzableEntry: for<'op> PcodeStore<'op> + EntryPoint + Sized {
fn run_analysis<'op, T: Analysis>(
&'op self,
t: T,
) -> <<T as ConfigurableProgramAnalysis>::Reducer<'op> as Residue<'op, T::State>>::Output
where
<T as ConfigurableProgramAnalysis>::State: LocationState + 'op,
ConcretePcodeAddress: IntoState<T>,
{
let state = self.get_entry();
t.run(self, state)
}
}
impl<T: for<'op> PcodeStore<'op> + EntryPoint> AnalyzableEntry for T {}