diff --git a/poincare/include/poincare/absolute_value.h b/poincare/include/poincare/absolute_value.h index d0eec68d2..66d4b8d4c 100644 --- a/poincare/include/poincare/absolute_value.h +++ b/poincare/include/poincare/absolute_value.h @@ -50,8 +50,8 @@ friend class AbsoluteValueNode; public: AbsoluteValue(const AbsoluteValueNode * n) : Expression(n) {} static AbsoluteValue Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("abs", 1, &UntypedBuilder); + + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("abs", 1, &UntypedBuilderOneChild); Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); private: diff --git a/poincare/include/poincare/arc_cosine.h b/poincare/include/poincare/arc_cosine.h index e15d9a685..ee29beacb 100644 --- a/poincare/include/poincare/arc_cosine.h +++ b/poincare/include/poincare/arc_cosine.h @@ -42,8 +42,8 @@ class ArcCosine final : public Expression { public: ArcCosine(const ArcCosineNode * n) : Expression(n) {} static ArcCosine Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("acos", 1, &UntypedBuilder); + + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("acos", 1, &UntypedBuilderOneChild); Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); diff --git a/poincare/include/poincare/arc_sine.h b/poincare/include/poincare/arc_sine.h index 230e39475..7ae261b42 100644 --- a/poincare/include/poincare/arc_sine.h +++ b/poincare/include/poincare/arc_sine.h @@ -41,8 +41,8 @@ class ArcSine final : public Expression { public: ArcSine(const ArcSineNode * n) : Expression(n) {} static ArcSine Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("asin", 1, &UntypedBuilder); + + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("asin", 1, &UntypedBuilderOneChild); Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); }; diff --git a/poincare/include/poincare/arc_tangent.h b/poincare/include/poincare/arc_tangent.h index 5262fc692..a0d6218f4 100644 --- a/poincare/include/poincare/arc_tangent.h +++ b/poincare/include/poincare/arc_tangent.h @@ -45,8 +45,8 @@ class ArcTangent final : public Expression { public: ArcTangent(const ArcTangentNode * n) : Expression(n) {} static ArcTangent Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("atan", 1, &UntypedBuilder); + + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("atan", 1, &UntypedBuilderOneChild); Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); }; diff --git a/poincare/include/poincare/binomial_coefficient.h b/poincare/include/poincare/binomial_coefficient.h index f6102a879..3c3315fff 100644 --- a/poincare/include/poincare/binomial_coefficient.h +++ b/poincare/include/poincare/binomial_coefficient.h @@ -40,8 +40,7 @@ class BinomialCoefficient final : public Expression { public: BinomialCoefficient(const BinomialCoefficientNode * n) : Expression(n) {} static BinomialCoefficient Builder(Expression child0, Expression child1); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0), children.childAtIndex(1)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("binomial", 2, &UntypedBuilder); + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("binomial", 2, &UntypedBuilderTwoChildren); // Expression Expression shallowReduce(); diff --git a/poincare/include/poincare/ceiling.h b/poincare/include/poincare/ceiling.h index 0a202947c..f8b75112c 100644 --- a/poincare/include/poincare/ceiling.h +++ b/poincare/include/poincare/ceiling.h @@ -43,8 +43,8 @@ class Ceiling final : public Expression { public: Ceiling(const CeilingNode * n) : Expression(n) {} static Ceiling Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("ceil", 1, &UntypedBuilder); + + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("ceil", 1, &UntypedBuilderOneChild); Expression shallowReduce(); }; diff --git a/poincare/include/poincare/complex_argument.h b/poincare/include/poincare/complex_argument.h index 9ec2bec09..bdbcb3c72 100644 --- a/poincare/include/poincare/complex_argument.h +++ b/poincare/include/poincare/complex_argument.h @@ -42,8 +42,8 @@ class ComplexArgument final : public Expression { public: ComplexArgument(const ComplexArgumentNode * n) : Expression(n) {} static ComplexArgument Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("arg", 1, &UntypedBuilder); + + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("arg", 1, &UntypedBuilderOneChild); Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); }; diff --git a/poincare/include/poincare/confidence_interval.h b/poincare/include/poincare/confidence_interval.h index 88c82fc79..a030d0998 100644 --- a/poincare/include/poincare/confidence_interval.h +++ b/poincare/include/poincare/confidence_interval.h @@ -46,8 +46,7 @@ class ConfidenceInterval : public Expression { public: ConfidenceInterval(const ConfidenceIntervalNode * n) : Expression(n) {} static ConfidenceInterval Builder(Expression child0, Expression child1); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0), children.childAtIndex(1)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("confidence", 2, &UntypedBuilder); + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("confidence", 2, &UntypedBuilderTwoChildren); // Expression Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); @@ -59,8 +58,7 @@ class SimplePredictionInterval final : public ConfidenceInterval { public: SimplePredictionInterval(const SimplePredictionIntervalNode * n) : ConfidenceInterval(n) {} static SimplePredictionInterval Builder(Expression child0, Expression child1); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0), children.childAtIndex(1)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("prediction", 2, &UntypedBuilder); + 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 f6a0a1cb4..af45d709b 100644 --- a/poincare/include/poincare/conjugate.h +++ b/poincare/include/poincare/conjugate.h @@ -42,8 +42,8 @@ class Conjugate final : public Expression { public: Conjugate(const ConjugateNode * n) : Expression(n) {} static Conjugate Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("conj", 1, &UntypedBuilder);; + + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("conj", 1, &UntypedBuilderOneChild);; Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); }; diff --git a/poincare/include/poincare/cosine.h b/poincare/include/poincare/cosine.h index 3e0524a65..532abf06f 100644 --- a/poincare/include/poincare/cosine.h +++ b/poincare/include/poincare/cosine.h @@ -47,8 +47,8 @@ class Cosine final : public Expression { public: Cosine(const CosineNode * n) : Expression(n) {} static Cosine Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("cos", 1, &UntypedBuilder); + + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("cos", 1, &UntypedBuilderOneChild); Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); }; diff --git a/poincare/include/poincare/derivative.h b/poincare/include/poincare/derivative.h index 70dc0973a..e2bd29ad1 100644 --- a/poincare/include/poincare/derivative.h +++ b/poincare/include/poincare/derivative.h @@ -53,6 +53,7 @@ public: Derivative(const DerivativeNode * n) : Expression(n) {} static Derivative Builder(Expression child0, Symbol child1, Expression child2); static Expression UntypedBuilder(Expression children) { + assert(children.type() == ExpressionNode::Type::Matrix); if (children.childAtIndex(1).type() != ExpressionNode::Type::Symbol) { // Second parameter must be a Symbol. return Expression(); diff --git a/poincare/include/poincare/determinant.h b/poincare/include/poincare/determinant.h index ff350e1fd..d4a392d76 100644 --- a/poincare/include/poincare/determinant.h +++ b/poincare/include/poincare/determinant.h @@ -36,8 +36,8 @@ class Determinant final : public Expression { public: Determinant(const DeterminantNode * n) : Expression(n) {} static Determinant Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("det", 1, &UntypedBuilder); + + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("det", 1, &UntypedBuilderOneChild); Expression shallowReduce(Context & context); }; diff --git a/poincare/include/poincare/division_quotient.h b/poincare/include/poincare/division_quotient.h index d6f358a73..e74f8c8a3 100644 --- a/poincare/include/poincare/division_quotient.h +++ b/poincare/include/poincare/division_quotient.h @@ -39,8 +39,7 @@ class DivisionQuotient final : public Expression { public: DivisionQuotient(const DivisionQuotientNode * n) : Expression(n) {} static DivisionQuotient Builder(Expression child0, Expression child1); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0), children.childAtIndex(1)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("quo", 2, &UntypedBuilder); + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("quo", 2, &UntypedBuilderTwoChildren); // Expression Expression shallowReduce(); diff --git a/poincare/include/poincare/division_remainder.h b/poincare/include/poincare/division_remainder.h index b7a3e1273..9a4033005 100644 --- a/poincare/include/poincare/division_remainder.h +++ b/poincare/include/poincare/division_remainder.h @@ -40,8 +40,7 @@ class DivisionRemainder final : public Expression { public: DivisionRemainder(const DivisionRemainderNode * n) : Expression(n) {} static DivisionRemainder Builder(Expression child0, Expression child1); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0), children.childAtIndex(1)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("rem", 2, &UntypedBuilder); + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("rem", 2, &UntypedBuilderTwoChildren); // Expression Expression shallowReduce(); diff --git a/poincare/include/poincare/expression.h b/poincare/include/poincare/expression.h index 72c860f7a..f87d66aa1 100644 --- a/poincare/include/poincare/expression.h +++ b/poincare/include/poincare/expression.h @@ -248,6 +248,17 @@ public: protected: static bool SimplificationHasBeenInterrupted(); Expression(const ExpressionNode * n) : TreeHandle(n) {} + template + static Expression UntypedBuilderOneChild(Expression children) { + assert(children.type() == ExpressionNode::Type::Matrix); + return U::Builder(children.childAtIndex(0)); + } + template + static Expression UntypedBuilderTwoChildren(Expression children) { + assert(children.type() == ExpressionNode::Type::Matrix); + return U::Builder(children.childAtIndex(0), children.childAtIndex(1)); + } + template T convert() const { /* This function allows to convert Expression to derived Expressions. diff --git a/poincare/include/poincare/factor.h b/poincare/include/poincare/factor.h index 09ebcbf6a..84d300a5d 100644 --- a/poincare/include/poincare/factor.h +++ b/poincare/include/poincare/factor.h @@ -38,8 +38,8 @@ class Factor final : public Expression { public: Factor(const FactorNode * n) : Expression(n) {} static Factor Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("factor", 1, &UntypedBuilder); + + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("factor", 1, &UntypedBuilderOneChild); Expression shallowBeautify(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit); Multiplication createMultiplicationOfIntegerPrimeDecomposition(Integer i, Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const; diff --git a/poincare/include/poincare/floor.h b/poincare/include/poincare/floor.h index 507ecb541..c1c7736ee 100644 --- a/poincare/include/poincare/floor.h +++ b/poincare/include/poincare/floor.h @@ -45,8 +45,8 @@ class Floor final : public Expression { public: Floor(const FloorNode * n) : Expression(n) {} static Floor Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("floor", 1, &UntypedBuilder); + + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("floor", 1, &UntypedBuilderOneChild); Expression shallowReduce(); }; diff --git a/poincare/include/poincare/frac_part.h b/poincare/include/poincare/frac_part.h index f6551e063..3858deeec 100644 --- a/poincare/include/poincare/frac_part.h +++ b/poincare/include/poincare/frac_part.h @@ -45,8 +45,8 @@ class FracPart final : public Expression { public: FracPart(const FracPartNode * n) : Expression(n) {} static FracPart Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("frac", 1, &UntypedBuilder); + + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("frac", 1, &UntypedBuilderOneChild); Expression shallowReduce(); }; diff --git a/poincare/include/poincare/great_common_divisor.h b/poincare/include/poincare/great_common_divisor.h index 019867025..318b78d93 100644 --- a/poincare/include/poincare/great_common_divisor.h +++ b/poincare/include/poincare/great_common_divisor.h @@ -38,8 +38,7 @@ class GreatCommonDivisor final : public Expression { public: GreatCommonDivisor(const GreatCommonDivisorNode * n) : Expression(n) {} static GreatCommonDivisor Builder(Expression child0, Expression child1); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0), children.childAtIndex(1)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("gcd", 2, &UntypedBuilder); + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("gcd", 2, &UntypedBuilderTwoChildren); // Expression Expression shallowReduce(); diff --git a/poincare/include/poincare/hyperbolic_arc_cosine.h b/poincare/include/poincare/hyperbolic_arc_cosine.h index 8f8a8272f..3ebeccbd8 100644 --- a/poincare/include/poincare/hyperbolic_arc_cosine.h +++ b/poincare/include/poincare/hyperbolic_arc_cosine.h @@ -37,8 +37,8 @@ class HyperbolicArcCosine final : public HyperbolicTrigonometricFunction { public: HyperbolicArcCosine(const HyperbolicArcCosineNode * n) : HyperbolicTrigonometricFunction(n) {} static HyperbolicArcCosine Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("acosh", 1, &UntypedBuilder); + + 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 0569275c2..464235abe 100644 --- a/poincare/include/poincare/hyperbolic_arc_sine.h +++ b/poincare/include/poincare/hyperbolic_arc_sine.h @@ -37,8 +37,8 @@ class HyperbolicArcSine final : public HyperbolicTrigonometricFunction { public: HyperbolicArcSine(const HyperbolicArcSineNode * n) : HyperbolicTrigonometricFunction(n) {} static HyperbolicArcSine Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("asinh", 1, &UntypedBuilder); + + 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 565fcb42f..16b08b342 100644 --- a/poincare/include/poincare/hyperbolic_arc_tangent.h +++ b/poincare/include/poincare/hyperbolic_arc_tangent.h @@ -37,8 +37,8 @@ class HyperbolicArcTangent final : public HyperbolicTrigonometricFunction { public: HyperbolicArcTangent(const HyperbolicArcTangentNode * n) : HyperbolicTrigonometricFunction(n) {} static HyperbolicArcTangent Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("atanh", 1, &UntypedBuilder); + + 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 cbe78f7ba..2704a87a0 100644 --- a/poincare/include/poincare/hyperbolic_cosine.h +++ b/poincare/include/poincare/hyperbolic_cosine.h @@ -37,8 +37,8 @@ class HyperbolicCosine final : public HyperbolicTrigonometricFunction { public: HyperbolicCosine(const HyperbolicCosineNode * n) : HyperbolicTrigonometricFunction(n) {} static HyperbolicCosine Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("cosh", 1, &UntypedBuilder); + + 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 53cf3eb85..8aeadd16e 100644 --- a/poincare/include/poincare/hyperbolic_sine.h +++ b/poincare/include/poincare/hyperbolic_sine.h @@ -37,8 +37,8 @@ class HyperbolicSine final : public HyperbolicTrigonometricFunction { public: HyperbolicSine(const HyperbolicSineNode * n) : HyperbolicTrigonometricFunction(n) {} static HyperbolicSine Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("sinh", 1, &UntypedBuilder); + + 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 cc43e572b..321f5581e 100644 --- a/poincare/include/poincare/hyperbolic_tangent.h +++ b/poincare/include/poincare/hyperbolic_tangent.h @@ -37,8 +37,8 @@ class HyperbolicTangent final : public HyperbolicTrigonometricFunction { public: HyperbolicTangent(const HyperbolicTangentNode * n) : HyperbolicTrigonometricFunction(n) {} static HyperbolicTangent Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("tanh", 1, &UntypedBuilder); + + 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 3fda87d4e..882d9ebfa 100644 --- a/poincare/include/poincare/imaginary_part.h +++ b/poincare/include/poincare/imaginary_part.h @@ -46,8 +46,8 @@ class ImaginaryPart final : public Expression { public: ImaginaryPart(const ImaginaryPartNode * n) : Expression(n) {} static ImaginaryPart Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("im", 1, &UntypedBuilder); + + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("im", 1, &UntypedBuilderOneChild); Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); }; diff --git a/poincare/include/poincare/integral.h b/poincare/include/poincare/integral.h index 403a41b13..1ebefe772 100644 --- a/poincare/include/poincare/integral.h +++ b/poincare/include/poincare/integral.h @@ -57,6 +57,7 @@ public: Integral(const IntegralNode * n) : Expression(n) {} static Integral Builder(Expression child0, Symbol child1, Expression child2, Expression child3); static Expression UntypedBuilder(Expression children) { + assert(children.type() == ExpressionNode::Type::Matrix); if (children.childAtIndex(1).type() != ExpressionNode::Type::Symbol) { // Second parameter must be a Symbol. return Expression(); diff --git a/poincare/include/poincare/least_common_multiple.h b/poincare/include/poincare/least_common_multiple.h index 4f2fcbe4f..0155895b5 100644 --- a/poincare/include/poincare/least_common_multiple.h +++ b/poincare/include/poincare/least_common_multiple.h @@ -38,8 +38,7 @@ class LeastCommonMultiple final : public Expression { public: LeastCommonMultiple(const LeastCommonMultipleNode * n) : Expression(n) {} static LeastCommonMultiple Builder(Expression child0, Expression child1); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0), children.childAtIndex(1)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("lcm", 2, &UntypedBuilder); + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("lcm", 2, &UntypedBuilderTwoChildren); // Expression Expression shallowReduce(); diff --git a/poincare/include/poincare/logarithm.h b/poincare/include/poincare/logarithm.h index c7c5e5902..eede67cea 100644 --- a/poincare/include/poincare/logarithm.h +++ b/poincare/include/poincare/logarithm.h @@ -45,8 +45,7 @@ class Logarithm final : public Expression { public: Logarithm(const LogarithmNode<2> * n) : Expression(n) {} static Logarithm Builder(Expression child0, Expression child1); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0), children.childAtIndex(1)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("log", 2, &UntypedBuilder); + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("log", 2, &UntypedBuilderTwoChildren); Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); Expression shallowBeautify(); @@ -62,8 +61,8 @@ class CommonLogarithm : public Expression { public: CommonLogarithm(const LogarithmNode<1> * n) : Expression(n) {} static CommonLogarithm Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("log", 1, &UntypedBuilder); + + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("log", 1, &UntypedBuilderOneChild); Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); }; diff --git a/poincare/include/poincare/matrix_dimension.h b/poincare/include/poincare/matrix_dimension.h index 5fc51803f..99dab0e30 100644 --- a/poincare/include/poincare/matrix_dimension.h +++ b/poincare/include/poincare/matrix_dimension.h @@ -36,8 +36,8 @@ class MatrixDimension final : public Expression { public: MatrixDimension(const MatrixDimensionNode * n) : Expression(n) {} static MatrixDimension Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("dim", 1, &UntypedBuilder); + + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("dim", 1, &UntypedBuilderOneChild); Expression shallowReduce(); }; diff --git a/poincare/include/poincare/matrix_inverse.h b/poincare/include/poincare/matrix_inverse.h index b03976fb4..ea3ca6ce2 100644 --- a/poincare/include/poincare/matrix_inverse.h +++ b/poincare/include/poincare/matrix_inverse.h @@ -35,8 +35,8 @@ class MatrixInverse final : public Expression { public: MatrixInverse(const MatrixInverseNode * n) : Expression(n) {} static MatrixInverse Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("inverse", 1, &UntypedBuilder); + + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("inverse", 1, &UntypedBuilderOneChild); Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); }; diff --git a/poincare/include/poincare/matrix_trace.h b/poincare/include/poincare/matrix_trace.h index ac281b937..9f729a09c 100644 --- a/poincare/include/poincare/matrix_trace.h +++ b/poincare/include/poincare/matrix_trace.h @@ -35,8 +35,8 @@ class MatrixTrace final : public Expression { public: MatrixTrace(const MatrixTraceNode * n) : Expression(n) {} static MatrixTrace Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("trace", 1, &UntypedBuilder); + + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("trace", 1, &UntypedBuilderOneChild); Expression shallowReduce(); }; diff --git a/poincare/include/poincare/matrix_transpose.h b/poincare/include/poincare/matrix_transpose.h index bf6c1d7ec..9f5951d9d 100644 --- a/poincare/include/poincare/matrix_transpose.h +++ b/poincare/include/poincare/matrix_transpose.h @@ -35,8 +35,8 @@ class MatrixTranspose final : public Expression { public: MatrixTranspose(const MatrixTransposeNode * n) : Expression(n) {} static MatrixTranspose Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("transpose", 1, &UntypedBuilder); + + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("transpose", 1, &UntypedBuilderOneChild); Expression shallowReduce(); }; diff --git a/poincare/include/poincare/naperian_logarithm.h b/poincare/include/poincare/naperian_logarithm.h index c880afe5a..712b85f27 100644 --- a/poincare/include/poincare/naperian_logarithm.h +++ b/poincare/include/poincare/naperian_logarithm.h @@ -45,8 +45,8 @@ class NaperianLogarithm final : public Expression { public: NaperianLogarithm(const NaperianLogarithmNode * n) : Expression(n) {} static NaperianLogarithm Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("ln", 1, &UntypedBuilder); + + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("ln", 1, &UntypedBuilderOneChild); Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); }; diff --git a/poincare/include/poincare/nth_root.h b/poincare/include/poincare/nth_root.h index 9612cf8a2..f0d637622 100644 --- a/poincare/include/poincare/nth_root.h +++ b/poincare/include/poincare/nth_root.h @@ -36,8 +36,7 @@ class NthRoot final : public Expression { public: NthRoot(const NthRootNode * n) : Expression(n) {} static NthRoot Builder(Expression child0, Expression child1); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0), children.childAtIndex(1)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("root", 2, &UntypedBuilder); + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("root", 2, &UntypedBuilderTwoChildren); Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); }; diff --git a/poincare/include/poincare/permute_coefficient.h b/poincare/include/poincare/permute_coefficient.h index 45cd8f8ee..8ec9da24a 100644 --- a/poincare/include/poincare/permute_coefficient.h +++ b/poincare/include/poincare/permute_coefficient.h @@ -42,8 +42,7 @@ class PermuteCoefficient final : public Expression { public: PermuteCoefficient(const PermuteCoefficientNode * n) : Expression(n) {} static PermuteCoefficient Builder(Expression child0, Expression child1); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0), children.childAtIndex(1)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("permute", 2, &UntypedBuilder); + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("permute", 2, &UntypedBuilderTwoChildren); // Expression Expression shallowReduce(); diff --git a/poincare/include/poincare/prediction_interval.h b/poincare/include/poincare/prediction_interval.h index f21dc03e8..69da94c98 100644 --- a/poincare/include/poincare/prediction_interval.h +++ b/poincare/include/poincare/prediction_interval.h @@ -38,8 +38,7 @@ class PredictionInterval final : public Expression { public: PredictionInterval(const PredictionIntervalNode * n) : Expression(n) {} static PredictionInterval Builder(Expression child0, Expression child1); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0), children.childAtIndex(1)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("prediction95", 2, &UntypedBuilder); + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("prediction95", 2, &UntypedBuilderTwoChildren); // Expression Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); diff --git a/poincare/include/poincare/product.h b/poincare/include/poincare/product.h index e57525551..9a37e7868 100644 --- a/poincare/include/poincare/product.h +++ b/poincare/include/poincare/product.h @@ -37,6 +37,7 @@ public: Product(const ProductNode * n) : Expression(n) {} static Product Builder(Expression child0, Symbol child1, Expression child2, Expression child3); static Expression UntypedBuilder(Expression children) { + assert(children.type() == ExpressionNode::Type::Matrix); if (children.childAtIndex(1).type() != ExpressionNode::Type::Symbol) { // Second parameter must be a Symbol. return Expression(); diff --git a/poincare/include/poincare/randint.h b/poincare/include/poincare/randint.h index 469dc209a..292dc33cd 100644 --- a/poincare/include/poincare/randint.h +++ b/poincare/include/poincare/randint.h @@ -42,8 +42,7 @@ friend class RandintNode; public: Randint(const RandintNode * n) : Expression(n) {} static Randint Builder(Expression child0, Expression child1); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0), children.childAtIndex(1)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("randint", 2, &UntypedBuilder); + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("randint", 2, &UntypedBuilderTwoChildren); }; } diff --git a/poincare/include/poincare/random.h b/poincare/include/poincare/random.h index 8b74c5b56..0446a25f9 100644 --- a/poincare/include/poincare/random.h +++ b/poincare/include/poincare/random.h @@ -44,7 +44,7 @@ friend class RandomNode; public: Random(const RandomNode * n) : Expression(n) {} static Random Builder(); - static Expression UntypedBuilder(Expression children) { return Builder(); } + static Expression UntypedBuilder(Expression children) { assert(children.type() == ExpressionNode::Type::Matrix); return Builder(); } static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("random", 0, &UntypedBuilder); template static T random(); diff --git a/poincare/include/poincare/real_part.h b/poincare/include/poincare/real_part.h index ad7fba108..79b9cfd38 100644 --- a/poincare/include/poincare/real_part.h +++ b/poincare/include/poincare/real_part.h @@ -46,8 +46,8 @@ class RealPart final : public Expression { public: RealPart(const RealPartNode * n) : Expression(n) {} static RealPart Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("re", 1, &UntypedBuilder); + + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("re", 1, &UntypedBuilderOneChild); Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); }; diff --git a/poincare/include/poincare/round.h b/poincare/include/poincare/round.h index d397217cc..2fc0075b6 100644 --- a/poincare/include/poincare/round.h +++ b/poincare/include/poincare/round.h @@ -39,8 +39,7 @@ class Round final : public Expression { public: Round(const RoundNode * n) : Expression(n) {} static Round Builder(Expression child0, Expression child1); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0), children.childAtIndex(1)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("round", 2, &UntypedBuilder); + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("round", 2, &UntypedBuilderTwoChildren); Expression shallowReduce(); }; diff --git a/poincare/include/poincare/sign_function.h b/poincare/include/poincare/sign_function.h index 3205d8d7b..2a4889e45 100644 --- a/poincare/include/poincare/sign_function.h +++ b/poincare/include/poincare/sign_function.h @@ -46,8 +46,8 @@ class SignFunction final : public Expression { public: SignFunction(const SignFunctionNode * n) : Expression(n) {} static SignFunction Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("sign", 1, &UntypedBuilder); + + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("sign", 1, &UntypedBuilderOneChild); Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); }; diff --git a/poincare/include/poincare/sine.h b/poincare/include/poincare/sine.h index f53614b9e..75d65d604 100644 --- a/poincare/include/poincare/sine.h +++ b/poincare/include/poincare/sine.h @@ -49,8 +49,8 @@ class Sine final : public Expression { public: Sine(const SineNode * n) : Expression(n) {} static Sine Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("sin", 1, &UntypedBuilder); + + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("sin", 1, &UntypedBuilderOneChild); Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); }; diff --git a/poincare/include/poincare/square_root.h b/poincare/include/poincare/square_root.h index a47c17adb..bf9629e62 100644 --- a/poincare/include/poincare/square_root.h +++ b/poincare/include/poincare/square_root.h @@ -42,9 +42,9 @@ class SquareRoot final : public Expression { public: SquareRoot(const SquareRootNode * n) : Expression(n) {} static SquareRoot Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } + static_assert('\x91' == Ion::Charset::Root, "Charset error"); - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("\x91", 1, &UntypedBuilder); + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("\x91", 1, &UntypedBuilderOneChild); Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); private: diff --git a/poincare/include/poincare/sum.h b/poincare/include/poincare/sum.h index 0d9cc6da2..503591c84 100644 --- a/poincare/include/poincare/sum.h +++ b/poincare/include/poincare/sum.h @@ -37,6 +37,7 @@ public: Sum(const SumNode * n) : Expression(n) {} static Sum Builder(Expression child0, Symbol child1, Expression child2, Expression child3); static Expression UntypedBuilder(Expression children) { + assert(children.type() == ExpressionNode::Type::Matrix); if (children.childAtIndex(1).type() != ExpressionNode::Type::Symbol) { // Second parameter must be a Symbol. return Expression(); diff --git a/poincare/include/poincare/tangent.h b/poincare/include/poincare/tangent.h index b37a99d35..ea04dd640 100644 --- a/poincare/include/poincare/tangent.h +++ b/poincare/include/poincare/tangent.h @@ -47,8 +47,8 @@ class Tangent final : public Expression { public: Tangent(const TangentNode * n) : Expression(n) {} static Tangent Builder(Expression child); - static Expression UntypedBuilder(Expression children) { return Builder(children.childAtIndex(0)); } - static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("tan", 1, &UntypedBuilder); + + static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("tan", 1, &UntypedBuilderOneChild); Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); };