Skip to content

Commit

Permalink
Operator Sub implemented
Browse files Browse the repository at this point in the history
  • Loading branch information
tailhook committed Aug 16, 2017
1 parent 307e3b6 commit f17a9a0
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 0 deletions.
28 changes: 28 additions & 0 deletions src/number.rs
Original file line number Diff line number Diff line change
Expand Up @@ -113,3 +113,31 @@ pub fn add<'x>(a: Number, b: Number) -> VarRef<'x> {
}
}
}

pub fn sub<'x>(a: Number, b: Number) -> VarRef<'x> {
use self::NumberInner::*;
match (norm(a.0), norm(b.0)) {
(I64(a), I64(b)) => {
a.checked_sub(b).map(val)
.unwrap_or_else(|| val((a as f64) - (b as f64)))
}
(U64(a), U64(b)) => {
a.checked_sub(b).map(val)
.unwrap_or_else(|| val((a as f64) - (b as f64)))
}
(F64(a), F64(b)) => val(a - b),
(I64(a), F64(b)) => val(a as f64 - b),
(F64(a), I64(b)) => val(a - b as f64),
(U64(a), F64(b)) => val(a as f64 - b),
(F64(a), U64(b)) => val(a - b as f64),
(U64(a), I64(b)) => {
a.checked_add((-b as u64)).map(val)
.unwrap_or_else(|| val((a as f64) - (b as f64)))
}
(I64(a), U64(b)) if b < i64::MAX as u64 => {
a.checked_sub(b as i64).map(val)
.unwrap_or_else(|| val((a as f64) - (b as f64)))
}
(I64(a), U64(b)) => val((a as f64) - (b as f64)),
}
}
3 changes: 3 additions & 0 deletions src/render.rs
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,9 @@ fn eval_expr<'x, 'render: 'x>(r: &mut Renderer, root: &SubContext<'x, 'render>,
ExprCode::Add(ref a, ref b) => {
operator(number::add, a, b, r, root)
}
ExprCode::Sub(ref a, ref b) => {
operator(number::sub, a, b, r, root)
}
ExprCode::And(ref a, ref b) => {
let left = eval_expr(r, root, a);
match left.as_bool() {
Expand Down
8 changes: 8 additions & 0 deletions src/tests/math.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,11 @@ fn render_plus_different_types() {
assert_eq!(render_x_y("{{ x + y }}", 10u64, -100i64), "-90");
assert_eq!(render_x_y("{{ x + y }}", -100i64, 10i64), "-90");
}

#[test]
fn render_minus() {
assert_eq!(render_x_y("{{ x - y }}", 1u32, 1u32), "0");
assert_eq!(render_x_y("{{ x - y }}", 10u64, 7u64), "3");
assert_eq!(render_x_y("{{ x - y }}", 10i64, -1i64), "11");
assert_eq!(render_x_y("{{ x - y }}", 1.5f64, -1f64), "2.5");
}

0 comments on commit f17a9a0

Please sign in to comment.