1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
use typenum as tn; use crate::ops::{Ret}; #[derive(Debug,Default)] pub struct Add; defun!{ Add{ (L: std::ops::Add<R>, R) {l:L, r:R} => {Ret, @L::Output = l+r}; }} #[derive(Debug,Default)] pub struct Inc; defun_nocalc!{() Inc{ (L: std::ops::Add<tn::U1>) {l:L} => {Ret, @L::Output}; }} #[test] fn test_add() { assert_type_eq!(eval!{Add, tn::U4, tn::U3}, tn::U7); assert_type_eq!(eval!{Inc, tn::U4}, tn::U5); assert_type_eq!(eval!{Add, @u32, @u32}, u32); assert_eq!(7, calc!{Add, @u32 = 3, @u32 = 4}); } #[derive(Debug,Default)] pub struct Sub; defun!{ Sub{ (L: std::ops::Sub<R>, R) {l:L, r:R} => {Ret, @L::Output = l-r}; }} #[derive(Debug,Default)] pub struct Dec; defun_nocalc!{() Dec{ (L: std::ops::Sub<tn::U1>) {l:L} => {Ret, @L::Output}; }} #[test] fn test_sub() { assert_type_eq!(eval!{Sub, tn::U4, tn::U3}, tn::U1); assert_type_eq!(eval!{Dec, tn::U4}, tn::U3); assert_type_eq!(eval!{Sub, @u32, @u32}, u32); assert_eq!(1, calc!{Sub, @u32 = 4, @u32 = 3}); }