1mod e_gates;
2use crate::Signal::*;
3pub use e_gates::*;
4
5#[derive(Debug, PartialEq, Copy, Clone, Eq)]
6pub enum Signal {
7 On,
8 Off,
9}
10
11#[macro_export]
12macro_rules! and {
13 ($x:expr)=>($x);
14 ($x:expr,$($y:expr),+)=>{
15 and($x,and!($($y),+))
16 }
17}
18
19#[macro_export]
20macro_rules! or {
21 ($x:expr)=>($x);
22 ($x:expr,$($y:expr),+)=>{
23 or($x,or!($($y),+))
24 }
25}
26
27impl From<bool> for Signal {
28 fn from(input: bool) -> Self {
29 match input {
30 true => On,
31 false => Off,
32 }
33 }
34}
35
36macro_rules! int_to_Signal {
37 ($($t:ty),*) => {
38 $(impl From<$t>for Signal{
39 fn from(input: $t)->Self{
40 if input> 0{
41 return On;
42 }
43 Off
44 }
45 })*
46 }
47}
48
49macro_rules! real_to_Signal {
50 ($($t:ty),*) => {
51 $(impl From<$t>for Signal{
52 fn from(input: $t)->Self{
53 if input> 0.0{
54 return On;
55 }
56 Off
57 }
58 })*
59 }
60}
61
62int_to_Signal!(u8, u16, u32, u64, u128, i8, i16, i32, i64, i128);
63real_to_Signal!(f32, f64);
64
65#[cfg(test)]
66mod test {
67 use crate::*;
68 #[test]
69 fn from_bool() {
70 assert_eq!(Signal::from(true), On);
71 assert_eq!(Signal::from(false), Off);
72 }
73 #[test]
74 fn from_integer() {
75 assert_eq!(Signal::from(1u8), On);
76 assert_eq!(Signal::from(0u8), Off);
77 assert_eq!(Signal::from(1u16), On);
78 assert_eq!(Signal::from(0u16), Off);
79 assert_eq!(Signal::from(1u32), On);
80 assert_eq!(Signal::from(0u32), Off);
81 assert_eq!(Signal::from(1u64), On);
82 assert_eq!(Signal::from(0u64), Off);
83 assert_eq!(Signal::from(1u128), On);
84 assert_eq!(Signal::from(0u128), Off);
85
86 assert_eq!(Signal::from(1i8), On);
87 assert_eq!(Signal::from(0i8), Off);
88 assert_eq!(Signal::from(1i16), On);
89 assert_eq!(Signal::from(0i16), Off);
90 assert_eq!(Signal::from(1i32), On);
91 assert_eq!(Signal::from(0i32), Off);
92 assert_eq!(Signal::from(1i64), On);
93 assert_eq!(Signal::from(0i64), Off);
94 assert_eq!(Signal::from(1i128), On);
95 assert_eq!(Signal::from(0i128), Off);
96 }
97 #[test]
98 fn from_real() {
99 assert_eq!(Signal::from(1f32), On);
100 assert_eq!(Signal::from(0f32), Off);
101 assert_eq!(Signal::from(1f64), On);
102 assert_eq!(Signal::from(0f64), Off)
103 }
104 #[test]
105 fn multi_and() {
106 assert_eq!(and!(On), On);
107 assert_eq!(and!(On, On), On);
108 assert_eq!(and!(On, On, On), On);
109 assert_eq!(and!(Off), Off);
110 assert_eq!(and!(Off, On), Off);
111 assert_eq!(and!(Off, On, Off), Off);
112 }
113
114 #[test]
115 fn multi_or() {
116 assert_eq!(or!(On), On);
117 assert_eq!(or!(On, On), On);
118 assert_eq!(or!(On, On, On), On);
119 assert_eq!(or!(Off), Off);
120 assert_eq!(or!(Off, On), On);
121 assert_eq!(or!(Off, On, Off), On);
122 assert_eq!(or!(Off, Off, Off), Off);
123 }
124}