From 3f8c05ad7e2b8f2d96c477b9a20fa894edd18f92 Mon Sep 17 00:00:00 2001 From: Felix Raimundo Date: Mon, 11 Apr 2016 16:38:58 +0200 Subject: [PATCH] Add multiplication rules. Change-Id: I5e91414e8c6ad45e0ff2d19fc7c5dc3914fa247a --- poincare/src/simplify/rules.pr | 2 ++ .../src/simplify/simplification_generator.cpp | 18 ++++++++++++++++-- .../src/simplify/simplification_generator.h | 1 + poincare/test/simplify_product.cpp | 6 ++++++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/poincare/src/simplify/rules.pr b/poincare/src/simplify/rules.pr index 9c0ac8825..c1423bc0e 100644 --- a/poincare/src/simplify/rules.pr +++ b/poincare/src/simplify/rules.pr @@ -3,3 +3,5 @@ Addition(Integer.a,Integer.b)->$AddIntegers(a,b); Addition(Integer.a,Integer.b,c*)->Addition($AddIntegers(a,b),c*); Product(Product(a*),b*)->Product(a*,b*); Product(Integer[0],a*)->Integer[0]; +Product(Integer.a,Integer.b)->$MultiplyIntegers(a,b); +Product(Integer.a,Integer.b,c*)->Product($MultiplyIntegers(a,b),c*); diff --git a/poincare/src/simplify/simplification_generator.cpp b/poincare/src/simplify/simplification_generator.cpp index 05df45b68..8d5d31382 100644 --- a/poincare/src/simplify/simplification_generator.cpp +++ b/poincare/src/simplify/simplification_generator.cpp @@ -8,8 +8,22 @@ Expression * SimplificationGenerator::AddIntegers(Expression ** parameters, int Integer * result = new Integer((native_int_t)0); for (int i=0; itype() == Expression::Type::Integer); - // FIXME: get rid of this operator overloading. - *result = *result + *(Integer *)parameters[i]; + *result = result->add(*(Integer *)parameters[i], false); + /* Note We have to delete the parameters as they have been cloned before and + * we are the last ones to use them here. */ + delete parameters[i]; + } + return result; +} + +Expression * SimplificationGenerator::MultiplyIntegers(Expression ** parameters, int numberOfParameters) { + Integer * result = new Integer((native_int_t)1); + for (int i=0; itype() == Expression::Type::Integer); + // FIXME: get rid of this operator overloading, there are to many stars. + *result = *result * *(Integer *)parameters[i]; + /* Note We have to delete the parameters as they have been cloned before and + * we are the last ones to use them here. */ delete parameters[i]; } return result; diff --git a/poincare/src/simplify/simplification_generator.h b/poincare/src/simplify/simplification_generator.h index 422f3d6d9..2055c846b 100644 --- a/poincare/src/simplify/simplification_generator.h +++ b/poincare/src/simplify/simplification_generator.h @@ -6,6 +6,7 @@ class SimplificationGenerator { public: static Expression * AddIntegers(Expression ** parameters, int numberOfParameters); + static Expression * MultiplyIntegers(Expression ** parameters, int numberOfParameters); }; #endif diff --git a/poincare/test/simplify_product.cpp b/poincare/test/simplify_product.cpp index cc18864d0..dfb7479dd 100644 --- a/poincare/test/simplify_product.cpp +++ b/poincare/test/simplify_product.cpp @@ -5,6 +5,12 @@ QUIZ_CASE(poincare_simplify_product_by_zero) { assert(simplifies_to("3*0", "0")); assert(simplifies_to("foo*0", "0")); + assert(simplifies_to("0*3", "0")); assert(simplifies_to("0*foo", "0")); + + assert(simplifies_to("3*5", "15")); + assert(simplifies_to("8*6", "48")); + + assert(simplifies_to("3*(5+4)", "27")); }