liblisa 0.1.4

A tool for automated discovery and analysis of the ISA of a CPU.
Documentation
use std::marker::PhantomData;

use super::{Observation, Oracle};
use crate::arch::Arch;
use crate::state::AsSystemState;

pub(crate) struct FallbackBatchObserveIter<'a, A: Arch, O: Oracle<A>, S: AsSystemState<A>, I: Iterator<Item = S>> {
    oracle: &'a mut O,
    iter: I,
    _phantom: PhantomData<A>,
}

impl<'a, A: Arch, O: Oracle<A>, S: AsSystemState<A>, I: Iterator<Item = S>> FallbackBatchObserveIter<'a, A, O, S, I> {
    pub fn new(oracle: &'a mut O, iter: I) -> Self {
        FallbackBatchObserveIter {
            oracle,
            iter,
            _phantom: PhantomData,
        }
    }
}

impl<A: Arch, O: Oracle<A>, S: AsSystemState<A>, I: Iterator<Item = S>> Iterator for FallbackBatchObserveIter<'_, A, O, S, I> {
    type Item = Observation<S, A>;

    fn next(&mut self) -> Option<Self::Item> {
        self.iter.next().map(|item| {
            let result = self.oracle.observe(item.as_system_state().as_ref());
            (item, result)
        })
    }
}