Skip to main content

rbatis_codegen/
ops_sub.rs

1use crate::ops::{AsProxy, Sub};
2use crate::ops_macros::{impl_numeric_binary_op, impl_same_type_binary_op, impl_value_binary_op};
3use rbs::Value;
4
5fn op_sub_value(left: Value, rhs: Value) -> Value {
6    match left {
7        Value::I32(s) => Value::I32(s - rhs.i32()),
8        Value::I64(s) => Value::I64(s - rhs.i64()),
9        Value::U32(s) => Value::U32(s - rhs.u32()),
10        Value::U64(s) => Value::U64(s - rhs.u64()),
11        Value::F32(s) => Value::F32(s - rhs.f64() as f32),
12        Value::F64(s) => Value::F64(s - rhs.f64()),
13        Value::Ext(_, e) => op_sub_value(*e, rhs),
14        _ => Value::Null,
15    }
16}
17
18fn op_sub_u64(value: &Value, other: u64) -> u64 {
19    value.u64() - other
20}
21
22fn op_sub_i64(value: &Value, other: i64) -> i64 {
23    value.i64() - other
24}
25
26fn op_sub_f64(value: &Value, other: f64) -> f64 {
27    value.f64() - other
28}
29
30fn op_sub_u64_value(value: &Value, other: u64) -> u64 {
31    other - value.u64()
32}
33
34fn op_sub_i64_value(value: &Value, other: i64) -> i64 {
35    other - value.i64()
36}
37
38fn op_sub_f64_value(value: &Value, other: f64) -> f64 {
39    other - value.f64()
40}
41
42impl_value_binary_op!(Sub, op_sub, op_sub_value);
43impl_numeric_binary_op!(
44    Sub,
45    op_sub,
46    op_sub_u64,
47    op_sub_u64_value,
48    [u8, u16, u32, u64],
49    u64
50);
51impl_numeric_binary_op!(
52    Sub,
53    op_sub,
54    op_sub_i64,
55    op_sub_i64_value,
56    [i8, i16, i32, i64, isize, usize],
57    i64
58);
59impl_numeric_binary_op!(Sub, op_sub, op_sub_f64, op_sub_f64_value, [f32, f64], f64);
60impl_same_type_binary_op!(
61    Sub,
62    op_sub,
63    -,
64    [
65        u8, u16, u32, u64, i8, i16, i32, i64, isize, usize, f32, f64
66    ]
67);
68
69#[cfg(test)]
70mod test {
71    use crate::ops::Sub;
72    use rbs::{value, Value};
73
74    #[test]
75    fn test_sub() {
76        let i: i64 = 1;
77        let v = value!(2);
78        assert_eq!((&v).op_sub(&i), 1i64);
79        assert_eq!(v.op_sub(&i), 1i64);
80        assert_eq!(Value::I32(2).op_sub(&&Value::I32(1)), Value::I32(1));
81    }
82}