From 807dd73e7bf83604bc714801e3fb0f0d92773f19 Mon Sep 17 00:00:00 2001 From: Romain Goyet Date: Thu, 9 Apr 2020 17:55:14 -0400 Subject: [PATCH] [poincare] Use a Tuple instead of an ArrayBuilder for expression The Tuple is simply an initializer_list along with a convenience method to cast between a list of TreeHandle and a list of Expression --- apps/regression/model/cubic_model.cpp | 43 +-- apps/regression/model/exponential_model.cpp | 20 +- apps/regression/model/logistic_model.cpp | 38 ++- apps/regression/model/power_model.cpp | 12 +- apps/regression/model/quadratic_model.cpp | 29 +- apps/regression/model/quartic_model.cpp | 59 ++-- poincare/include/poincare/absolute_value.h | 2 +- .../include/poincare/absolute_value_layout.h | 2 +- poincare/include/poincare/addition.h | 10 +- poincare/include/poincare/arc_cosine.h | 2 +- poincare/include/poincare/arc_sine.h | 2 +- poincare/include/poincare/arc_tangent.h | 2 +- poincare/include/poincare/array_builder.h | 20 -- poincare/include/poincare/binom_cdf.h | 2 +- poincare/include/poincare/binom_pdf.h | 2 +- .../include/poincare/binomial_coefficient.h | 2 +- .../poincare/binomial_coefficient_layout.h | 2 +- poincare/include/poincare/ceiling.h | 2 +- poincare/include/poincare/ceiling_layout.h | 2 +- poincare/include/poincare/complex_argument.h | 2 +- poincare/include/poincare/complex_cartesian.h | 2 +- .../include/poincare/condensed_sum_layout.h | 2 +- .../include/poincare/confidence_interval.h | 4 +- poincare/include/poincare/conjugate.h | 2 +- poincare/include/poincare/conjugate_layout.h | 2 +- poincare/include/poincare/cosine.h | 2 +- poincare/include/poincare/derivative.h | 2 +- poincare/include/poincare/determinant.h | 2 +- poincare/include/poincare/division.h | 2 +- poincare/include/poincare/division_quotient.h | 2 +- .../include/poincare/division_remainder.h | 2 +- poincare/include/poincare/equal.h | 2 +- poincare/include/poincare/expression.h | 10 +- poincare/include/poincare/factor.h | 2 +- poincare/include/poincare/factorial.h | 2 +- poincare/include/poincare/floor.h | 2 +- poincare/include/poincare/floor_layout.h | 2 +- poincare/include/poincare/frac_part.h | 2 +- poincare/include/poincare/fraction_layout.h | 2 +- .../include/poincare/great_common_divisor.h | 2 +- poincare/include/poincare/horizontal_layout.h | 14 +- .../include/poincare/hyperbolic_arc_cosine.h | 2 +- .../include/poincare/hyperbolic_arc_sine.h | 2 +- .../include/poincare/hyperbolic_arc_tangent.h | 2 +- poincare/include/poincare/hyperbolic_cosine.h | 2 +- poincare/include/poincare/hyperbolic_sine.h | 2 +- .../include/poincare/hyperbolic_tangent.h | 2 +- poincare/include/poincare/imaginary_part.h | 2 +- poincare/include/poincare/integral.h | 2 +- poincare/include/poincare/integral_layout.h | 2 +- poincare/include/poincare/inv_binom.h | 2 +- poincare/include/poincare/inv_norm.h | 2 +- poincare/include/poincare/layout.h | 1 - .../include/poincare/least_common_multiple.h | 2 +- poincare/include/poincare/logarithm.h | 4 +- poincare/include/poincare/matrix_dimension.h | 2 +- poincare/include/poincare/matrix_identity.h | 2 +- poincare/include/poincare/matrix_inverse.h | 2 +- poincare/include/poincare/matrix_trace.h | 2 +- poincare/include/poincare/matrix_transpose.h | 2 +- poincare/include/poincare/multiplication.h | 12 +- .../include/poincare/naperian_logarithm.h | 2 +- poincare/include/poincare/norm_cdf.h | 2 +- poincare/include/poincare/norm_cdf2.h | 2 +- poincare/include/poincare/norm_pdf.h | 2 +- poincare/include/poincare/nth_root.h | 2 +- poincare/include/poincare/opposite.h | 2 +- poincare/include/poincare/parenthesis.h | 2 +- .../include/poincare/permute_coefficient.h | 2 +- poincare/include/poincare/power.h | 2 +- .../include/poincare/prediction_interval.h | 2 +- poincare/include/poincare/product.h | 2 +- poincare/include/poincare/product_layout.h | 2 +- poincare/include/poincare/randint.h | 2 +- poincare/include/poincare/real_part.h | 2 +- poincare/include/poincare/round.h | 2 +- poincare/include/poincare/sign_function.h | 2 +- poincare/include/poincare/sine.h | 2 +- poincare/include/poincare/square_root.h | 2 +- poincare/include/poincare/store.h | 2 +- poincare/include/poincare/subtraction.h | 2 +- poincare/include/poincare/sum.h | 2 +- poincare/include/poincare/sum_layout.h | 2 +- poincare/include/poincare/tangent.h | 2 +- poincare/include/poincare/tree_handle.h | 10 +- poincare/include/poincare/unit_convert.h | 2 +- poincare/src/matrix.cpp | 12 +- poincare/src/matrix_layout.cpp | 2 +- poincare/src/tree_handle.cpp | 197 ++++++------- poincare/test/expression_order.cpp | 46 ++- poincare/test/layout_to_expression.cpp | 268 ++++++++---------- poincare/test/parsing.cpp | 10 +- 92 files changed, 461 insertions(+), 502 deletions(-) delete mode 100644 poincare/include/poincare/array_builder.h diff --git a/apps/regression/model/cubic_model.cpp b/apps/regression/model/cubic_model.cpp index 1c5899e81..42fdb5c7d 100644 --- a/apps/regression/model/cubic_model.cpp +++ b/apps/regression/model/cubic_model.cpp @@ -19,31 +19,29 @@ namespace Regression { Layout CubicModel::layout() { if (m_layout.isUninitialized()) { - constexpr int size = 15; - Layout layoutChildren[size] = { + m_layout = HorizontalLayout::Builder({ CodePointLayout::Builder('a', k_layoutFont), CodePointLayout::Builder(UCodePointMiddleDot, k_layoutFont), CodePointLayout::Builder('X', k_layoutFont), VerticalOffsetLayout::Builder( - CodePointLayout::Builder('3', k_layoutFont), - VerticalOffsetLayoutNode::Position::Superscript - ), + CodePointLayout::Builder('3', k_layoutFont), + VerticalOffsetLayoutNode::Position::Superscript + ), CodePointLayout::Builder('+', k_layoutFont), CodePointLayout::Builder('b', k_layoutFont), CodePointLayout::Builder(UCodePointMiddleDot, k_layoutFont), CodePointLayout::Builder('X', k_layoutFont), VerticalOffsetLayout::Builder( - CodePointLayout::Builder('2', k_layoutFont), - VerticalOffsetLayoutNode::Position::Superscript - ), + CodePointLayout::Builder('2', k_layoutFont), + VerticalOffsetLayoutNode::Position::Superscript + ), CodePointLayout::Builder('+', k_layoutFont), CodePointLayout::Builder('c', k_layoutFont), CodePointLayout::Builder(UCodePointMiddleDot, k_layoutFont), CodePointLayout::Builder('X', k_layoutFont), CodePointLayout::Builder('+', k_layoutFont), CodePointLayout::Builder('d', k_layoutFont), - }; - m_layout = HorizontalLayout::Builder(layoutChildren, size); + }); } return m_layout; } @@ -82,25 +80,28 @@ Expression CubicModel::expression(double * modelCoefficients) { double b = modelCoefficients[1]; double c = modelCoefficients[2]; double d = modelCoefficients[3]; - Expression addChildren[] = { - Multiplication::Builder( + // a*x^3+b*x^2+c*x+d + return Addition::Builder({ + Multiplication::Builder({ Number::DecimalNumber(a), Power::Builder( Symbol::Builder('x'), - Decimal::Builder(3.0))), - Multiplication::Builder( + Decimal::Builder(3.0) + ) + }), + Multiplication::Builder({ Number::DecimalNumber(b), Power::Builder( Symbol::Builder('x'), - Decimal::Builder(2.0))), - Multiplication::Builder( + Decimal::Builder(2.0) + ) + }), + Multiplication::Builder({ Number::DecimalNumber(c), - Symbol::Builder('x')), + Symbol::Builder('x') + }), Number::DecimalNumber(d) - }; - // a*x^3+b*x^2+c*x+d - Expression result = Addition::Builder(addChildren, 4); - return result; + }); } } diff --git a/apps/regression/model/exponential_model.cpp b/apps/regression/model/exponential_model.cpp index 608467a11..bffb66c53 100644 --- a/apps/regression/model/exponential_model.cpp +++ b/apps/regression/model/exponential_model.cpp @@ -13,21 +13,19 @@ namespace Regression { Layout ExponentialModel::layout() { if (m_layout.isUninitialized()) { - constexpr int size = 4; - Layout layoutChildren[size] = { + m_layout = HorizontalLayout::Builder({ CodePointLayout::Builder('a', k_layoutFont), CodePointLayout::Builder(UCodePointMiddleDot, k_layoutFont), CodePointLayout::Builder('e', k_layoutFont), VerticalOffsetLayout::Builder( - HorizontalLayout::Builder( - CodePointLayout::Builder('b', k_layoutFont), - CodePointLayout::Builder(UCodePointMiddleDot, k_layoutFont), - CodePointLayout::Builder('X', k_layoutFont) - ), - VerticalOffsetLayoutNode::Position::Superscript - ) - }; - m_layout = HorizontalLayout::Builder(layoutChildren, size); + HorizontalLayout::Builder({ + CodePointLayout::Builder('b', k_layoutFont), + CodePointLayout::Builder(UCodePointMiddleDot, k_layoutFont), + CodePointLayout::Builder('X', k_layoutFont) + }), + VerticalOffsetLayoutNode::Position::Superscript + ) + }); } return m_layout; } diff --git a/apps/regression/model/logistic_model.cpp b/apps/regression/model/logistic_model.cpp index f74db8f3d..0876aa70d 100644 --- a/apps/regression/model/logistic_model.cpp +++ b/apps/regression/model/logistic_model.cpp @@ -13,29 +13,25 @@ namespace Regression { Layout LogisticModel::layout() { if (m_layout.isUninitialized()) { - constexpr int exponentSize = 4; - Layout exponentLayoutChildren[exponentSize] = { - CodePointLayout::Builder('-', k_layoutFont), - CodePointLayout::Builder('b', k_layoutFont), - CodePointLayout::Builder(UCodePointMiddleDot, k_layoutFont), - CodePointLayout::Builder('X', k_layoutFont) - }; - constexpr int denominatorSize = 6; - Layout layoutChildren[denominatorSize] = { - CodePointLayout::Builder('1', k_layoutFont), - CodePointLayout::Builder('+', k_layoutFont), - CodePointLayout::Builder('a', k_layoutFont), - CodePointLayout::Builder(UCodePointMiddleDot, k_layoutFont), - CodePointLayout::Builder('e', k_layoutFont), - VerticalOffsetLayout::Builder( - HorizontalLayout::Builder(exponentLayoutChildren, exponentSize), + m_layout = FractionLayout::Builder( + CodePointLayout::Builder('c', k_layoutFont), + HorizontalLayout::Builder({ + CodePointLayout::Builder('1', k_layoutFont), + CodePointLayout::Builder('+', k_layoutFont), + CodePointLayout::Builder('a', k_layoutFont), + CodePointLayout::Builder(UCodePointMiddleDot, k_layoutFont), + CodePointLayout::Builder('e', k_layoutFont), + VerticalOffsetLayout::Builder( + HorizontalLayout::Builder({ + CodePointLayout::Builder('-', k_layoutFont), + CodePointLayout::Builder('b', k_layoutFont), + CodePointLayout::Builder(UCodePointMiddleDot, k_layoutFont), + CodePointLayout::Builder('X', k_layoutFont) + }), VerticalOffsetLayoutNode::Position::Superscript ) - }; - m_layout = FractionLayout::Builder( - CodePointLayout::Builder('c', k_layoutFont), - HorizontalLayout::Builder(layoutChildren, denominatorSize) - ); + }) + ); } return m_layout; } diff --git a/apps/regression/model/power_model.cpp b/apps/regression/model/power_model.cpp index c152c9c1d..b7c0e09e0 100644 --- a/apps/regression/model/power_model.cpp +++ b/apps/regression/model/power_model.cpp @@ -12,17 +12,15 @@ namespace Regression { Layout PowerModel::layout() { if (m_layout.isUninitialized()) { - constexpr int size = 4; - Layout layoutChildren[size] = { + m_layout = HorizontalLayout::Builder({ CodePointLayout::Builder('a', k_layoutFont), CodePointLayout::Builder(UCodePointMiddleDot, k_layoutFont), CodePointLayout::Builder('X', k_layoutFont), VerticalOffsetLayout::Builder( - CodePointLayout::Builder('b', k_layoutFont), - VerticalOffsetLayoutNode::Position::Superscript - ), - }; - m_layout = HorizontalLayout::Builder(layoutChildren, size); + CodePointLayout::Builder('b', k_layoutFont), + VerticalOffsetLayoutNode::Position::Superscript + ), + }); } return m_layout; } diff --git a/apps/regression/model/quadratic_model.cpp b/apps/regression/model/quadratic_model.cpp index 67305337f..66bc7cf0c 100644 --- a/apps/regression/model/quadratic_model.cpp +++ b/apps/regression/model/quadratic_model.cpp @@ -19,23 +19,21 @@ namespace Regression { Layout QuadraticModel::layout() { if (m_layout.isUninitialized()) { - constexpr int size = 10; - Layout layoutChildren[size] = { + m_layout = HorizontalLayout::Builder({ CodePointLayout::Builder('a', k_layoutFont), CodePointLayout::Builder(UCodePointMiddleDot, k_layoutFont), CodePointLayout::Builder('X', k_layoutFont), VerticalOffsetLayout::Builder( - CodePointLayout::Builder('2', k_layoutFont), - VerticalOffsetLayoutNode::Position::Superscript - ), + CodePointLayout::Builder('2', k_layoutFont), + VerticalOffsetLayoutNode::Position::Superscript + ), CodePointLayout::Builder('+', k_layoutFont), CodePointLayout::Builder('b', k_layoutFont), CodePointLayout::Builder(UCodePointMiddleDot, k_layoutFont), CodePointLayout::Builder('X', k_layoutFont), CodePointLayout::Builder('+', k_layoutFont), CodePointLayout::Builder('c', k_layoutFont), - }; - m_layout = HorizontalLayout::Builder(layoutChildren, size); + }); } return m_layout; } @@ -69,19 +67,20 @@ Expression QuadraticModel::expression(double * modelCoefficients) { double b = modelCoefficients[1]; double c = modelCoefficients[2]; // a*x^2+b*x+c - Expression addChildren[] = { - Multiplication::Builder( + return Addition::Builder({ + Multiplication::Builder({ Number::DecimalNumber(a), Power::Builder( Symbol::Builder('x'), - Decimal::Builder(2.0))), - Multiplication::Builder( + Decimal::Builder(2.0) + ) + }), + Multiplication::Builder({ Number::DecimalNumber(b), - Symbol::Builder('x')), + Symbol::Builder('x') + }), Number::DecimalNumber(c) - }; - Expression result = Addition::Builder(addChildren, 3); - return result; + }); } } diff --git a/apps/regression/model/quartic_model.cpp b/apps/regression/model/quartic_model.cpp index 32a2323a8..2b37e4423 100644 --- a/apps/regression/model/quartic_model.cpp +++ b/apps/regression/model/quartic_model.cpp @@ -19,39 +19,37 @@ namespace Regression { Layout QuarticModel::layout() { if (m_layout.isUninitialized()) { - constexpr int size = 20; - Layout layoutChildren[size] = { + m_layout = HorizontalLayout::Builder({ CodePointLayout::Builder('a', k_layoutFont), CodePointLayout::Builder(UCodePointMiddleDot, k_layoutFont), CodePointLayout::Builder('X', k_layoutFont), VerticalOffsetLayout::Builder( - CodePointLayout::Builder('4', k_layoutFont), - VerticalOffsetLayoutNode::Position::Superscript - ), + CodePointLayout::Builder('4', k_layoutFont), + VerticalOffsetLayoutNode::Position::Superscript + ), CodePointLayout::Builder('+', k_layoutFont), CodePointLayout::Builder('b', k_layoutFont), CodePointLayout::Builder(UCodePointMiddleDot, k_layoutFont), CodePointLayout::Builder('X', k_layoutFont), VerticalOffsetLayout::Builder( - CodePointLayout::Builder('3', k_layoutFont), - VerticalOffsetLayoutNode::Position::Superscript - ), + CodePointLayout::Builder('3', k_layoutFont), + VerticalOffsetLayoutNode::Position::Superscript + ), CodePointLayout::Builder('+', k_layoutFont), CodePointLayout::Builder('c', k_layoutFont), CodePointLayout::Builder(UCodePointMiddleDot, k_layoutFont), CodePointLayout::Builder('X', k_layoutFont), VerticalOffsetLayout::Builder( - CodePointLayout::Builder('2', k_layoutFont), - VerticalOffsetLayoutNode::Position::Superscript - ), + CodePointLayout::Builder('2', k_layoutFont), + VerticalOffsetLayoutNode::Position::Superscript + ), CodePointLayout::Builder('+', k_layoutFont), CodePointLayout::Builder('d', k_layoutFont), CodePointLayout::Builder(UCodePointMiddleDot, k_layoutFont), CodePointLayout::Builder('X', k_layoutFont), CodePointLayout::Builder('+', k_layoutFont), CodePointLayout::Builder('e', k_layoutFont), - }; - m_layout = HorizontalLayout::Builder(layoutChildren, size); + }); } return m_layout; } @@ -96,34 +94,35 @@ Expression QuarticModel::expression(double * modelCoefficients) { double c = modelCoefficients[2]; double d = modelCoefficients[3]; double e = modelCoefficients[4]; - Expression addChildren[] = { - // a*x^4 - Multiplication::Builder( + // a*x^4+b*x^3+c*x^2+d*x+e + return Addition::Builder({ + Multiplication::Builder({ Number::DecimalNumber(a), Power::Builder( Symbol::Builder('x'), - Decimal::Builder(4.0))), - // b*x^3 - Multiplication::Builder( + Decimal::Builder(4.0) + ) + }), + Multiplication::Builder({ Number::DecimalNumber(b), Power::Builder( Symbol::Builder('x'), - Decimal::Builder(3.0))), - // c*x^2 - Multiplication::Builder( + Decimal::Builder(3.0) + ) + }), + Multiplication::Builder({ Number::DecimalNumber(c), Power::Builder( Symbol::Builder('x'), - Decimal::Builder(2.0))), - // d*x - Multiplication::Builder( + Decimal::Builder(2.0) + ) + }), + Multiplication::Builder({ Number::DecimalNumber(d), - Symbol::Builder('x')), - // e + Symbol::Builder('x') + }), Number::DecimalNumber(e) - }; - Expression result = Addition::Builder(addChildren, 5); - return result; + }); } } diff --git a/poincare/include/poincare/absolute_value.h b/poincare/include/poincare/absolute_value.h index 8f146daae..e0a12aa6a 100644 --- a/poincare/include/poincare/absolute_value.h +++ b/poincare/include/poincare/absolute_value.h @@ -48,7 +48,7 @@ class AbsoluteValue final : public Expression { friend class AbsoluteValueNode; public: AbsoluteValue(const AbsoluteValueNode * n) : Expression(n) {} - static AbsoluteValue Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static AbsoluteValue Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("abs", 1, &UntypedBuilderOneChild); diff --git a/poincare/include/poincare/absolute_value_layout.h b/poincare/include/poincare/absolute_value_layout.h index d2abc1ed7..d1cab825d 100644 --- a/poincare/include/poincare/absolute_value_layout.h +++ b/poincare/include/poincare/absolute_value_layout.h @@ -36,7 +36,7 @@ private: class AbsoluteValueLayout final : public Layout { public: - static AbsoluteValueLayout Builder(Layout child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static AbsoluteValueLayout Builder(Layout child) { return TreeHandle::FixedArityBuilder({child}); } AbsoluteValueLayout() = delete; }; diff --git a/poincare/include/poincare/addition.h b/poincare/include/poincare/addition.h index bdf00b499..63971f23f 100644 --- a/poincare/include/poincare/addition.h +++ b/poincare/include/poincare/addition.h @@ -73,10 +73,12 @@ private: class Addition final : public NAryExpression { public: Addition(const AdditionNode * n) : NAryExpression(n) {} - static Addition Builder() { return TreeHandle::NAryBuilder(); } - static Addition Builder(Expression e1) { return Addition::Builder(&e1, 1); } - static Addition Builder(Expression e1, Expression e2) { return Addition::Builder(ArrayBuilder(e1, e2).array(), 2); } - static Addition Builder(Expression * children, size_t numberOfChildren) { return TreeHandle::NAryBuilder(children, numberOfChildren); } + static Addition Builder(const Tuple & children = {}) { + return TreeHandle::NAryBuilder(convert(children)); + } + // TODO: Get rid of these two helper functions + static Addition Builder(Expression e1) { return Addition::Builder({e1}); } + static Addition Builder(Expression e1, Expression e2) { return Addition::Builder({e1, e2}); } // Expression Expression shallowReduce(ExpressionNode::ReductionContext reductionContext); Expression shallowBeautify(ExpressionNode::ReductionContext reductionContext); diff --git a/poincare/include/poincare/arc_cosine.h b/poincare/include/poincare/arc_cosine.h index 8b7df06bb..43bac523f 100644 --- a/poincare/include/poincare/arc_cosine.h +++ b/poincare/include/poincare/arc_cosine.h @@ -45,7 +45,7 @@ private: class ArcCosine final : public Expression { public: ArcCosine(const ArcCosineNode * n) : Expression(n) {} - static ArcCosine Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static ArcCosine Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("acos", 1, &UntypedBuilderOneChild); diff --git a/poincare/include/poincare/arc_sine.h b/poincare/include/poincare/arc_sine.h index 74d73c14d..2747bda13 100644 --- a/poincare/include/poincare/arc_sine.h +++ b/poincare/include/poincare/arc_sine.h @@ -43,7 +43,7 @@ private: class ArcSine final : public Expression { public: ArcSine(const ArcSineNode * n) : Expression(n) {} - static ArcSine Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static ArcSine Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("asin", 1, &UntypedBuilderOneChild); diff --git a/poincare/include/poincare/arc_tangent.h b/poincare/include/poincare/arc_tangent.h index 5ee3b046e..47b6f5638 100644 --- a/poincare/include/poincare/arc_tangent.h +++ b/poincare/include/poincare/arc_tangent.h @@ -44,7 +44,7 @@ private: class ArcTangent final : public Expression { public: ArcTangent(const ArcTangentNode * n) : Expression(n) {} - static ArcTangent Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static ArcTangent Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("atan", 1, &UntypedBuilderOneChild); diff --git a/poincare/include/poincare/array_builder.h b/poincare/include/poincare/array_builder.h deleted file mode 100644 index ed7b232f1..000000000 --- a/poincare/include/poincare/array_builder.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef POINCARE_ARRAY_BUILDER_H -#define POINCARE_ARRAY_BUILDER_H - - -namespace Poincare { - -template -class ArrayBuilder { -public: - ArrayBuilder(T e1 = T(), T e2 = T(), T e3 = T(), T e4 = T()) : - m_data{e1, e2, e3, e4} - {} - T * array() { return const_cast(m_data); } -private: - T m_data[4]; -}; - -} - -#endif diff --git a/poincare/include/poincare/binom_cdf.h b/poincare/include/poincare/binom_cdf.h index 773e1ead6..832040818 100644 --- a/poincare/include/poincare/binom_cdf.h +++ b/poincare/include/poincare/binom_cdf.h @@ -37,7 +37,7 @@ private: class BinomCDF final : public BinomialDistributionFunction { public: BinomCDF(const BinomCDFNode * n) : BinomialDistributionFunction(n) {} - static BinomCDF Builder(Expression child0, Expression child1, Expression child2) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1, child2).array(), 3); } + static BinomCDF Builder(Expression child0, Expression child1, Expression child2) { return TreeHandle::FixedArityBuilder({child0, child1, child2}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("binomcdf", 3, &UntypedBuilderThreeChildren); }; diff --git a/poincare/include/poincare/binom_pdf.h b/poincare/include/poincare/binom_pdf.h index bdd936bee..c316e5aed 100644 --- a/poincare/include/poincare/binom_pdf.h +++ b/poincare/include/poincare/binom_pdf.h @@ -37,7 +37,7 @@ private: class BinomPDF final : public BinomialDistributionFunction { public: BinomPDF(const BinomPDFNode * n) : BinomialDistributionFunction(n) {} - static BinomPDF Builder(Expression child0, Expression child1, Expression child2) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1, child2).array(), 3); } + static BinomPDF Builder(Expression child0, Expression child1, Expression child2) { return TreeHandle::FixedArityBuilder({child0, child1, child2}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("binompdf", 3, &UntypedBuilderThreeChildren); }; diff --git a/poincare/include/poincare/binomial_coefficient.h b/poincare/include/poincare/binomial_coefficient.h index cb11495b3..992cf88d0 100644 --- a/poincare/include/poincare/binomial_coefficient.h +++ b/poincare/include/poincare/binomial_coefficient.h @@ -38,7 +38,7 @@ private: class BinomialCoefficient final : public Expression { public: BinomialCoefficient(const BinomialCoefficientNode * n) : Expression(n) {} - static BinomialCoefficient Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1).array(), 2); } + static BinomialCoefficient Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder({child0, child1}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("binomial", 2, &UntypedBuilderTwoChildren); // Expression diff --git a/poincare/include/poincare/binomial_coefficient_layout.h b/poincare/include/poincare/binomial_coefficient_layout.h index 4f9369402..063c4c8ac 100644 --- a/poincare/include/poincare/binomial_coefficient_layout.h +++ b/poincare/include/poincare/binomial_coefficient_layout.h @@ -46,7 +46,7 @@ private: class BinomialCoefficientLayout final : public Layout { public: - static BinomialCoefficientLayout Builder(Layout child0, Layout child1) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1).array(), 2); } + static BinomialCoefficientLayout Builder(Layout child0, Layout child1) { return TreeHandle::FixedArityBuilder({child0, child1}); } BinomialCoefficientLayout() = delete; }; diff --git a/poincare/include/poincare/ceiling.h b/poincare/include/poincare/ceiling.h index 2f77b3952..ff1bc5a10 100644 --- a/poincare/include/poincare/ceiling.h +++ b/poincare/include/poincare/ceiling.h @@ -41,7 +41,7 @@ private: class Ceiling final : public Expression { public: Ceiling(const CeilingNode * n) : Expression(n) {} - static Ceiling Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static Ceiling Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("ceil", 1, &UntypedBuilderOneChild); diff --git a/poincare/include/poincare/ceiling_layout.h b/poincare/include/poincare/ceiling_layout.h index e62a5b281..fbb85209e 100644 --- a/poincare/include/poincare/ceiling_layout.h +++ b/poincare/include/poincare/ceiling_layout.h @@ -33,7 +33,7 @@ protected: class CeilingLayout final : public Layout { public: - static CeilingLayout Builder(Layout child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static CeilingLayout Builder(Layout child) { return TreeHandle::FixedArityBuilder({child}); } CeilingLayout() = delete; }; diff --git a/poincare/include/poincare/complex_argument.h b/poincare/include/poincare/complex_argument.h index 4507507b6..4264428c6 100644 --- a/poincare/include/poincare/complex_argument.h +++ b/poincare/include/poincare/complex_argument.h @@ -42,7 +42,7 @@ private: class ComplexArgument final : public Expression { public: ComplexArgument(const ComplexArgumentNode * n) : Expression(n) {} - static ComplexArgument Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static ComplexArgument Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("arg", 1, &UntypedBuilderOneChild); diff --git a/poincare/include/poincare/complex_cartesian.h b/poincare/include/poincare/complex_cartesian.h index 917fe89e8..f9a71c5fd 100644 --- a/poincare/include/poincare/complex_cartesian.h +++ b/poincare/include/poincare/complex_cartesian.h @@ -44,7 +44,7 @@ public: ComplexCartesian() : Expression() {} ComplexCartesian(const ComplexCartesianNode * node) : Expression(node) {} static ComplexCartesian Builder() { return TreeHandle::FixedArityBuilder(); } - static ComplexCartesian Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1).array(), 2); } + static ComplexCartesian Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder({child0, child1}); } // Getters Expression real() { return childAtIndex(0); } diff --git a/poincare/include/poincare/condensed_sum_layout.h b/poincare/include/poincare/condensed_sum_layout.h index a1031e00a..e48c3bb11 100644 --- a/poincare/include/poincare/condensed_sum_layout.h +++ b/poincare/include/poincare/condensed_sum_layout.h @@ -55,7 +55,7 @@ private: class CondensedSumLayout final : public Layout { public: - static CondensedSumLayout Builder(Layout base, Layout subscript, Layout superscript) { return TreeHandle::FixedArityBuilder(ArrayBuilder(base, subscript, superscript).array(), 3); } + static CondensedSumLayout Builder(Layout base, Layout subscript, Layout superscript) { return TreeHandle::FixedArityBuilder({base, subscript, superscript}); } CondensedSumLayout() = delete; }; diff --git a/poincare/include/poincare/confidence_interval.h b/poincare/include/poincare/confidence_interval.h index 6aa6f90ca..f0d78e2d3 100644 --- a/poincare/include/poincare/confidence_interval.h +++ b/poincare/include/poincare/confidence_interval.h @@ -48,7 +48,7 @@ class ConfidenceInterval : public Expression { friend class SimplePredictionInterval; public: ConfidenceInterval(const ConfidenceIntervalNode * n) : Expression(n) {} - static ConfidenceInterval Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1).array(), 2); } + static ConfidenceInterval Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder({child0, child1}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("confidence", 2, &UntypedBuilderTwoChildren); // Expression @@ -60,7 +60,7 @@ private: class SimplePredictionInterval final : public ConfidenceInterval { public: SimplePredictionInterval(const SimplePredictionIntervalNode * n) : ConfidenceInterval(n) {} - static SimplePredictionInterval Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1).array(), 2); } + static SimplePredictionInterval Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder({child0, child1}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("prediction", 2, &UntypedBuilderTwoChildren); }; diff --git a/poincare/include/poincare/conjugate.h b/poincare/include/poincare/conjugate.h index 8a52b7d8e..61b442fc5 100644 --- a/poincare/include/poincare/conjugate.h +++ b/poincare/include/poincare/conjugate.h @@ -42,7 +42,7 @@ private: class Conjugate final : public Expression { public: Conjugate(const ConjugateNode * n) : Expression(n) {} - static Conjugate Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static Conjugate Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("conj", 1, &UntypedBuilderOneChild);; diff --git a/poincare/include/poincare/conjugate_layout.h b/poincare/include/poincare/conjugate_layout.h index 8cf2f5f04..e64a83963 100644 --- a/poincare/include/poincare/conjugate_layout.h +++ b/poincare/include/poincare/conjugate_layout.h @@ -43,7 +43,7 @@ private: class ConjugateLayout final : public Layout { public: - static ConjugateLayout Builder(Layout child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static ConjugateLayout Builder(Layout child) { return TreeHandle::FixedArityBuilder({child}); } ConjugateLayout() = delete; }; diff --git a/poincare/include/poincare/cosine.h b/poincare/include/poincare/cosine.h index 4af257591..5855d8a9d 100644 --- a/poincare/include/poincare/cosine.h +++ b/poincare/include/poincare/cosine.h @@ -46,7 +46,7 @@ private: class Cosine final : public Expression { public: Cosine(const CosineNode * n) : Expression(n) {} - static Cosine Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static Cosine Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("cos", 1, &UntypedBuilderOneChild); diff --git a/poincare/include/poincare/derivative.h b/poincare/include/poincare/derivative.h index 174a59d96..ad622c73b 100644 --- a/poincare/include/poincare/derivative.h +++ b/poincare/include/poincare/derivative.h @@ -49,7 +49,7 @@ private: class Derivative final : public ParameteredExpression { public: Derivative(const DerivativeNode * n) : ParameteredExpression(n) {} - static Derivative Builder(Expression child0, Symbol child1, Expression child2) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1, child2).array(), 3); } + static Derivative Builder(Expression child0, Symbol child1, Expression child2) { return TreeHandle::FixedArityBuilder({child0, child1, child2}); } static Expression UntypedBuilder(Expression children); static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("diff", 3, &UntypedBuilder); diff --git a/poincare/include/poincare/determinant.h b/poincare/include/poincare/determinant.h index 14a4326a7..1a1a043e4 100644 --- a/poincare/include/poincare/determinant.h +++ b/poincare/include/poincare/determinant.h @@ -37,7 +37,7 @@ private: class Determinant final : public Expression { public: Determinant(const DeterminantNode * n) : Expression(n) {} - static Determinant Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static Determinant Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("det", 1, &UntypedBuilderOneChild); diff --git a/poincare/include/poincare/division.h b/poincare/include/poincare/division.h index b9c6be652..262f4a418 100644 --- a/poincare/include/poincare/division.h +++ b/poincare/include/poincare/division.h @@ -64,7 +64,7 @@ class Division final : public Expression { public: Division(const DivisionNode * n) : Expression(n) {} static Division Builder() { return TreeHandle::FixedArityBuilder(); } - static Division Builder(Expression numerator, Expression denominator) { return TreeHandle::FixedArityBuilder(ArrayBuilder(numerator, denominator).array(), 2); } + static Division Builder(Expression numerator, Expression denominator) { return TreeHandle::FixedArityBuilder({numerator, denominator}); } Expression shallowReduce(ExpressionNode::ReductionContext reductionContext); }; diff --git a/poincare/include/poincare/division_quotient.h b/poincare/include/poincare/division_quotient.h index cdc1f5461..e55fcec65 100644 --- a/poincare/include/poincare/division_quotient.h +++ b/poincare/include/poincare/division_quotient.h @@ -40,7 +40,7 @@ private: class DivisionQuotient final : public Expression { public: DivisionQuotient(const DivisionQuotientNode * n) : Expression(n) {} - static DivisionQuotient Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1).array(), 2); } + static DivisionQuotient Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder({child0, child1}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("quo", 2, &UntypedBuilderTwoChildren); // Expression diff --git a/poincare/include/poincare/division_remainder.h b/poincare/include/poincare/division_remainder.h index 53bdde967..3794c370d 100644 --- a/poincare/include/poincare/division_remainder.h +++ b/poincare/include/poincare/division_remainder.h @@ -42,7 +42,7 @@ private: class DivisionRemainder final : public Expression { public: DivisionRemainder(const DivisionRemainderNode * n) : Expression(n) {} - static DivisionRemainder Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1).array(), 2); } + static DivisionRemainder Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder({child0, child1}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("rem", 2, &UntypedBuilderTwoChildren); // Expression diff --git a/poincare/include/poincare/equal.h b/poincare/include/poincare/equal.h index 4e84b2a7e..6826f35ab 100644 --- a/poincare/include/poincare/equal.h +++ b/poincare/include/poincare/equal.h @@ -36,7 +36,7 @@ private: class Equal final : public Expression { public: Equal(const EqualNode * n) : Expression(n) {} - static Equal Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1).array(), 2); } + static Equal Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder({child0, child1}); } // For the equation A = B, create the reduced expression A-B Expression standardEquation(Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const; diff --git a/poincare/include/poincare/expression.h b/poincare/include/poincare/expression.h index 86e8e0b9b..ee6e48551 100644 --- a/poincare/include/poincare/expression.h +++ b/poincare/include/poincare/expression.h @@ -1,7 +1,6 @@ #ifndef POINCARE_EXPRESSION_REFERENCE_H #define POINCARE_EXPRESSION_REFERENCE_H -#include #include #include #include @@ -286,6 +285,9 @@ public: static void Tidy() { sSymbolReplacementsCountLock = false; } + /* Tuple */ + typedef std::initializer_list Tuple; + protected: static bool SimplificationHasBeenInterrupted(); Expression(const ExpressionNode * n) : TreeHandle(n) {} @@ -328,6 +330,12 @@ protected: return *reinterpret_cast(const_cast(this)); } + static_assert(sizeof(TreeHandle::Tuple) == sizeof(Tuple), "Size mismatch"); + static const TreeHandle::Tuple & convert(const Tuple & l) { + assert(sizeof(TreeHandle) == sizeof(Expression)); + return reinterpret_cast(l); + } + /* Reference */ ExpressionNode * node() const { assert(identifier() != TreeNode::NoNodeIdentifier || !TreeHandle::node()->isGhost()); diff --git a/poincare/include/poincare/factor.h b/poincare/include/poincare/factor.h index 1da23d068..39e1ce4d5 100644 --- a/poincare/include/poincare/factor.h +++ b/poincare/include/poincare/factor.h @@ -39,7 +39,7 @@ private: class Factor final : public Expression { public: Factor(const FactorNode * n) : Expression(n) {} - static Factor Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static Factor Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("factor", 1, &UntypedBuilderOneChild); diff --git a/poincare/include/poincare/factorial.h b/poincare/include/poincare/factorial.h index 3b9fc1520..212a94c57 100644 --- a/poincare/include/poincare/factorial.h +++ b/poincare/include/poincare/factorial.h @@ -52,7 +52,7 @@ private: class Factorial final : public Expression { public: Factorial(const FactorialNode * n) : Expression(n) {} - static Factorial Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static Factorial Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } Expression shallowReduce(ExpressionNode::ReductionContext reductionContext); private: diff --git a/poincare/include/poincare/floor.h b/poincare/include/poincare/floor.h index e017c515c..65115adaa 100644 --- a/poincare/include/poincare/floor.h +++ b/poincare/include/poincare/floor.h @@ -42,7 +42,7 @@ private: class Floor final : public Expression { public: Floor(const FloorNode * n) : Expression(n) {} - static Floor Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static Floor Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("floor", 1, &UntypedBuilderOneChild); diff --git a/poincare/include/poincare/floor_layout.h b/poincare/include/poincare/floor_layout.h index b696f55d3..9870dfad0 100644 --- a/poincare/include/poincare/floor_layout.h +++ b/poincare/include/poincare/floor_layout.h @@ -33,7 +33,7 @@ protected: class FloorLayout final : public Layout { public: - static FloorLayout Builder(Layout child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static FloorLayout Builder(Layout child) { return TreeHandle::FixedArityBuilder({child}); } FloorLayout() = delete; }; diff --git a/poincare/include/poincare/frac_part.h b/poincare/include/poincare/frac_part.h index 46c0af2e5..0158bb9e7 100644 --- a/poincare/include/poincare/frac_part.h +++ b/poincare/include/poincare/frac_part.h @@ -45,7 +45,7 @@ private: class FracPart final : public Expression { public: FracPart(const FracPartNode * n) : Expression(n) {} - static FracPart Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static FracPart Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("frac", 1, &UntypedBuilderOneChild); diff --git a/poincare/include/poincare/fraction_layout.h b/poincare/include/poincare/fraction_layout.h index bd3ab2eb5..99a054aa2 100644 --- a/poincare/include/poincare/fraction_layout.h +++ b/poincare/include/poincare/fraction_layout.h @@ -61,7 +61,7 @@ private: class FractionLayout final : public Layout { public: - static FractionLayout Builder(Layout child0, Layout child1) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1).array(), 2); } + static FractionLayout Builder(Layout child0, Layout child1) { return TreeHandle::FixedArityBuilder({child0, child1}); } FractionLayout() = delete; }; diff --git a/poincare/include/poincare/great_common_divisor.h b/poincare/include/poincare/great_common_divisor.h index e6e12b6d9..96429d951 100644 --- a/poincare/include/poincare/great_common_divisor.h +++ b/poincare/include/poincare/great_common_divisor.h @@ -37,7 +37,7 @@ private: class GreatCommonDivisor final : public Expression { public: GreatCommonDivisor(const GreatCommonDivisorNode * n) : Expression(n) {} - static GreatCommonDivisor Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1).array(), 2); } + static GreatCommonDivisor Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder({child0, child1}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("gcd", 2, &UntypedBuilderTwoChildren); // Expression diff --git a/poincare/include/poincare/horizontal_layout.h b/poincare/include/poincare/horizontal_layout.h index accd2eb87..22555f727 100644 --- a/poincare/include/poincare/horizontal_layout.h +++ b/poincare/include/poincare/horizontal_layout.h @@ -75,12 +75,14 @@ class HorizontalLayout final : public Layout { public: // Constructors HorizontalLayout(HorizontalLayoutNode * n) : Layout(n) {} - static HorizontalLayout Builder() { return TreeHandle::NAryBuilder(); } - static HorizontalLayout Builder(Layout l) { return HorizontalLayout::Builder(&l, 1); } - static HorizontalLayout Builder(Layout l1, Layout l2) { return HorizontalLayout::Builder(ArrayBuilder(l1, l2).array(), 2); } - static HorizontalLayout Builder(Layout l1, Layout l2, Layout l3) { return HorizontalLayout::Builder(ArrayBuilder(l1, l2, l3).array(), 3); } - static HorizontalLayout Builder(Layout l1, Layout l2, Layout l3, Layout l4) { return HorizontalLayout::Builder(ArrayBuilder(l1, l2, l3, l4).array(), 4); } - static HorizontalLayout Builder(Layout * children, size_t numberOfChildren) { return TreeHandle::NAryBuilder(static_cast(children), numberOfChildren); } + + // FIXME: use Layout instead of TreeHandle + static HorizontalLayout Builder(std::initializer_list children = {}) { return TreeHandle::NAryBuilder(children); } + // TODO: Get rid of those helpers + static HorizontalLayout Builder(Layout l) { return Builder({l}); } + static HorizontalLayout Builder(Layout l1, Layout l2) { return Builder({l1, l2}); } + static HorizontalLayout Builder(Layout l1, Layout l2, Layout l3) { return Builder({l1, l2, l3}); } + static HorizontalLayout Builder(Layout l1, Layout l2, Layout l3, Layout l4) { return Builder({l1, l2, l3, l4}); } void addChildAtIndex(Layout l, int index, int currentNumberOfChildren, LayoutCursor * cursor, bool removeEmptyChildren = false); // Remove puts a child at the end of the pool diff --git a/poincare/include/poincare/hyperbolic_arc_cosine.h b/poincare/include/poincare/hyperbolic_arc_cosine.h index dae97d4fe..ac0a6aee8 100644 --- a/poincare/include/poincare/hyperbolic_arc_cosine.h +++ b/poincare/include/poincare/hyperbolic_arc_cosine.h @@ -38,7 +38,7 @@ private: class HyperbolicArcCosine final : public HyperbolicTrigonometricFunction { public: HyperbolicArcCosine(const HyperbolicArcCosineNode * n) : HyperbolicTrigonometricFunction(n) {} - static HyperbolicArcCosine Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static HyperbolicArcCosine Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("acosh", 1, &UntypedBuilderOneChild); }; diff --git a/poincare/include/poincare/hyperbolic_arc_sine.h b/poincare/include/poincare/hyperbolic_arc_sine.h index 0e7136898..2981ba622 100644 --- a/poincare/include/poincare/hyperbolic_arc_sine.h +++ b/poincare/include/poincare/hyperbolic_arc_sine.h @@ -36,7 +36,7 @@ private: class HyperbolicArcSine final : public HyperbolicTrigonometricFunction { public: HyperbolicArcSine(const HyperbolicArcSineNode * n) : HyperbolicTrigonometricFunction(n) {} - static HyperbolicArcSine Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static HyperbolicArcSine Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("asinh", 1, &UntypedBuilderOneChild); }; diff --git a/poincare/include/poincare/hyperbolic_arc_tangent.h b/poincare/include/poincare/hyperbolic_arc_tangent.h index 92867bc81..d59827696 100644 --- a/poincare/include/poincare/hyperbolic_arc_tangent.h +++ b/poincare/include/poincare/hyperbolic_arc_tangent.h @@ -36,7 +36,7 @@ private: class HyperbolicArcTangent final : public HyperbolicTrigonometricFunction { public: HyperbolicArcTangent(const HyperbolicArcTangentNode * n) : HyperbolicTrigonometricFunction(n) {} - static HyperbolicArcTangent Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static HyperbolicArcTangent Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("atanh", 1, &UntypedBuilderOneChild); }; diff --git a/poincare/include/poincare/hyperbolic_cosine.h b/poincare/include/poincare/hyperbolic_cosine.h index 82537ef0a..64f2fc991 100644 --- a/poincare/include/poincare/hyperbolic_cosine.h +++ b/poincare/include/poincare/hyperbolic_cosine.h @@ -38,7 +38,7 @@ private: class HyperbolicCosine final : public HyperbolicTrigonometricFunction { public: HyperbolicCosine(const HyperbolicCosineNode * n) : HyperbolicTrigonometricFunction(n) {} - static HyperbolicCosine Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static HyperbolicCosine Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("cosh", 1, &UntypedBuilderOneChild); }; diff --git a/poincare/include/poincare/hyperbolic_sine.h b/poincare/include/poincare/hyperbolic_sine.h index 94f2964e8..718aa5ca9 100644 --- a/poincare/include/poincare/hyperbolic_sine.h +++ b/poincare/include/poincare/hyperbolic_sine.h @@ -36,7 +36,7 @@ private: class HyperbolicSine final : public HyperbolicTrigonometricFunction { public: HyperbolicSine(const HyperbolicSineNode * n) : HyperbolicTrigonometricFunction(n) {} - static HyperbolicSine Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static HyperbolicSine Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("sinh", 1, &UntypedBuilderOneChild); }; diff --git a/poincare/include/poincare/hyperbolic_tangent.h b/poincare/include/poincare/hyperbolic_tangent.h index eb0cc9091..5c42b79ba 100644 --- a/poincare/include/poincare/hyperbolic_tangent.h +++ b/poincare/include/poincare/hyperbolic_tangent.h @@ -36,7 +36,7 @@ private: class HyperbolicTangent final : public HyperbolicTrigonometricFunction { public: HyperbolicTangent(const HyperbolicTangentNode * n) : HyperbolicTrigonometricFunction(n) {} - static HyperbolicTangent Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static HyperbolicTangent Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("tanh", 1, &UntypedBuilderOneChild); }; diff --git a/poincare/include/poincare/imaginary_part.h b/poincare/include/poincare/imaginary_part.h index 2a10da6a0..345ddbc50 100644 --- a/poincare/include/poincare/imaginary_part.h +++ b/poincare/include/poincare/imaginary_part.h @@ -45,7 +45,7 @@ private: class ImaginaryPart final : public Expression { public: ImaginaryPart(const ImaginaryPartNode * n) : Expression(n) {} - static ImaginaryPart Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static ImaginaryPart Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("im", 1, &UntypedBuilderOneChild); diff --git a/poincare/include/poincare/integral.h b/poincare/include/poincare/integral.h index 513c10ac5..e55f30e3a 100644 --- a/poincare/include/poincare/integral.h +++ b/poincare/include/poincare/integral.h @@ -53,7 +53,7 @@ private: class Integral final : public ParameteredExpression { public: Integral(const IntegralNode * n) : ParameteredExpression(n) {} - static Integral Builder(Expression child0, Symbol child1, Expression child2, Expression child3) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1, child2, child3).array(), 4); } + static Integral Builder(Expression child0, Symbol child1, Expression child2, Expression child3) { return TreeHandle::FixedArityBuilder({child0, child1, child2, child3}); } static Expression UntypedBuilder(Expression children); static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("int", 4, &UntypedBuilder); diff --git a/poincare/include/poincare/integral_layout.h b/poincare/include/poincare/integral_layout.h index af1003495..84c91eca8 100644 --- a/poincare/include/poincare/integral_layout.h +++ b/poincare/include/poincare/integral_layout.h @@ -61,7 +61,7 @@ private: class IntegralLayout final : public Layout { public: - static IntegralLayout Builder(Layout integrand, Layout differential, Layout lowerBound, Layout upperBound) { return TreeHandle::FixedArityBuilder(ArrayBuilder(integrand, differential, lowerBound, upperBound).array(), 4); } + static IntegralLayout Builder(Layout integrand, Layout differential, Layout lowerBound, Layout upperBound) { return TreeHandle::FixedArityBuilder({integrand, differential, lowerBound, upperBound}); } IntegralLayout() = delete; }; diff --git a/poincare/include/poincare/inv_binom.h b/poincare/include/poincare/inv_binom.h index 00051645a..c3b959d60 100644 --- a/poincare/include/poincare/inv_binom.h +++ b/poincare/include/poincare/inv_binom.h @@ -38,7 +38,7 @@ private: class InvBinom final : public BinomialDistributionFunction { public: InvBinom(const InvBinomNode * n) : BinomialDistributionFunction(n) {} - static InvBinom Builder(Expression child0, Expression child1, Expression child2) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1, child2).array(), 3); } + static InvBinom Builder(Expression child0, Expression child1, Expression child2) { return TreeHandle::FixedArityBuilder({child0, child1, child2}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("invbinom", 3, &UntypedBuilderThreeChildren); Expression shallowReduce(ExpressionNode::ReductionContext reductionContext); }; diff --git a/poincare/include/poincare/inv_norm.h b/poincare/include/poincare/inv_norm.h index c1c36b81a..a06d622e8 100644 --- a/poincare/include/poincare/inv_norm.h +++ b/poincare/include/poincare/inv_norm.h @@ -38,7 +38,7 @@ private: class InvNorm final : public NormalDistributionFunction { public: InvNorm(const InvNormNode * n) : NormalDistributionFunction(n) {} - static InvNorm Builder(Expression child0, Expression child1, Expression child2) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1, child2).array(), 3); } + static InvNorm Builder(Expression child0, Expression child1, Expression child2) { return TreeHandle::FixedArityBuilder({child0, child1, child2}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("invnorm", 3, &UntypedBuilderThreeChildren); Expression shallowReduce(ExpressionNode::ReductionContext reductionContext); }; diff --git a/poincare/include/poincare/layout.h b/poincare/include/poincare/layout.h index d24294289..074943a69 100644 --- a/poincare/include/poincare/layout.h +++ b/poincare/include/poincare/layout.h @@ -1,7 +1,6 @@ #ifndef POINCARE_LAYOUT_REFERENCE_H #define POINCARE_LAYOUT_REFERENCE_H -#include #include #include #include diff --git a/poincare/include/poincare/least_common_multiple.h b/poincare/include/poincare/least_common_multiple.h index 15621d757..2ca831043 100644 --- a/poincare/include/poincare/least_common_multiple.h +++ b/poincare/include/poincare/least_common_multiple.h @@ -37,7 +37,7 @@ private: class LeastCommonMultiple final : public Expression { public: LeastCommonMultiple(const LeastCommonMultipleNode * n) : Expression(n) {} - static LeastCommonMultiple Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1).array(), 2); } + static LeastCommonMultiple Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder({child0, child1}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("lcm", 2, &UntypedBuilderTwoChildren); // Expression diff --git a/poincare/include/poincare/logarithm.h b/poincare/include/poincare/logarithm.h index 21722c26a..75d23f0f7 100644 --- a/poincare/include/poincare/logarithm.h +++ b/poincare/include/poincare/logarithm.h @@ -48,7 +48,7 @@ class Logarithm final : public Expression { friend class LogarithmNode<2>; public: Logarithm(const LogarithmNode<2> * n) : Expression(n) {} - static Logarithm Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder>(ArrayBuilder(child0, child1).array(), 2); } + static Logarithm Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder>({child0, child1}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("log", 2, &UntypedBuilderTwoChildren); Expression shallowReduce(ExpressionNode::ReductionContext reductionContext); @@ -65,7 +65,7 @@ private: class CommonLogarithm : public Expression { public: CommonLogarithm(const LogarithmNode<1> * n) : Expression(n) {} - static CommonLogarithm Builder(Expression child) { return TreeHandle::FixedArityBuilder>(&child, 1); } + static CommonLogarithm Builder(Expression child) { return TreeHandle::FixedArityBuilder>({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("log", 1, &UntypedBuilderOneChild); diff --git a/poincare/include/poincare/matrix_dimension.h b/poincare/include/poincare/matrix_dimension.h index ade407bfa..07c40840d 100644 --- a/poincare/include/poincare/matrix_dimension.h +++ b/poincare/include/poincare/matrix_dimension.h @@ -37,7 +37,7 @@ private: class MatrixDimension final : public Expression { public: MatrixDimension(const MatrixDimensionNode * n) : Expression(n) {} - static MatrixDimension Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static MatrixDimension Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("dim", 1, &UntypedBuilderOneChild); diff --git a/poincare/include/poincare/matrix_identity.h b/poincare/include/poincare/matrix_identity.h index 3f35ab64f..8d50b39c3 100644 --- a/poincare/include/poincare/matrix_identity.h +++ b/poincare/include/poincare/matrix_identity.h @@ -35,7 +35,7 @@ private: class MatrixIdentity final : public Expression { public: MatrixIdentity(const MatrixIdentityNode * n) : Expression(n) {} - static MatrixIdentity Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static MatrixIdentity Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("identity", 1, &UntypedBuilderOneChild); diff --git a/poincare/include/poincare/matrix_inverse.h b/poincare/include/poincare/matrix_inverse.h index 17b10dd01..53fefdf30 100644 --- a/poincare/include/poincare/matrix_inverse.h +++ b/poincare/include/poincare/matrix_inverse.h @@ -36,7 +36,7 @@ private: class MatrixInverse final : public Expression { public: MatrixInverse(const MatrixInverseNode * n) : Expression(n) {} - static MatrixInverse Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static MatrixInverse Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("inverse", 1, &UntypedBuilderOneChild); diff --git a/poincare/include/poincare/matrix_trace.h b/poincare/include/poincare/matrix_trace.h index ec8af6591..7805cf0d5 100644 --- a/poincare/include/poincare/matrix_trace.h +++ b/poincare/include/poincare/matrix_trace.h @@ -36,7 +36,7 @@ private: class MatrixTrace final : public Expression { public: MatrixTrace(const MatrixTraceNode * n) : Expression(n) {} - static MatrixTrace Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static MatrixTrace Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("trace", 1, &UntypedBuilderOneChild); diff --git a/poincare/include/poincare/matrix_transpose.h b/poincare/include/poincare/matrix_transpose.h index 5a730ea41..e404c840c 100644 --- a/poincare/include/poincare/matrix_transpose.h +++ b/poincare/include/poincare/matrix_transpose.h @@ -36,7 +36,7 @@ private: class MatrixTranspose final : public Expression { public: MatrixTranspose(const MatrixTransposeNode * n) : Expression(n) {} - static MatrixTranspose Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static MatrixTranspose Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("transpose", 1, &UntypedBuilderOneChild); diff --git a/poincare/include/poincare/multiplication.h b/poincare/include/poincare/multiplication.h index a62ec77c0..256c1d479 100644 --- a/poincare/include/poincare/multiplication.h +++ b/poincare/include/poincare/multiplication.h @@ -69,12 +69,12 @@ class Multiplication : public NAryExpression { friend class UnitConvert; public: Multiplication(const MultiplicationNode * n) : NAryExpression(n) {} - static Multiplication Builder() { return TreeHandle::NAryBuilder(); } - static Multiplication Builder(Expression e1) { return Multiplication::Builder(&e1, 1); } - static Multiplication Builder(Expression e1, Expression e2) { return Multiplication::Builder(ArrayBuilder(e1, e2).array(), 2); } - static Multiplication Builder(Expression e1, Expression e2, Expression e3) { return Multiplication::Builder(ArrayBuilder(e1, e2, e3).array(), 3); } - static Multiplication Builder(Expression e1, Expression e2, Expression e3, Expression e4) { return Multiplication::Builder(ArrayBuilder(e1, e2, e3, e4).array(), 4); } - static Multiplication Builder(Expression * children, size_t numberOfChildren) { return TreeHandle::NAryBuilder(children, numberOfChildren); } + static Multiplication Builder(const Tuple & children = {}) { return TreeHandle::NAryBuilder(convert(children)); } + // TODO: Get rid of those helpers + static Multiplication Builder(Expression e1) { return Multiplication::Builder({e1}); } + static Multiplication Builder(Expression e1, Expression e2) { return Multiplication::Builder({e1, e2}); } + static Multiplication Builder(Expression e1, Expression e2, Expression e3) { return Multiplication::Builder({e1, e2, e3}); } + static Multiplication Builder(Expression e1, Expression e2, Expression e3, Expression e4) { return Multiplication::Builder({e1, e2, e3, e4}); } // Properties int getPolynomialCoefficients(Context * context, const char * symbolName, Expression coefficients[], ExpressionNode::SymbolicComputation symbolicComputation) const; diff --git a/poincare/include/poincare/naperian_logarithm.h b/poincare/include/poincare/naperian_logarithm.h index 8ce012b1f..b466af839 100644 --- a/poincare/include/poincare/naperian_logarithm.h +++ b/poincare/include/poincare/naperian_logarithm.h @@ -46,7 +46,7 @@ private: class NaperianLogarithm final : public Expression { public: NaperianLogarithm(const NaperianLogarithmNode * n) : Expression(n) {} - static NaperianLogarithm Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static NaperianLogarithm Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("ln", 1, &UntypedBuilderOneChild); diff --git a/poincare/include/poincare/norm_cdf.h b/poincare/include/poincare/norm_cdf.h index d88448b4f..ae9eee78c 100644 --- a/poincare/include/poincare/norm_cdf.h +++ b/poincare/include/poincare/norm_cdf.h @@ -37,7 +37,7 @@ private: class NormCDF final : public NormalDistributionFunction { public: NormCDF(const NormCDFNode * n) : NormalDistributionFunction(n) {} - static NormCDF Builder(Expression child0, Expression child1, Expression child2) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1, child2).array(), 3); } + static NormCDF Builder(Expression child0, Expression child1, Expression child2) { return TreeHandle::FixedArityBuilder({child0, child1, child2}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("normcdf", 3, &UntypedBuilderThreeChildren); }; diff --git a/poincare/include/poincare/norm_cdf2.h b/poincare/include/poincare/norm_cdf2.h index 4282a432f..2db2965a4 100644 --- a/poincare/include/poincare/norm_cdf2.h +++ b/poincare/include/poincare/norm_cdf2.h @@ -39,7 +39,7 @@ private: class NormCDF2 final : public NormalDistributionFunction { public: NormCDF2(const NormCDF2Node * n) : NormalDistributionFunction(n) {} - static NormCDF2 Builder(Expression child0, Expression child1, Expression child2, Expression child3) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1, child2, child3).array(), 4); } + static NormCDF2 Builder(Expression child0, Expression child1, Expression child2, Expression child3) { return TreeHandle::FixedArityBuilder({child0, child1, child2, child3}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("normcdf2", 4, &UntypedBuilderFourChildren); }; diff --git a/poincare/include/poincare/norm_pdf.h b/poincare/include/poincare/norm_pdf.h index c1b66a5c4..5467a478e 100644 --- a/poincare/include/poincare/norm_pdf.h +++ b/poincare/include/poincare/norm_pdf.h @@ -37,7 +37,7 @@ private: class NormPDF final : public NormalDistributionFunction { public: NormPDF(const NormPDFNode * n) : NormalDistributionFunction(n) {} - static NormPDF Builder(Expression child0, Expression child1, Expression child2) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1, child2).array(), 3); } + static NormPDF Builder(Expression child0, Expression child1, Expression child2) { return TreeHandle::FixedArityBuilder({child0, child1, child2}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("normpdf", 3, &UntypedBuilderThreeChildren); }; diff --git a/poincare/include/poincare/nth_root.h b/poincare/include/poincare/nth_root.h index 4a4d4f5c8..d0d1d8e87 100644 --- a/poincare/include/poincare/nth_root.h +++ b/poincare/include/poincare/nth_root.h @@ -38,7 +38,7 @@ private: class NthRoot final : public Expression { public: NthRoot(const NthRootNode * n) : Expression(n) {} - static NthRoot Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1).array(), 2); } + static NthRoot Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder({child0, child1}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("root", 2, &UntypedBuilderTwoChildren); Expression shallowReduce(ExpressionNode::ReductionContext reductionContext); diff --git a/poincare/include/poincare/opposite.h b/poincare/include/poincare/opposite.h index 91f72be17..c4fc89166 100644 --- a/poincare/include/poincare/opposite.h +++ b/poincare/include/poincare/opposite.h @@ -50,7 +50,7 @@ class Opposite final : public Expression { public: Opposite(const OppositeNode * n) : Expression(n) {} static Opposite Builder() { return TreeHandle::FixedArityBuilder(); } - static Opposite Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static Opposite Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } Expression shallowReduce(ExpressionNode::ReductionContext reductionContext); }; diff --git a/poincare/include/poincare/parenthesis.h b/poincare/include/poincare/parenthesis.h index 492bbf424..067898502 100644 --- a/poincare/include/poincare/parenthesis.h +++ b/poincare/include/poincare/parenthesis.h @@ -40,7 +40,7 @@ private: class Parenthesis final : public Expression { public: Parenthesis(const ParenthesisNode * n) : Expression(n) {} - static Parenthesis Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static Parenthesis Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } // Expression Expression shallowReduce(); }; diff --git a/poincare/include/poincare/permute_coefficient.h b/poincare/include/poincare/permute_coefficient.h index a4eee719f..1bc05924b 100644 --- a/poincare/include/poincare/permute_coefficient.h +++ b/poincare/include/poincare/permute_coefficient.h @@ -41,7 +41,7 @@ private: class PermuteCoefficient final : public Expression { public: PermuteCoefficient(const PermuteCoefficientNode * n) : Expression(n) {} - static PermuteCoefficient Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1).array(), 2); } + static PermuteCoefficient Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder({child0, child1}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("permute", 2, &UntypedBuilderTwoChildren); // Expression diff --git a/poincare/include/poincare/power.h b/poincare/include/poincare/power.h index 2e3f5ad4a..3c1e95aff 100644 --- a/poincare/include/poincare/power.h +++ b/poincare/include/poincare/power.h @@ -73,7 +73,7 @@ class Power final : public Expression { friend class Round; public: Power(const PowerNode * n) : Expression(n) {} - static Power Builder(Expression base, Expression exponent) { return TreeHandle::FixedArityBuilder(ArrayBuilder(base, exponent).array(), 2); } + static Power Builder(Expression base, Expression exponent) { return TreeHandle::FixedArityBuilder({base, exponent}); } Expression setSign(ExpressionNode::Sign s, ExpressionNode::ReductionContext reductionContext); int getPolynomialCoefficients(Context * context, const char * symbolName, Expression coefficients[]) const; diff --git a/poincare/include/poincare/prediction_interval.h b/poincare/include/poincare/prediction_interval.h index 1863e74c5..734b2ba22 100644 --- a/poincare/include/poincare/prediction_interval.h +++ b/poincare/include/poincare/prediction_interval.h @@ -39,7 +39,7 @@ private: class PredictionInterval final : public Expression { public: PredictionInterval(const PredictionIntervalNode * n) : Expression(n) {} - static PredictionInterval Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1).array(), 2); } + static PredictionInterval Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder({child0, child1}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("prediction95", 2, &UntypedBuilderTwoChildren); // Expression diff --git a/poincare/include/poincare/product.h b/poincare/include/poincare/product.h index 6b5641850..140fe5c4f 100644 --- a/poincare/include/poincare/product.h +++ b/poincare/include/poincare/product.h @@ -34,7 +34,7 @@ class Product final : public Sequence { friend class ProductNode; public: Product(const ProductNode * n) : Sequence(n) {} - static Product Builder(Expression child0, Symbol child1, Expression child2, Expression child3) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1, child2, child3).array(), 4); } + static Product Builder(Expression child0, Symbol child1, Expression child2, Expression child3) { return TreeHandle::FixedArityBuilder({child0, child1, child2, child3}); } static Expression UntypedBuilder(Expression children); static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("product", 4, &UntypedBuilder); diff --git a/poincare/include/poincare/product_layout.h b/poincare/include/poincare/product_layout.h index 2375503f6..79657f37f 100644 --- a/poincare/include/poincare/product_layout.h +++ b/poincare/include/poincare/product_layout.h @@ -29,7 +29,7 @@ private: class ProductLayout final : public Layout { public: - static ProductLayout Builder(Layout argument, Layout variable, Layout lowerB, Layout upperB) { return TreeHandle::FixedArityBuilder(ArrayBuilder(argument, variable, lowerB, upperB).array(), 4); } + static ProductLayout Builder(Layout argument, Layout variable, Layout lowerB, Layout upperB) { return TreeHandle::FixedArityBuilder({argument, variable, lowerB, upperB}); } ProductLayout() = delete; }; diff --git a/poincare/include/poincare/randint.h b/poincare/include/poincare/randint.h index 8959ec826..b8f03edc3 100644 --- a/poincare/include/poincare/randint.h +++ b/poincare/include/poincare/randint.h @@ -45,7 +45,7 @@ class Randint final : public Expression { friend class RandintNode; public: Randint(const RandintNode * n) : Expression(n) {} - static Randint Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1).array(), 2); } + static Randint Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder({child0, child1}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("randint", 2, &UntypedBuilderTwoChildren); private: Expression shallowReduce(ExpressionNode::ReductionContext reductionContext); diff --git a/poincare/include/poincare/real_part.h b/poincare/include/poincare/real_part.h index efdd3d1cb..ddcbd24a7 100644 --- a/poincare/include/poincare/real_part.h +++ b/poincare/include/poincare/real_part.h @@ -45,7 +45,7 @@ private: class RealPart final : public Expression { public: RealPart(const RealPartNode * n) : Expression(n) {} - static RealPart Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static RealPart Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("re", 1, &UntypedBuilderOneChild); diff --git a/poincare/include/poincare/round.h b/poincare/include/poincare/round.h index 2d9ace90f..bb4a769aa 100644 --- a/poincare/include/poincare/round.h +++ b/poincare/include/poincare/round.h @@ -38,7 +38,7 @@ private: class Round final : public Expression { public: Round(const RoundNode * n) : Expression(n) {} - static Round Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1).array(), 2); } + static Round Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder({child0, child1}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("round", 2, &UntypedBuilderTwoChildren); Expression shallowReduce(ExpressionNode::ReductionContext reductionContext); diff --git a/poincare/include/poincare/sign_function.h b/poincare/include/poincare/sign_function.h index fc3fc0da6..d5379058a 100644 --- a/poincare/include/poincare/sign_function.h +++ b/poincare/include/poincare/sign_function.h @@ -45,7 +45,7 @@ private: class SignFunction final : public Expression { public: SignFunction(const SignFunctionNode * n) : Expression(n) {} - static SignFunction Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static SignFunction Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("sign", 1, &UntypedBuilderOneChild); diff --git a/poincare/include/poincare/sine.h b/poincare/include/poincare/sine.h index 2700c2211..80307a048 100644 --- a/poincare/include/poincare/sine.h +++ b/poincare/include/poincare/sine.h @@ -47,7 +47,7 @@ private: class Sine final : public Expression { public: Sine(const SineNode * n) : Expression(n) {} - static Sine Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static Sine Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("sin", 1, &UntypedBuilderOneChild); diff --git a/poincare/include/poincare/square_root.h b/poincare/include/poincare/square_root.h index f92f0fc05..6a46aee29 100644 --- a/poincare/include/poincare/square_root.h +++ b/poincare/include/poincare/square_root.h @@ -41,7 +41,7 @@ private: class SquareRoot final : public Expression { public: SquareRoot(const SquareRootNode * n) : Expression(n) {} - static SquareRoot Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static SquareRoot Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("√", 1, &UntypedBuilderOneChild); Expression shallowReduce(ExpressionNode::ReductionContext reductionContext); }; diff --git a/poincare/include/poincare/store.h b/poincare/include/poincare/store.h index 7a27bfa4c..95bd3c146 100644 --- a/poincare/include/poincare/store.h +++ b/poincare/include/poincare/store.h @@ -32,7 +32,7 @@ class Store final : public Expression { friend class StoreNode; public: Store(const StoreNode * n) : Expression(n) {} - static Store Builder(Expression value, SymbolAbstract symbol) { return TreeHandle::FixedArityBuilder(ArrayBuilder(value, symbol).array(), 2); } + static Store Builder(Expression value, SymbolAbstract symbol) { return TreeHandle::FixedArityBuilder({value, symbol}); } // Store const SymbolAbstract symbol() const { diff --git a/poincare/include/poincare/subtraction.h b/poincare/include/poincare/subtraction.h index 54bd71906..f8703648e 100644 --- a/poincare/include/poincare/subtraction.h +++ b/poincare/include/poincare/subtraction.h @@ -62,7 +62,7 @@ class Subtraction final : public Expression { public: Subtraction(const SubtractionNode * n) : Expression(n) {} static Subtraction Builder() { return TreeHandle::FixedArityBuilder(); } - static Subtraction Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1).array(), 2); } + static Subtraction Builder(Expression child0, Expression child1) { return TreeHandle::FixedArityBuilder({child0, child1}); } // Expression Expression shallowReduce(ExpressionNode::ReductionContext reductionContext); diff --git a/poincare/include/poincare/sum.h b/poincare/include/poincare/sum.h index 72368e1f3..af1542203 100644 --- a/poincare/include/poincare/sum.h +++ b/poincare/include/poincare/sum.h @@ -34,7 +34,7 @@ class Sum final : public Sequence { friend class SumNode; public: Sum(const SumNode * n) : Sequence(n) {} - static Sum Builder(Expression child0, Symbol child1, Expression child2, Expression child3) { return TreeHandle::FixedArityBuilder(ArrayBuilder(child0, child1, child2, child3).array(), 4); } + static Sum Builder(Expression child0, Symbol child1, Expression child2, Expression child3) { return TreeHandle::FixedArityBuilder({child0, child1, child2, child3}); } static Expression UntypedBuilder(Expression children); static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("sum", 4, &UntypedBuilder); diff --git a/poincare/include/poincare/sum_layout.h b/poincare/include/poincare/sum_layout.h index 382ab0ec5..0505b5226 100644 --- a/poincare/include/poincare/sum_layout.h +++ b/poincare/include/poincare/sum_layout.h @@ -27,7 +27,7 @@ private: class SumLayout final : public Layout { public: - static SumLayout Builder(Layout argument, Layout variable, Layout lowerB, Layout upperB) { return TreeHandle::FixedArityBuilder(ArrayBuilder(argument, variable, lowerB, upperB).array(), 4); } + static SumLayout Builder(Layout argument, Layout variable, Layout lowerB, Layout upperB) { return TreeHandle::FixedArityBuilder({argument, variable, lowerB, upperB}); } SumLayout() = delete; }; diff --git a/poincare/include/poincare/tangent.h b/poincare/include/poincare/tangent.h index 159f0acb1..ee0891038 100644 --- a/poincare/include/poincare/tangent.h +++ b/poincare/include/poincare/tangent.h @@ -45,7 +45,7 @@ private: class Tangent final : public Expression { public: Tangent(const TangentNode * n) : Expression(n) {} - static Tangent Builder(Expression child) { return TreeHandle::FixedArityBuilder(&child, 1); } + static Tangent Builder(Expression child) { return TreeHandle::FixedArityBuilder({child}); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("tan", 1, &UntypedBuilderOneChild); diff --git a/poincare/include/poincare/tree_handle.h b/poincare/include/poincare/tree_handle.h index 5e2a07d9b..b171871b6 100644 --- a/poincare/include/poincare/tree_handle.h +++ b/poincare/include/poincare/tree_handle.h @@ -2,7 +2,7 @@ #define POINCARE_TREE_BY_REFERENCE_H #include -#include +#include namespace Shared { class ContinuousFunction; @@ -23,8 +23,6 @@ namespace Poincare { * equivalent to Logarithm l = Logarithm(clone())). */ class TreeHandle { - template - friend class ArrayBuilder; friend class ::Shared::ContinuousFunction; friend class TreeNode; friend class TreePool; @@ -107,6 +105,8 @@ public: void log() const; #endif + typedef std::initializer_list Tuple; + protected: /* Constructor */ TreeHandle(const TreeNode * node); @@ -119,9 +119,9 @@ protected: // WARNING: if the children table is the result of a cast, the object downcasted has to be the same size as a TreeHandle. template - static T NAryBuilder(TreeHandle * children = nullptr, size_t numberOfChildren = 0); + static T NAryBuilder(const Tuple & children = {}); template - static T FixedArityBuilder(TreeHandle * children = nullptr, size_t numberOfChildren = 0); + static T FixedArityBuilder(const Tuple & children = {}); static TreeHandle BuildWithGhostChildren(TreeNode * node); diff --git a/poincare/include/poincare/unit_convert.h b/poincare/include/poincare/unit_convert.h index 5bad4df54..70943a9f5 100644 --- a/poincare/include/poincare/unit_convert.h +++ b/poincare/include/poincare/unit_convert.h @@ -33,7 +33,7 @@ class UnitConvert final : public Expression { friend class UnitConvertNode; public: UnitConvert(const UnitConvertNode * n) : Expression(n) {} - static UnitConvert Builder(Expression value, Expression unit) { return TreeHandle::FixedArityBuilder(ArrayBuilder(value, unit).array(), 2); } + static UnitConvert Builder(Expression value, Expression unit) { return TreeHandle::FixedArityBuilder({value, unit}); } // Expression Expression shallowReduce(ExpressionNode::ReductionContext reductionContext); diff --git a/poincare/src/matrix.cpp b/poincare/src/matrix.cpp index dfdaedc3f..e37aeafcd 100644 --- a/poincare/src/matrix.cpp +++ b/poincare/src/matrix.cpp @@ -378,17 +378,17 @@ Expression Matrix::determinant(ExpressionNode::ReductionContext reductionContext Expression g = m.matrixChild(2,0); Expression h = m.matrixChild(2,1); Expression i = m.matrixChild(2,2); - constexpr int additionChildrenCount = 6; - Expression additionChildren[additionChildrenCount] = { + Tuple children = { Multiplication::Builder(a.clone(), e.clone(), i.clone()), Multiplication::Builder(b.clone(), f.clone(), g.clone()), Multiplication::Builder(c.clone(), d.clone(), h.clone()), Multiplication::Builder(Rational::Builder(-1), c, e, g), Multiplication::Builder(Rational::Builder(-1), b, d, i), - Multiplication::Builder(Rational::Builder(-1), a, f, h)}; - Expression result = Addition::Builder(additionChildren, additionChildrenCount); - for (int i = 0; i < additionChildrenCount; i++) { - additionChildren[i].shallowReduce(reductionContext); + Multiplication::Builder(Rational::Builder(-1), a, f, h) + }; + Expression result = Addition::Builder(children); + for (Expression child : children) { + child.shallowReduce(reductionContext); } return result; } diff --git a/poincare/src/matrix_layout.cpp b/poincare/src/matrix_layout.cpp index a82ac00af..cd08c0e17 100644 --- a/poincare/src/matrix_layout.cpp +++ b/poincare/src/matrix_layout.cpp @@ -331,7 +331,7 @@ void MatrixLayoutNode::didReplaceChildAtIndex(int index, LayoutCursor * cursor, } MatrixLayout MatrixLayout::Builder(Layout l1, Layout l2, Layout l3, Layout l4) { - MatrixLayout m = TreeHandle::NAryBuilder(ArrayBuilder(l1,l2,l3,l4).array(), 4); + MatrixLayout m = TreeHandle::NAryBuilder({l1, l2, l3, l4}); m.setDimensions(2, 2); return m; } diff --git a/poincare/src/tree_handle.cpp b/poincare/src/tree_handle.cpp index 3e87d6f7a..97e7fbfc1 100644 --- a/poincare/src/tree_handle.cpp +++ b/poincare/src/tree_handle.cpp @@ -212,19 +212,22 @@ TreeHandle TreeHandle::Builder() { } template -T TreeHandle::NAryBuilder(TreeHandle * children, size_t numberOfChildren) { +T TreeHandle::NAryBuilder(const Tuple & children) { TreeHandle h = Builder(); - for (size_t i = 0; i < numberOfChildren; i++) { - h.addChildAtIndexInPlace(children[i], i, i); + size_t i = 0; + for (TreeHandle child : children) { + h.addChildAtIndexInPlace(child, i, i); + i++; } return static_cast(h); } template -T TreeHandle::FixedArityBuilder(TreeHandle * children, size_t numberOfChildren) { +T TreeHandle::FixedArityBuilder(const Tuple & children) { TreeHandle h = Builder(); - for (size_t i = 0; i < numberOfChildren; i++) { - h.replaceChildAtIndexInPlace(i, children[i]); + size_t i = 0; + for (TreeHandle child : children) { + h.replaceChildAtIndexInPlace(i++, child); } return static_cast(h); } @@ -277,96 +280,96 @@ void TreeHandle::release(uint16_t identifier) { node->release(node->numberOfChildren()); } -template AbsoluteValue TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template AbsoluteValueLayout TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Addition TreeHandle::NAryBuilder(TreeHandle*, size_t); -template ArcCosine TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template ArcSine TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template ArcTangent TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template BinomCDF TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template BinomialCoefficient TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template BinomialCoefficientLayout TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template BinomPDF TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Ceiling TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template CeilingLayout TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template CommonLogarithm TreeHandle::FixedArityBuilder >(TreeHandle*, size_t); -template ComplexArgument TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template ComplexCartesian TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template CondensedSumLayout TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template ConfidenceInterval TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Conjugate TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template ConjugateLayout TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Cosine TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Derivative TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Determinant TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Division TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template DivisionQuotient TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template DivisionRemainder TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template EmptyExpression TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Equal TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Factor TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Factorial TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Floor TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template FloorLayout TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template FracPart TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template FractionLayout TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Ghost TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template GreatCommonDivisor TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template HorizontalLayout TreeHandle::NAryBuilder(TreeHandle*, size_t); -template HyperbolicArcCosine TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template HyperbolicArcSine TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template HyperbolicArcTangent TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template HyperbolicCosine TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template HyperbolicSine TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template HyperbolicTangent TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template ImaginaryPart TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Integral TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template IntegralLayout TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template InvBinom TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template InvNorm TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template LeastCommonMultiple TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template LeftParenthesisLayout TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template LeftSquareBracketLayout TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Logarithm TreeHandle::FixedArityBuilder >(TreeHandle*, size_t); -template Matrix TreeHandle::NAryBuilder(TreeHandle*, size_t); -template MatrixComplex TreeHandle::NAryBuilder, MatrixComplexNode >(TreeHandle*, size_t); -template MatrixComplex TreeHandle::NAryBuilder, MatrixComplexNode >(TreeHandle*, size_t); -template MatrixDimension TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template MatrixIdentity TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template MatrixInverse TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template MatrixTrace TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template MatrixTranspose TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Multiplication TreeHandle::NAryBuilder(TreeHandle*, size_t); -template NaperianLogarithm TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template NormCDF TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template NormCDF2 TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template NormPDF TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template NthRoot TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Opposite TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Parenthesis TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template PermuteCoefficient TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Power TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template PredictionInterval TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Product TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template ProductLayout TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Randint TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Random TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template RealPart TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template RightParenthesisLayout TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template RightSquareBracketLayout TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Round TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template SignFunction TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template SimplePredictionInterval TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Sine TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template SquareRoot TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Store TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Subtraction TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Sum TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template SumLayout TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Tangent TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Undefined TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template UnitConvert TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template Unreal TreeHandle::FixedArityBuilder(TreeHandle*, size_t); -template MatrixLayout TreeHandle::NAryBuilder(TreeHandle*, size_t); +template AbsoluteValue TreeHandle::FixedArityBuilder(const Tuple &); +template AbsoluteValueLayout TreeHandle::FixedArityBuilder(const Tuple &); +template Addition TreeHandle::NAryBuilder(const Tuple &); +template ArcCosine TreeHandle::FixedArityBuilder(const Tuple &); +template ArcSine TreeHandle::FixedArityBuilder(const Tuple &); +template ArcTangent TreeHandle::FixedArityBuilder(const Tuple &); +template BinomCDF TreeHandle::FixedArityBuilder(const Tuple &); +template BinomialCoefficient TreeHandle::FixedArityBuilder(const Tuple &); +template BinomialCoefficientLayout TreeHandle::FixedArityBuilder(const Tuple &); +template BinomPDF TreeHandle::FixedArityBuilder(const Tuple &); +template Ceiling TreeHandle::FixedArityBuilder(const Tuple &); +template CeilingLayout TreeHandle::FixedArityBuilder(const Tuple &); +template CommonLogarithm TreeHandle::FixedArityBuilder >(const Tuple &); +template ComplexArgument TreeHandle::FixedArityBuilder(const Tuple &); +template ComplexCartesian TreeHandle::FixedArityBuilder(const Tuple &); +template CondensedSumLayout TreeHandle::FixedArityBuilder(const Tuple &); +template ConfidenceInterval TreeHandle::FixedArityBuilder(const Tuple &); +template Conjugate TreeHandle::FixedArityBuilder(const Tuple &); +template ConjugateLayout TreeHandle::FixedArityBuilder(const Tuple &); +template Cosine TreeHandle::FixedArityBuilder(const Tuple &); +template Derivative TreeHandle::FixedArityBuilder(const Tuple &); +template Determinant TreeHandle::FixedArityBuilder(const Tuple &); +template Division TreeHandle::FixedArityBuilder(const Tuple &); +template DivisionQuotient TreeHandle::FixedArityBuilder(const Tuple &); +template DivisionRemainder TreeHandle::FixedArityBuilder(const Tuple &); +template EmptyExpression TreeHandle::FixedArityBuilder(const Tuple &); +template Equal TreeHandle::FixedArityBuilder(const Tuple &); +template Factor TreeHandle::FixedArityBuilder(const Tuple &); +template Factorial TreeHandle::FixedArityBuilder(const Tuple &); +template Floor TreeHandle::FixedArityBuilder(const Tuple &); +template FloorLayout TreeHandle::FixedArityBuilder(const Tuple &); +template FracPart TreeHandle::FixedArityBuilder(const Tuple &); +template FractionLayout TreeHandle::FixedArityBuilder(const Tuple &); +template Ghost TreeHandle::FixedArityBuilder(const Tuple &); +template GreatCommonDivisor TreeHandle::FixedArityBuilder(const Tuple &); +template HorizontalLayout TreeHandle::NAryBuilder(const Tuple &); +template HyperbolicArcCosine TreeHandle::FixedArityBuilder(const Tuple &); +template HyperbolicArcSine TreeHandle::FixedArityBuilder(const Tuple &); +template HyperbolicArcTangent TreeHandle::FixedArityBuilder(const Tuple &); +template HyperbolicCosine TreeHandle::FixedArityBuilder(const Tuple &); +template HyperbolicSine TreeHandle::FixedArityBuilder(const Tuple &); +template HyperbolicTangent TreeHandle::FixedArityBuilder(const Tuple &); +template ImaginaryPart TreeHandle::FixedArityBuilder(const Tuple &); +template Integral TreeHandle::FixedArityBuilder(const Tuple &); +template IntegralLayout TreeHandle::FixedArityBuilder(const Tuple &); +template InvBinom TreeHandle::FixedArityBuilder(const Tuple &); +template InvNorm TreeHandle::FixedArityBuilder(const Tuple &); +template LeastCommonMultiple TreeHandle::FixedArityBuilder(const Tuple &); +template LeftParenthesisLayout TreeHandle::FixedArityBuilder(const Tuple &); +template LeftSquareBracketLayout TreeHandle::FixedArityBuilder(const Tuple &); +template Logarithm TreeHandle::FixedArityBuilder >(const Tuple &); +template Matrix TreeHandle::NAryBuilder(const Tuple &); +template MatrixComplex TreeHandle::NAryBuilder, MatrixComplexNode >(const Tuple &); +template MatrixComplex TreeHandle::NAryBuilder, MatrixComplexNode >(const Tuple &); +template MatrixDimension TreeHandle::FixedArityBuilder(const Tuple &); +template MatrixIdentity TreeHandle::FixedArityBuilder(const Tuple &); +template MatrixInverse TreeHandle::FixedArityBuilder(const Tuple &); +template MatrixTrace TreeHandle::FixedArityBuilder(const Tuple &); +template MatrixTranspose TreeHandle::FixedArityBuilder(const Tuple &); +template Multiplication TreeHandle::NAryBuilder(const Tuple &); +template NaperianLogarithm TreeHandle::FixedArityBuilder(const Tuple &); +template NormCDF TreeHandle::FixedArityBuilder(const Tuple &); +template NormCDF2 TreeHandle::FixedArityBuilder(const Tuple &); +template NormPDF TreeHandle::FixedArityBuilder(const Tuple &); +template NthRoot TreeHandle::FixedArityBuilder(const Tuple &); +template Opposite TreeHandle::FixedArityBuilder(const Tuple &); +template Parenthesis TreeHandle::FixedArityBuilder(const Tuple &); +template PermuteCoefficient TreeHandle::FixedArityBuilder(const Tuple &); +template Power TreeHandle::FixedArityBuilder(const Tuple &); +template PredictionInterval TreeHandle::FixedArityBuilder(const Tuple &); +template Product TreeHandle::FixedArityBuilder(const Tuple &); +template ProductLayout TreeHandle::FixedArityBuilder(const Tuple &); +template Randint TreeHandle::FixedArityBuilder(const Tuple &); +template Random TreeHandle::FixedArityBuilder(const Tuple &); +template RealPart TreeHandle::FixedArityBuilder(const Tuple &); +template RightParenthesisLayout TreeHandle::FixedArityBuilder(const Tuple &); +template RightSquareBracketLayout TreeHandle::FixedArityBuilder(const Tuple &); +template Round TreeHandle::FixedArityBuilder(const Tuple &); +template SignFunction TreeHandle::FixedArityBuilder(const Tuple &); +template SimplePredictionInterval TreeHandle::FixedArityBuilder(const Tuple &); +template Sine TreeHandle::FixedArityBuilder(const Tuple &); +template SquareRoot TreeHandle::FixedArityBuilder(const Tuple &); +template Store TreeHandle::FixedArityBuilder(const Tuple &); +template Subtraction TreeHandle::FixedArityBuilder(const Tuple &); +template Sum TreeHandle::FixedArityBuilder(const Tuple &); +template SumLayout TreeHandle::FixedArityBuilder(const Tuple &); +template Tangent TreeHandle::FixedArityBuilder(const Tuple &); +template Undefined TreeHandle::FixedArityBuilder(const Tuple &); +template UnitConvert TreeHandle::FixedArityBuilder(const Tuple &); +template Unreal TreeHandle::FixedArityBuilder(const Tuple &); +template MatrixLayout TreeHandle::NAryBuilder(const Tuple &); } diff --git a/poincare/test/expression_order.cpp b/poincare/test/expression_order.cpp index adf4ed1be..33a9b2512 100644 --- a/poincare/test/expression_order.cpp +++ b/poincare/test/expression_order.cpp @@ -98,11 +98,16 @@ QUIZ_CASE(poincare_expression_order_addition_multiplication) { } { // 1 + 2 + 0 -> 2 + 1 + 0 - constexpr int numberOfChildren = 3; - Expression children[numberOfChildren] = {Rational::Builder(1), Rational::Builder(2), Rational::Builder(0)}; - Expression childrenSorted[numberOfChildren] = {Rational::Builder(2), Rational::Builder(1), Rational::Builder(0)}; - Expression e1 = Addition::Builder(children, numberOfChildren); - Expression e2 = Addition::Builder(childrenSorted, numberOfChildren); + Expression e1 = Addition::Builder({ + Rational::Builder(1), + Rational::Builder(2), + Rational::Builder(0) + }); + Expression e2 = Addition::Builder({ + Rational::Builder(2), + Rational::Builder(1), + Rational::Builder(0) + }); assert_multiplication_or_addition_is_ordered_as(e1, e2); } { @@ -110,11 +115,8 @@ QUIZ_CASE(poincare_expression_order_addition_multiplication) { Expression pi = Constant::Builder(UCodePointGreekSmallLetterPi); Expression i = Constant::Builder(UCodePointMathematicalBoldSmallI); Expression e = Constant::Builder(UCodePointScriptSmallE); - constexpr int numberOfChildren = 3; - Expression children[numberOfChildren] = {pi.clone(), i.clone(), e.clone()}; - Expression childrenSorted[numberOfChildren] = {e, pi, i}; - Expression e1 = Addition::Builder(children, numberOfChildren); - Expression e2 = Addition::Builder(childrenSorted, numberOfChildren); + Expression e1 = Addition::Builder({pi.clone(), i.clone(), e.clone()}); + Expression e2 = Addition::Builder({e, pi, i}); assert_multiplication_or_addition_is_ordered_as(e1, e2); } { @@ -124,22 +126,19 @@ QUIZ_CASE(poincare_expression_order_addition_multiplication) { assert_multiplication_or_addition_is_ordered_as(e1, e2); } { - constexpr int numberOfChildren = 4; - Expression children[numberOfChildren] = { + // c + b^2 + a^2 + a -> a^2 + a + b^2 + c + Expression e1 = Addition::Builder({ Symbol::Builder('c'), Power::Builder(Symbol::Builder('b'), Rational::Builder(2)), Power::Builder(Symbol::Builder('a'), Rational::Builder(2)), Symbol::Builder('a') - }; - Expression childrenSorted[numberOfChildren] = { + }); + Expression e2 = Addition::Builder({ Power::Builder(Symbol::Builder('a'), Rational::Builder(2)), Symbol::Builder('a'), Power::Builder(Symbol::Builder('b'), Rational::Builder(2)), Symbol::Builder('c') - }; - // c + b^2 + a^2 + a -> a^2 + a + b^2 + c - Expression e1 = Addition::Builder(children, numberOfChildren); - Expression e2 = Addition::Builder(childrenSorted, numberOfChildren); + }); assert_multiplication_or_addition_is_ordered_as(e1, e2); } { @@ -194,21 +193,18 @@ QUIZ_CASE(poincare_expression_order_addition_multiplication) { Expression childMatrix2 = Matrix::Builder(); static_cast(childMatrix2).addChildAtIndexInPlace(Rational::Builder(0), 0, 0); - constexpr int numberOfChildren = 4; - Expression children[numberOfChildren] = { + Expression e1 = Multiplication::Builder({ child2.clone(), childMatrix1.clone(), childMatrix2.clone(), child1.clone() - }; - Expression childrenSorted[numberOfChildren] = { + }); + Expression e2 = Multiplication::Builder({ child1.clone(), child2.clone(), childMatrix1.clone(), childMatrix2.clone() - }; - Expression e1 = Multiplication::Builder(children, numberOfChildren); - Expression e2 = Multiplication::Builder(childrenSorted, numberOfChildren); + }); assert_multiplication_or_addition_is_ordered_as(e1, e2); } diff --git a/poincare/test/layout_to_expression.cpp b/poincare/test/layout_to_expression.cpp index fc6a819cc..6e99ebc69 100644 --- a/poincare/test/layout_to_expression.cpp +++ b/poincare/test/layout_to_expression.cpp @@ -43,19 +43,18 @@ QUIZ_CASE(poincare_layout_to_expression_unparsable) { * ∑ (5) * n=1 */ - constexpr int childrenCount = 5; - Layout children[childrenCount] = { - CodePointLayout::Builder('2'), - RightParenthesisLayout::Builder(), - CodePointLayout::Builder('+'), - LeftParenthesisLayout::Builder(), - CodePointLayout::Builder('1')}; - Layout l = SumLayout::Builder( - CodePointLayout::Builder('5'), - CodePointLayout::Builder('n'), - CodePointLayout::Builder('1'), - HorizontalLayout::Builder(children, childrenCount)); + CodePointLayout::Builder('5'), + CodePointLayout::Builder('n'), + CodePointLayout::Builder('1'), + HorizontalLayout::Builder({ + CodePointLayout::Builder('2'), + RightParenthesisLayout::Builder(), + CodePointLayout::Builder('+'), + LeftParenthesisLayout::Builder(), + CodePointLayout::Builder('1') + }) + ); assert_layout_is_not_parsed(l); } @@ -64,34 +63,30 @@ QUIZ_CASE(poincare_layout_to_expression_unparsable) { * π (5) * n=1+binomial(3 */ - - constexpr int children1Count = 12; - Layout children1[children1Count] = { - CodePointLayout::Builder('1'), - CodePointLayout::Builder('+'), - CodePointLayout::Builder('b'), - CodePointLayout::Builder('i'), - CodePointLayout::Builder('n'), - CodePointLayout::Builder('o'), - CodePointLayout::Builder('m'), - CodePointLayout::Builder('i'), - CodePointLayout::Builder('a'), - CodePointLayout::Builder('l'), - LeftParenthesisLayout::Builder(), - CodePointLayout::Builder('3')}; - - constexpr int children2Count = 4; - Layout children2[children2Count] = { - CodePointLayout::Builder('2'), - RightParenthesisLayout::Builder(), - CodePointLayout::Builder(','), - CodePointLayout::Builder('1')}; - Layout l = SumLayout::Builder( - CodePointLayout::Builder('5'), + CodePointLayout::Builder('5'), + CodePointLayout::Builder('n'), + HorizontalLayout::Builder({ + CodePointLayout::Builder('1'), + CodePointLayout::Builder('+'), + CodePointLayout::Builder('b'), + CodePointLayout::Builder('i'), CodePointLayout::Builder('n'), - HorizontalLayout::Builder(children1, children1Count), - HorizontalLayout::Builder(children2, children2Count)); + CodePointLayout::Builder('o'), + CodePointLayout::Builder('m'), + CodePointLayout::Builder('i'), + CodePointLayout::Builder('a'), + CodePointLayout::Builder('l'), + LeftParenthesisLayout::Builder(), + CodePointLayout::Builder('3') + }), + HorizontalLayout::Builder({ + CodePointLayout::Builder('2'), + RightParenthesisLayout::Builder(), + CodePointLayout::Builder(','), + CodePointLayout::Builder('1') + }) + ); assert_layout_is_not_parsed(l); } @@ -100,19 +95,18 @@ QUIZ_CASE(poincare_layout_to_expression_unparsable) { * π (5) * n=1 */ - constexpr int childrenCount = 5; - Layout children[childrenCount] = { - CodePointLayout::Builder('2'), - RightParenthesisLayout::Builder(), - CodePointLayout::Builder('+'), - LeftParenthesisLayout::Builder(), - CodePointLayout::Builder('1')}; - Layout l = ProductLayout::Builder( - CodePointLayout::Builder('5'), - CodePointLayout::Builder('n'), - CodePointLayout::Builder('1'), - HorizontalLayout::Builder(children, childrenCount)); + CodePointLayout::Builder('5'), + CodePointLayout::Builder('n'), + CodePointLayout::Builder('1'), + HorizontalLayout::Builder({ + CodePointLayout::Builder('2'), + RightParenthesisLayout::Builder(), + CodePointLayout::Builder('+'), + LeftParenthesisLayout::Builder(), + CodePointLayout::Builder('1') + }) + ); assert_layout_is_not_parsed(l); } @@ -121,34 +115,30 @@ QUIZ_CASE(poincare_layout_to_expression_unparsable) { * π (5) * n=1+binomial(3 */ - - constexpr int children1Count = 12; - Layout children1[children1Count] = { - CodePointLayout::Builder('1'), - CodePointLayout::Builder('+'), - CodePointLayout::Builder('b'), - CodePointLayout::Builder('i'), - CodePointLayout::Builder('n'), - CodePointLayout::Builder('o'), - CodePointLayout::Builder('m'), - CodePointLayout::Builder('i'), - CodePointLayout::Builder('a'), - CodePointLayout::Builder('l'), - LeftParenthesisLayout::Builder(), - CodePointLayout::Builder('3')}; - - constexpr int children2Count = 4; - Layout children2[children2Count] = { - CodePointLayout::Builder('2'), - RightParenthesisLayout::Builder(), - CodePointLayout::Builder(','), - CodePointLayout::Builder('1')}; - Layout l = ProductLayout::Builder( - CodePointLayout::Builder('5'), + CodePointLayout::Builder('5'), + CodePointLayout::Builder('n'), + HorizontalLayout::Builder({ + CodePointLayout::Builder('1'), + CodePointLayout::Builder('+'), + CodePointLayout::Builder('b'), + CodePointLayout::Builder('i'), CodePointLayout::Builder('n'), - HorizontalLayout::Builder(children1, children1Count), - HorizontalLayout::Builder(children2, children2Count)); + CodePointLayout::Builder('o'), + CodePointLayout::Builder('m'), + CodePointLayout::Builder('i'), + CodePointLayout::Builder('a'), + CodePointLayout::Builder('l'), + LeftParenthesisLayout::Builder(), + CodePointLayout::Builder('3') + }), + HorizontalLayout::Builder({ + CodePointLayout::Builder('2'), + RightParenthesisLayout::Builder(), + CodePointLayout::Builder(','), + CodePointLayout::Builder('1') + }) + ); assert_layout_is_not_parsed(l); } @@ -157,19 +147,18 @@ QUIZ_CASE(poincare_layout_to_expression_unparsable) { * ∫ (5)dx * 1 */ - constexpr int childrenCount = 5; - Layout children[childrenCount] = { - CodePointLayout::Builder('2'), - RightParenthesisLayout::Builder(), - CodePointLayout::Builder('+'), - LeftParenthesisLayout::Builder(), - CodePointLayout::Builder('1')}; - Layout l = IntegralLayout::Builder( - CodePointLayout::Builder('5'), - CodePointLayout::Builder('x'), - CodePointLayout::Builder('1'), - HorizontalLayout::Builder(children, childrenCount)); + CodePointLayout::Builder('5'), + CodePointLayout::Builder('x'), + CodePointLayout::Builder('1'), + HorizontalLayout::Builder({ + CodePointLayout::Builder('2'), + RightParenthesisLayout::Builder(), + CodePointLayout::Builder('+'), + LeftParenthesisLayout::Builder(), + CodePointLayout::Builder('1') + }) + ); assert_layout_is_not_parsed(l); } @@ -178,48 +167,42 @@ QUIZ_CASE(poincare_layout_to_expression_unparsable) { * ∫ (5)dx * 1+binomial(3 */ - - constexpr int children1Count = 12; - Layout children1[children1Count] = { - CodePointLayout::Builder('1'), - CodePointLayout::Builder('+'), - CodePointLayout::Builder('b'), - CodePointLayout::Builder('i'), - CodePointLayout::Builder('n'), - CodePointLayout::Builder('o'), - CodePointLayout::Builder('m'), - CodePointLayout::Builder('i'), - CodePointLayout::Builder('a'), - CodePointLayout::Builder('l'), - LeftParenthesisLayout::Builder(), - CodePointLayout::Builder('3')}; - - constexpr int children2Count = 4; - Layout children2[children2Count] = { - CodePointLayout::Builder('2'), - RightParenthesisLayout::Builder(), - CodePointLayout::Builder(','), - CodePointLayout::Builder('1')}; - Layout l = IntegralLayout::Builder( - CodePointLayout::Builder('5'), - CodePointLayout::Builder('x'), - HorizontalLayout::Builder(children1, children1Count), - HorizontalLayout::Builder(children2, children2Count)); + CodePointLayout::Builder('5'), + CodePointLayout::Builder('x'), + HorizontalLayout::Builder({ + CodePointLayout::Builder('1'), + CodePointLayout::Builder('+'), + CodePointLayout::Builder('b'), + CodePointLayout::Builder('i'), + CodePointLayout::Builder('n'), + CodePointLayout::Builder('o'), + CodePointLayout::Builder('m'), + CodePointLayout::Builder('i'), + CodePointLayout::Builder('a'), + CodePointLayout::Builder('l'), + LeftParenthesisLayout::Builder(), + CodePointLayout::Builder('3') + }), + HorizontalLayout::Builder({ + CodePointLayout::Builder('2'), + RightParenthesisLayout::Builder(), + CodePointLayout::Builder(','), + CodePointLayout::Builder('1') + }) + ); assert_layout_is_not_parsed(l); } { // |3)+(1| - constexpr int childrenCount = 5; - Layout children[childrenCount] = { + Layout l = AbsoluteValueLayout::Builder(HorizontalLayout::Builder({ CodePointLayout::Builder('3'), RightParenthesisLayout::Builder(), CodePointLayout::Builder('+'), LeftParenthesisLayout::Builder(), - CodePointLayout::Builder('1')}; - - Layout l = AbsoluteValueLayout::Builder(HorizontalLayout::Builder(children, childrenCount)); + CodePointLayout::Builder('1') + })); assert_layout_is_not_parsed(l); } @@ -229,31 +212,28 @@ QUIZ_CASE(poincare_layout_to_expression_unparsable) { * | 1),1 | * \ / */ - constexpr int children1Count = 12; - Layout children1[children1Count] = { - CodePointLayout::Builder('1'), - CodePointLayout::Builder('+'), - CodePointLayout::Builder('b'), - CodePointLayout::Builder('i'), - CodePointLayout::Builder('n'), - CodePointLayout::Builder('o'), - CodePointLayout::Builder('m'), - CodePointLayout::Builder('i'), - CodePointLayout::Builder('a'), - CodePointLayout::Builder('l'), - LeftParenthesisLayout::Builder(), - CodePointLayout::Builder('3')}; - - constexpr int children2Count = 4; - Layout children2[children2Count] = { - CodePointLayout::Builder('1'), - RightParenthesisLayout::Builder(), - CodePointLayout::Builder(','), - CodePointLayout::Builder('1')}; - Layout l = BinomialCoefficientLayout::Builder( - HorizontalLayout::Builder(children1, children1Count), - HorizontalLayout::Builder(children2, children2Count)); + HorizontalLayout::Builder({ + CodePointLayout::Builder('1'), + CodePointLayout::Builder('+'), + CodePointLayout::Builder('b'), + CodePointLayout::Builder('i'), + CodePointLayout::Builder('n'), + CodePointLayout::Builder('o'), + CodePointLayout::Builder('m'), + CodePointLayout::Builder('i'), + CodePointLayout::Builder('a'), + CodePointLayout::Builder('l'), + LeftParenthesisLayout::Builder(), + CodePointLayout::Builder('3') + }), + HorizontalLayout::Builder({ + CodePointLayout::Builder('1'), + RightParenthesisLayout::Builder(), + CodePointLayout::Builder(','), + CodePointLayout::Builder('1') + }) + ); assert_layout_is_not_parsed(l); } } diff --git a/poincare/test/parsing.cpp b/poincare/test/parsing.cpp index 328d50661..8d01d0f2b 100644 --- a/poincare/test/parsing.cpp +++ b/poincare/test/parsing.cpp @@ -169,13 +169,11 @@ QUIZ_CASE(poincare_parsing_parse) { assert_parsed_expression_is("1+2", Addition::Builder(BasedInteger::Builder(1),BasedInteger::Builder(2))); assert_parsed_expression_is("(1)+2", Addition::Builder(Parenthesis::Builder(BasedInteger::Builder(1)),BasedInteger::Builder(2))); assert_parsed_expression_is("(1+2)", Parenthesis::Builder(Addition::Builder(BasedInteger::Builder(1),BasedInteger::Builder(2)))); - Expression nAryChildren[] = {BasedInteger::Builder(1),BasedInteger::Builder(2),BasedInteger::Builder(3)}; - assert_parsed_expression_is("1+2+3", Addition::Builder(nAryChildren, 3)); - nAryChildren[2] = Parenthesis::Builder(Addition::Builder(BasedInteger::Builder(3),BasedInteger::Builder(4))); - assert_parsed_expression_is("1+2+(3+4)", Addition::Builder(nAryChildren, 3)); + Expression::Tuple one_two_three = {BasedInteger::Builder(1),BasedInteger::Builder(2),BasedInteger::Builder(3)}; + assert_parsed_expression_is("1+2+3", Addition::Builder(one_two_three)); + assert_parsed_expression_is("1+2+(3+4)", Addition::Builder({BasedInteger::Builder(1), BasedInteger::Builder(2), Parenthesis::Builder(Addition::Builder(BasedInteger::Builder(3),BasedInteger::Builder(4)))})); assert_parsed_expression_is("1×2", Multiplication::Builder(BasedInteger::Builder(1),BasedInteger::Builder(2))); - nAryChildren[2] = BasedInteger::Builder(3); - assert_parsed_expression_is("1×2×3", Multiplication::Builder(nAryChildren, 3)); + assert_parsed_expression_is("1×2×3", Multiplication::Builder(one_two_three)); assert_parsed_expression_is("1+2×3", Addition::Builder(BasedInteger::Builder(1), Multiplication::Builder(BasedInteger::Builder(2), BasedInteger::Builder(3)))); assert_parsed_expression_is("1/2", Division::Builder(BasedInteger::Builder(1),BasedInteger::Builder(2))); assert_parsed_expression_is("(1/2)", Parenthesis::Builder(Division::Builder(BasedInteger::Builder(1),BasedInteger::Builder(2))));