libreda_logic/
adaptors.rs1use crate::traits::*;
8
9pub struct OutputSelection<'a, T, TermId> {
36 s: &'a T,
37 output: TermId,
38}
39
40impl<'a, T: BooleanSystem> OutputSelection<'a, T, T::TermId> {
41 pub fn new(boolean_system: &'a T, output: T::TermId) -> Self {
43 Self {
44 s: boolean_system,
45 output,
46 }
47 }
48}
49
50impl<'a, T: NumInputs, TermId> NumInputs for OutputSelection<'a, T, TermId> {
51 fn num_inputs(&self) -> usize {
52 self.s.num_inputs()
53 }
54}
55
56impl<'a, T: NumOutputs, TermId> NumOutputs for OutputSelection<'a, T, TermId> {
57 fn num_outputs(&self) -> usize {
58 self.s.num_outputs()
59 }
60}
61
62impl<'a, T: PartialBooleanSystem> PartialBooleanSystem for OutputSelection<'a, T, T::TermId> {
63 type LiteralId = T::LiteralId;
64
65 type TermId = ();
66
67 fn evaluate_term_partial(&self, _term: &Self::TermId, input_values: &[bool]) -> Option<bool> {
68 self.s.evaluate_term_partial(&self.output, input_values)
69 }
70}
71
72impl<'a, T: BooleanSystem> BooleanSystem for OutputSelection<'a, T, T::TermId> {
73 fn evaluate_term(&self, _term: &Self::TermId, input_values: &[bool]) -> bool {
74 self.s.evaluate_term(&self.output, input_values)
75 }
76}
77
78impl<'a, T, TermId> StaticNumOutputs<1> for OutputSelection<'a, T, TermId> {}
79
80impl<'a, T: PartialBooleanSystem> PartialBooleanFunction for OutputSelection<'a, T, T::TermId> {
81 fn partial_eval(&self, input_values: &[bool]) -> Option<bool> {
82 self.evaluate_term_partial(&(), input_values)
83 }
84}
85
86impl<'a, T: BooleanSystem> BooleanFunction for OutputSelection<'a, T, T::TermId> {
87 fn eval(&self, input_values: &[bool]) -> bool {
88 self.evaluate_term(&(), input_values)
89 }
90}