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