use crate::traits::*;
pub struct OutputSelection<'a, T, TermId> {
s: &'a T,
output: TermId,
}
impl<'a, T: BooleanSystem> OutputSelection<'a, T, T::TermId> {
pub fn new(boolean_system: &'a T, output: T::TermId) -> Self {
Self {
s: boolean_system,
output,
}
}
}
impl<'a, T: NumInputs, TermId> NumInputs for OutputSelection<'a, T, TermId> {
fn num_inputs(&self) -> usize {
self.s.num_inputs()
}
}
impl<'a, T: NumOutputs, TermId> NumOutputs for OutputSelection<'a, T, TermId> {
fn num_outputs(&self) -> usize {
self.s.num_outputs()
}
}
impl<'a, T: PartialBooleanSystem> PartialBooleanSystem for OutputSelection<'a, T, T::TermId> {
type LiteralId = T::LiteralId;
type TermId = ();
fn evaluate_term_partial(&self, _term: &Self::TermId, input_values: &[bool]) -> Option<bool> {
self.s.evaluate_term_partial(&self.output, input_values)
}
}
impl<'a, T: BooleanSystem> BooleanSystem for OutputSelection<'a, T, T::TermId> {
fn evaluate_term(&self, _term: &Self::TermId, input_values: &[bool]) -> bool {
self.s.evaluate_term(&self.output, input_values)
}
}
impl<'a, T, TermId> StaticNumOutputs<1> for OutputSelection<'a, T, TermId> {}
impl<'a, T: PartialBooleanSystem> PartialBooleanFunction for OutputSelection<'a, T, T::TermId> {
fn partial_eval(&self, input_values: &[bool]) -> Option<bool> {
self.evaluate_term_partial(&(), input_values)
}
}
impl<'a, T: BooleanSystem> BooleanFunction for OutputSelection<'a, T, T::TermId> {
fn eval(&self, input_values: &[bool]) -> bool {
self.evaluate_term(&(), input_values)
}
}