Skip to main content

gates/
lib.rs

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}