diff --git a/apps/regression/calculation_controller.cpp b/apps/regression/calculation_controller.cpp index 39f0458d9..3b21ba53f 100644 --- a/apps/regression/calculation_controller.cpp +++ b/apps/regression/calculation_controller.cpp @@ -25,7 +25,7 @@ CalculationController::CalculationController(Responder * parentResponder, Button m_hideableCell(), m_store(store) { - m_r2Layout = HorizontalLayout(CharLayout('r', KDFont::SmallFont), VerticalOffsetLayout(CharLayout('2', KDFont::SmallFont), VerticalOffsetLayoutNode::Type::Superscript)); + m_r2Layout = HorizontalLayout::Builder(CharLayout('r', KDFont::SmallFont), VerticalOffsetLayout::Builder(CharLayout('2', KDFont::SmallFont), VerticalOffsetLayoutNode::Type::Superscript)); m_selectableTableView.setVerticalCellOverlap(0); m_selectableTableView.setBackgroundColor(Palette::WallScreenDark); m_selectableTableView.setMargins(k_margin, k_scrollBarMargin, k_scrollBarMargin, k_margin); diff --git a/apps/regression/model/cubic_model.cpp b/apps/regression/model/cubic_model.cpp index bac69876d..1452ccf53 100644 --- a/apps/regression/model/cubic_model.cpp +++ b/apps/regression/model/cubic_model.cpp @@ -23,7 +23,7 @@ Layout CubicModel::layout() { CharLayout('a', KDFont::SmallFont), CharLayout(Ion::Charset::MiddleDot, KDFont::SmallFont), CharLayout('X', KDFont::SmallFont), - VerticalOffsetLayout( + VerticalOffsetLayout::Builder( CharLayout('3', KDFont::SmallFont), VerticalOffsetLayoutNode::Type::Superscript ), @@ -31,7 +31,7 @@ Layout CubicModel::layout() { CharLayout('b', KDFont::SmallFont), CharLayout(Ion::Charset::MiddleDot, KDFont::SmallFont), CharLayout('X', KDFont::SmallFont), - VerticalOffsetLayout( + VerticalOffsetLayout::Builder( CharLayout('2', KDFont::SmallFont), VerticalOffsetLayoutNode::Type::Superscript ), @@ -42,7 +42,7 @@ Layout CubicModel::layout() { CharLayout('+', KDFont::SmallFont), CharLayout('d', KDFont::SmallFont), }; - m_layout = HorizontalLayout(layoutChildren, 15); + m_layout = HorizontalLayout::Builder(layoutChildren, 15); } return m_layout; } @@ -53,23 +53,23 @@ Expression CubicModel::simplifiedExpression(double * modelCoefficients, Poincare double c = modelCoefficients[2]; double d = modelCoefficients[3]; Expression addChildren[] = { - Multiplication( + Multiplication::Builder( Number::DecimalNumber(a), - Power( + Power::Builder( Symbol('x'), Decimal(3.0))), - Multiplication( + Multiplication::Builder( Number::DecimalNumber(b), - Power( + Power::Builder( Symbol('x'), Decimal(2.0))), - Multiplication( + Multiplication::Builder( Number::DecimalNumber(c), Symbol('x')), Number::DecimalNumber(d) }; // a*x^3+b*x^2+c*x+d - Expression result = Addition(addChildren, 4); + Expression result = Addition::Builder(addChildren, 4); PoincareHelpers::Simplify(&result, *context); return result; } diff --git a/apps/regression/model/exponential_model.cpp b/apps/regression/model/exponential_model.cpp index fb7522802..e7097bcf8 100644 --- a/apps/regression/model/exponential_model.cpp +++ b/apps/regression/model/exponential_model.cpp @@ -15,8 +15,8 @@ Layout ExponentialModel::layout() { CharLayout('a', KDFont::SmallFont), CharLayout(Ion::Charset::MiddleDot, KDFont::SmallFont), CharLayout('e', KDFont::SmallFont), - VerticalOffsetLayout( - HorizontalLayout( + VerticalOffsetLayout::Builder( + HorizontalLayout::Builder( CharLayout('b', KDFont::SmallFont), CharLayout(Ion::Charset::MiddleDot, KDFont::SmallFont), CharLayout('X', KDFont::SmallFont) @@ -24,7 +24,7 @@ Layout ExponentialModel::layout() { VerticalOffsetLayoutNode::Type::Superscript ) }; - m_layout = HorizontalLayout(layoutChildren, 4); + m_layout = HorizontalLayout::Builder(layoutChildren, 4); } return m_layout; } diff --git a/apps/regression/model/linear_model.cpp b/apps/regression/model/linear_model.cpp index 42fb203ec..11992808c 100644 --- a/apps/regression/model/linear_model.cpp +++ b/apps/regression/model/linear_model.cpp @@ -18,7 +18,7 @@ Layout LinearModel::layout() { CharLayout('+', KDFont::SmallFont), CharLayout('b', KDFont::SmallFont), }; - m_layout = HorizontalLayout(layoutChildren, 5); + m_layout = HorizontalLayout::Builder(layoutChildren, 5); } return m_layout; } diff --git a/apps/regression/model/logarithmic_model.cpp b/apps/regression/model/logarithmic_model.cpp index fa1930d4a..546f434ea 100644 --- a/apps/regression/model/logarithmic_model.cpp +++ b/apps/regression/model/logarithmic_model.cpp @@ -22,7 +22,7 @@ Layout LogarithmicModel::layout() { CharLayout('+', KDFont::SmallFont), CharLayout('b', KDFont::SmallFont) }; - m_layout = HorizontalLayout(layoutChildren, 9); + m_layout = HorizontalLayout::Builder(layoutChildren, 9); } return m_layout; } diff --git a/apps/regression/model/logistic_model.cpp b/apps/regression/model/logistic_model.cpp index b7649dcc8..79b8d3bdc 100644 --- a/apps/regression/model/logistic_model.cpp +++ b/apps/regression/model/logistic_model.cpp @@ -24,14 +24,14 @@ Layout LogisticModel::layout() { CharLayout('a', KDFont::SmallFont), CharLayout(Ion::Charset::MiddleDot, KDFont::SmallFont), CharLayout('e', KDFont::SmallFont), - VerticalOffsetLayout( - HorizontalLayout(exponentLayoutChildren, 4), + VerticalOffsetLayout::Builder( + HorizontalLayout::Builder(exponentLayoutChildren, 4), VerticalOffsetLayoutNode::Type::Superscript ) }; - m_layout = FractionLayout( + m_layout = FractionLayout::Builder( CharLayout('c', KDFont::SmallFont), - HorizontalLayout(layoutChildren, 6) + HorizontalLayout::Builder(layoutChildren, 6) ); } return m_layout; diff --git a/apps/regression/model/power_model.cpp b/apps/regression/model/power_model.cpp index 51ebdd6c2..9825d0afa 100644 --- a/apps/regression/model/power_model.cpp +++ b/apps/regression/model/power_model.cpp @@ -16,12 +16,12 @@ Layout PowerModel::layout() { CharLayout('a', KDFont::SmallFont), CharLayout(Ion::Charset::MiddleDot, KDFont::SmallFont), CharLayout('X', KDFont::SmallFont), - VerticalOffsetLayout( + VerticalOffsetLayout::Builder( CharLayout('b', KDFont::SmallFont), VerticalOffsetLayoutNode::Type::Superscript ), }; - m_layout = HorizontalLayout(layoutChildren, 4); + m_layout = HorizontalLayout::Builder(layoutChildren, 4); } return m_layout; } diff --git a/apps/regression/model/quadratic_model.cpp b/apps/regression/model/quadratic_model.cpp index c1a3ca6ee..698680ba6 100644 --- a/apps/regression/model/quadratic_model.cpp +++ b/apps/regression/model/quadratic_model.cpp @@ -23,7 +23,7 @@ Layout QuadraticModel::layout() { CharLayout('a', KDFont::SmallFont), CharLayout(Ion::Charset::MiddleDot, KDFont::SmallFont), CharLayout('X', KDFont::SmallFont), - VerticalOffsetLayout( + VerticalOffsetLayout::Builder( CharLayout('2', KDFont::SmallFont), VerticalOffsetLayoutNode::Type::Superscript ), @@ -34,7 +34,7 @@ Layout QuadraticModel::layout() { CharLayout('+', KDFont::SmallFont), CharLayout('c', KDFont::SmallFont), }; - m_layout = HorizontalLayout(layoutChildren, 10); + m_layout = HorizontalLayout::Builder(layoutChildren, 10); } return m_layout; } @@ -45,17 +45,17 @@ Expression QuadraticModel::simplifiedExpression(double * modelCoefficients, Poin double c = modelCoefficients[2]; // a*x^2+b*x+c Expression addChildren[] = { - Multiplication( + Multiplication::Builder( Number::DecimalNumber(a), - Power( + Power::Builder( Symbol('x'), Decimal(2.0))), - Multiplication( + Multiplication::Builder( Number::DecimalNumber(b), Symbol('x')), Number::DecimalNumber(c) }; - Expression result = Addition(addChildren, 3); + Expression result = Addition::Builder(addChildren, 3); PoincareHelpers::Simplify(&result, *context); return result; } diff --git a/apps/regression/model/quartic_model.cpp b/apps/regression/model/quartic_model.cpp index d2e012a39..3c7382fa8 100644 --- a/apps/regression/model/quartic_model.cpp +++ b/apps/regression/model/quartic_model.cpp @@ -23,7 +23,7 @@ Layout QuarticModel::layout() { CharLayout('a', KDFont::SmallFont), CharLayout(Ion::Charset::MiddleDot, KDFont::SmallFont), CharLayout('X', KDFont::SmallFont), - VerticalOffsetLayout( + VerticalOffsetLayout::Builder( CharLayout('4', KDFont::SmallFont), VerticalOffsetLayoutNode::Type::Superscript ), @@ -31,7 +31,7 @@ Layout QuarticModel::layout() { CharLayout('b', KDFont::SmallFont), CharLayout(Ion::Charset::MiddleDot, KDFont::SmallFont), CharLayout('X', KDFont::SmallFont), - VerticalOffsetLayout( + VerticalOffsetLayout::Builder( CharLayout('3', KDFont::SmallFont), VerticalOffsetLayoutNode::Type::Superscript ), @@ -39,7 +39,7 @@ Layout QuarticModel::layout() { CharLayout('c', KDFont::SmallFont), CharLayout(Ion::Charset::MiddleDot, KDFont::SmallFont), CharLayout('X', KDFont::SmallFont), - VerticalOffsetLayout( + VerticalOffsetLayout::Builder( CharLayout('2', KDFont::SmallFont), VerticalOffsetLayoutNode::Type::Superscript ), @@ -50,7 +50,7 @@ Layout QuarticModel::layout() { CharLayout('+', KDFont::SmallFont), CharLayout('e', KDFont::SmallFont), }; - m_layout = HorizontalLayout(layoutChildren, 20); + m_layout = HorizontalLayout::Builder(layoutChildren, 20); } return m_layout; } @@ -63,31 +63,31 @@ Expression QuarticModel::simplifiedExpression(double * modelCoefficients, Poinca double e = modelCoefficients[4]; Expression addChildren[] = { // a*x^4 - Multiplication( + Multiplication::Builder( Number::DecimalNumber(a), - Power( + Power::Builder( Symbol('x'), Decimal(4.0))), // b*x^3 - Multiplication( + Multiplication::Builder( Number::DecimalNumber(b), - Power( + Power::Builder( Symbol('x'), Decimal(3.0))), // c*x^2 - Multiplication( + Multiplication::Builder( Number::DecimalNumber(c), - Power( + Power::Builder( Symbol('x'), Decimal(2.0))), // d*x - Multiplication( + Multiplication::Builder( Number::DecimalNumber(d), Symbol('x')), // e Number::DecimalNumber(e) }; - Expression result = Addition(addChildren, 5); + Expression result = Addition::Builder(addChildren, 5); PoincareHelpers::Simplify(&result, *context); return result; } diff --git a/apps/regression/model/trigonometric_model.cpp b/apps/regression/model/trigonometric_model.cpp index f7e5380ef..f1151036a 100644 --- a/apps/regression/model/trigonometric_model.cpp +++ b/apps/regression/model/trigonometric_model.cpp @@ -36,7 +36,7 @@ Layout TrigonometricModel::layout() { CharLayout('+', KDFont::SmallFont), CharLayout('d', KDFont::SmallFont) }; - m_layout = HorizontalLayout(layoutChildren, 14); + m_layout = HorizontalLayout::Builder(layoutChildren, 14); } return m_layout; } @@ -48,12 +48,12 @@ Expression TrigonometricModel::simplifiedExpression(double * modelCoefficients, double d = modelCoefficients[3]; // a*sin(bx+c)+d Expression result = - Addition( - Multiplication( + Addition::Builder( + Multiplication::Builder( Number::DecimalNumber(a), Sine::Builder( - Addition( - Multiplication( + Addition::Builder( + Multiplication::Builder( Number::DecimalNumber(b), Symbol('x')), Number::DecimalNumber(c)))), diff --git a/apps/sequence/graph/term_sum_controller.cpp b/apps/sequence/graph/term_sum_controller.cpp index 8a006eb24..033a0ce65 100644 --- a/apps/sequence/graph/term_sum_controller.cpp +++ b/apps/sequence/graph/term_sum_controller.cpp @@ -50,9 +50,9 @@ double TermSumController::cursorNextStep(double x, int direction) { } Layout TermSumController::createFunctionLayout(const char * functionName) { - return HorizontalLayout( + return HorizontalLayout::Builder( CharLayout(functionName[0], KDFont::SmallFont), - VerticalOffsetLayout( + VerticalOffsetLayout::Builder( CharLayout('n', KDFont::SmallFont), VerticalOffsetLayoutNode::Type::Subscript ) diff --git a/apps/sequence/list/sequence_toolbox.cpp b/apps/sequence/list/sequence_toolbox.cpp index e5797e160..ab0468c5c 100644 --- a/apps/sequence/list/sequence_toolbox.cpp +++ b/apps/sequence/list/sequence_toolbox.cpp @@ -76,20 +76,20 @@ void SequenceToolbox::buildExtraCellsLayouts(const char * sequenceName, int recu const char * otherSequenceName = SequenceStore::k_sequenceNames[1-sequenceIndex]; for (int j = 0; j < recurrenceDepth; j++) { const char * indice = j == 0 ? "n" : "n+1"; - m_addedCellLayout[j] = HorizontalLayout( + m_addedCellLayout[j] = HorizontalLayout::Builder( CharLayout(sequenceName[0], KDFont::LargeFont), - VerticalOffsetLayout(LayoutHelper::String(indice, strlen(indice), KDFont::LargeFont), VerticalOffsetLayoutNode::Type::Subscript) + VerticalOffsetLayout::Builder(LayoutHelper::String(indice, strlen(indice), KDFont::LargeFont), VerticalOffsetLayoutNode::Type::Subscript) ); - m_addedCellLayout[j+recurrenceDepth] = HorizontalLayout( + m_addedCellLayout[j+recurrenceDepth] = HorizontalLayout::Builder( CharLayout(otherSequenceName[0], KDFont::LargeFont), - VerticalOffsetLayout(LayoutHelper::String(indice, strlen(indice), KDFont::LargeFont), VerticalOffsetLayoutNode::Type::Subscript) + VerticalOffsetLayout::Builder(LayoutHelper::String(indice, strlen(indice), KDFont::LargeFont), VerticalOffsetLayoutNode::Type::Subscript) ); } if (recurrenceDepth < 2) { const char * indice = recurrenceDepth == 0 ? "n" : (recurrenceDepth == 1 ? "n+1" : "n+2"); - m_addedCellLayout[2*recurrenceDepth] = HorizontalLayout( + m_addedCellLayout[2*recurrenceDepth] = HorizontalLayout::Builder( CharLayout(otherSequenceName[0], KDFont::LargeFont), - VerticalOffsetLayout(LayoutHelper::String(indice, strlen(indice), KDFont::LargeFont), VerticalOffsetLayoutNode::Type::Subscript) + VerticalOffsetLayout::Builder(LayoutHelper::String(indice, strlen(indice), KDFont::LargeFont), VerticalOffsetLayoutNode::Type::Subscript) ); } } diff --git a/apps/sequence/list/type_parameter_controller.cpp b/apps/sequence/list/type_parameter_controller.cpp index 5ddcfd003..80ae5ec85 100644 --- a/apps/sequence/list/type_parameter_controller.cpp +++ b/apps/sequence/list/type_parameter_controller.cpp @@ -115,9 +115,9 @@ void TypeParameterController::willDisplayCellAtLocation(HighlightCell * cell, in font = KDFont::SmallFont; } const char * subscripts[3] = {"n", "n+1", "n+2"}; - m_layouts[j] = HorizontalLayout( + m_layouts[j] = HorizontalLayout::Builder( CharLayout(nextName[0], font), - VerticalOffsetLayout(LayoutHelper::String(subscripts[j], strlen(subscripts[j]), font), VerticalOffsetLayoutNode::Type::Subscript) + VerticalOffsetLayout::Builder(LayoutHelper::String(subscripts[j], strlen(subscripts[j]), font), VerticalOffsetLayoutNode::Type::Subscript) ); ExpressionTableCellWithPointer * myCell = (ExpressionTableCellWithPointer *)cell; myCell->setLayout(m_layouts[j]); diff --git a/apps/sequence/sequence.cpp b/apps/sequence/sequence.cpp index 04f3e652a..ff7555ee2 100644 --- a/apps/sequence/sequence.cpp +++ b/apps/sequence/sequence.cpp @@ -146,9 +146,9 @@ int Sequence::numberOfElements() { Poincare::Layout Sequence::nameLayout() { if (m_nameLayout.isUninitialized()) { - m_nameLayout = HorizontalLayout( + m_nameLayout = HorizontalLayout::Builder( CharLayout(name()[0], KDFont::SmallFont), - VerticalOffsetLayout(CharLayout('n', KDFont::SmallFont), VerticalOffsetLayoutNode::Type::Subscript) + VerticalOffsetLayout::Builder(CharLayout('n', KDFont::SmallFont), VerticalOffsetLayoutNode::Type::Subscript) ); } return m_nameLayout; @@ -157,18 +157,18 @@ Poincare::Layout Sequence::nameLayout() { Poincare::Layout Sequence::definitionName() { if (m_definitionName.isUninitialized()) { if (m_type == Type::Explicit) { - m_definitionName = HorizontalLayout( + m_definitionName = HorizontalLayout::Builder( CharLayout(name()[0], k_layoutFont), - VerticalOffsetLayout(LayoutHelper::String("n", 1, k_layoutFont), VerticalOffsetLayoutNode::Type::Subscript)); + VerticalOffsetLayout::Builder(LayoutHelper::String("n", 1, k_layoutFont), VerticalOffsetLayoutNode::Type::Subscript)); } else if (m_type == Type::SingleRecurrence) { - m_definitionName = HorizontalLayout( + m_definitionName = HorizontalLayout::Builder( CharLayout(name()[0], k_layoutFont), - VerticalOffsetLayout(LayoutHelper::String("n+1", 3, k_layoutFont), VerticalOffsetLayoutNode::Type::Subscript)); + VerticalOffsetLayout::Builder(LayoutHelper::String("n+1", 3, k_layoutFont), VerticalOffsetLayoutNode::Type::Subscript)); } else { assert(m_type == Type::DoubleRecurrence); - m_definitionName = HorizontalLayout( + m_definitionName = HorizontalLayout::Builder( CharLayout(name()[0], k_layoutFont), - VerticalOffsetLayout(LayoutHelper::String("n+2", 3, k_layoutFont), VerticalOffsetLayoutNode::Type::Subscript)); + VerticalOffsetLayout::Builder(LayoutHelper::String("n+2", 3, k_layoutFont), VerticalOffsetLayoutNode::Type::Subscript)); } } return m_definitionName; @@ -182,9 +182,9 @@ Poincare::Layout Sequence::firstInitialConditionName() { || m_type == Type::DoubleRecurrence)) { Layout indexLayout = LayoutHelper::String(buffer, strlen(buffer), k_layoutFont); - m_firstInitialConditionName = HorizontalLayout( + m_firstInitialConditionName = HorizontalLayout::Builder( CharLayout(name()[0], k_layoutFont), - VerticalOffsetLayout(indexLayout, VerticalOffsetLayoutNode::Type::Subscript)); + VerticalOffsetLayout::Builder(indexLayout, VerticalOffsetLayoutNode::Type::Subscript)); } return m_firstInitialConditionName; } @@ -195,9 +195,9 @@ Poincare::Layout Sequence::secondInitialConditionName() { if (m_secondInitialConditionName.isUninitialized()) { if (m_type == Type::DoubleRecurrence) { Layout indexLayout = LayoutHelper::String(buffer, strlen(buffer), k_layoutFont); - m_secondInitialConditionName = HorizontalLayout( + m_secondInitialConditionName = HorizontalLayout::Builder( CharLayout(name()[0], k_layoutFont), - VerticalOffsetLayout(indexLayout, VerticalOffsetLayoutNode::Type::Subscript)); + VerticalOffsetLayout::Builder(indexLayout, VerticalOffsetLayoutNode::Type::Subscript)); } } return m_secondInitialConditionName; diff --git a/apps/settings/sub_menu/preferences_controller.cpp b/apps/settings/sub_menu/preferences_controller.cpp index 9660b567a..ccc052317 100644 --- a/apps/settings/sub_menu/preferences_controller.cpp +++ b/apps/settings/sub_menu/preferences_controller.cpp @@ -60,7 +60,7 @@ Layout layoutForPreferences(I18n::Message message) { case I18n::Message::Radian: { const char pi[] = {Ion::Charset::SmallPi}; - return FractionLayout( + return FractionLayout::Builder( LayoutHelper::String(pi, sizeof(pi), KDFont::SmallFont), LayoutHelper::String("2", 1, KDFont::SmallFont) ); @@ -75,9 +75,9 @@ Layout layoutForPreferences(I18n::Message message) { } // Edition mode case I18n::Message::Edition2D: - return HorizontalLayout( + return HorizontalLayout::Builder( LayoutHelper::String("1+", 2, KDFont::SmallFont), - FractionLayout(LayoutHelper::String("2", 1, KDFont::SmallFont), LayoutHelper::String("3", 1, KDFont::SmallFont)) + FractionLayout::Builder(LayoutHelper::String("2", 1, KDFont::SmallFont), LayoutHelper::String("3", 1, KDFont::SmallFont)) ); case I18n::Message::EditionLinear: return LayoutHelper::String("1+2/3", 5, KDFont::SmallFont); @@ -95,9 +95,9 @@ Layout layoutForPreferences(I18n::Message message) { { const char base[] = {'r', Ion::Charset::Exponential}; const char superscript[] = {Ion::Charset::IComplex, Ion::Charset::SmallTheta}; - return HorizontalLayout( + return HorizontalLayout::Builder( LayoutHelper::String(base, sizeof(base), KDFont::SmallFont), - VerticalOffsetLayout(LayoutHelper::String(superscript, sizeof(superscript), KDFont::SmallFont), VerticalOffsetLayoutNode::Type::Superscript) + VerticalOffsetLayout::Builder(LayoutHelper::String(superscript, sizeof(superscript), KDFont::SmallFont), VerticalOffsetLayoutNode::Type::Superscript) ); } default: diff --git a/apps/shared/storage_expression_model.cpp b/apps/shared/storage_expression_model.cpp index 234875015..1a6aabf17 100644 --- a/apps/shared/storage_expression_model.cpp +++ b/apps/shared/storage_expression_model.cpp @@ -60,7 +60,7 @@ Layout StorageExpressionModel::layout() { if (m_layout.isUninitialized()) { m_layout = PoincareHelpers::CreateLayout(expressionClone()); if (m_layout.isUninitialized()) { - m_layout = HorizontalLayout(); + m_layout = HorizontalLayout::Builder(); } } return m_layout; diff --git a/apps/shared/storage_sum_graph_controller.cpp b/apps/shared/storage_sum_graph_controller.cpp index 6d2997718..0e950cebb 100644 --- a/apps/shared/storage_sum_graph_controller.cpp +++ b/apps/shared/storage_sum_graph_controller.cpp @@ -240,7 +240,7 @@ void StorageSumGraphController::LegendView::setSumSymbol(Step step, double start } else if (step == Step::SecondParameter) { char buffer[PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits)]; PrintFloat::convertFloatToText(start, buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits), Constant::MediumNumberOfSignificantDigits, Preferences::PrintFloatMode::Decimal); - m_sumLayout = CondensedSumLayout( + m_sumLayout = CondensedSumLayout::Builder( LayoutHelper::String(sigma, sizeof(sigma)), LayoutHelper::String(buffer, strlen(buffer), k_font), EmptyLayout(EmptyLayoutNode::Color::Yellow, false, k_font, false)); @@ -251,13 +251,13 @@ void StorageSumGraphController::LegendView::setSumSymbol(Step step, double start Layout start = LayoutHelper::String(buffer, strlen(buffer), KDFont::SmallFont); PrintFloat::convertFloatToText(end, buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Preferences::PrintFloatMode::Decimal); Layout end = LayoutHelper::String(buffer, strlen(buffer), k_font); - m_sumLayout = CondensedSumLayout( + m_sumLayout = CondensedSumLayout::Builder( LayoutHelper::String(sigma, sizeof(sigma)), start, end); strlcpy(buffer, "= ", 3); PoincareHelpers::ConvertFloatToText(result, buffer+2, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); - m_sumLayout = HorizontalLayout( + m_sumLayout = HorizontalLayout::Builder( m_sumLayout, functionLayout, LayoutHelper::String(buffer, strlen(buffer), k_font)); diff --git a/apps/shared/sum_graph_controller.cpp b/apps/shared/sum_graph_controller.cpp index 09b299b4b..384279450 100644 --- a/apps/shared/sum_graph_controller.cpp +++ b/apps/shared/sum_graph_controller.cpp @@ -239,7 +239,7 @@ void SumGraphController::LegendView::setSumSymbol(Step step, double start, doubl } else if (step == Step::SecondParameter) { char buffer[PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits)]; PrintFloat::convertFloatToText(start, buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits), Constant::MediumNumberOfSignificantDigits, Preferences::PrintFloatMode::Decimal); - m_sumLayout = CondensedSumLayout( + m_sumLayout = CondensedSumLayout::Builder( LayoutHelper::String(sigma, sizeof(sigma)), LayoutHelper::String(buffer, strlen(buffer), KDFont::SmallFont), EmptyLayout(EmptyLayoutNode::Color::Yellow, false, KDFont::SmallFont, false)); @@ -251,13 +251,13 @@ void SumGraphController::LegendView::setSumSymbol(Step step, double start, doubl Layout start = LayoutHelper::String(buffer, strlen(buffer), KDFont::SmallFont); PrintFloat::convertFloatToText(end, buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Preferences::PrintFloatMode::Decimal); Layout end = LayoutHelper::String(buffer, strlen(buffer), KDFont::SmallFont); - m_sumLayout = CondensedSumLayout( + m_sumLayout = CondensedSumLayout::Builder( LayoutHelper::String(sigma, sizeof(sigma)), start, end); strlcpy(buffer, "= ", bufferSize); PoincareHelpers::ConvertFloatToText(result, buffer+2, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); - m_sumLayout = HorizontalLayout( + m_sumLayout = HorizontalLayout::Builder( m_sumLayout, functionLayout, LayoutHelper::String(buffer, strlen(buffer), KDFont::SmallFont)); diff --git a/apps/solver/equation_store.cpp b/apps/solver/equation_store.cpp index bc146c371..8f9e841af 100644 --- a/apps/solver/equation_store.cpp +++ b/apps/solver/equation_store.cpp @@ -211,7 +211,7 @@ EquationStore::Error EquationStore::resolveLinearSystem(Expression exactSolution while (m_variables[n][0] != 0) { n++; } int m = numberOfDefinedModels(); // m equations /* Create the matrix (A | b) for the equation Ax=b */ - Matrix Ab; + Matrix Ab = Matrix::Builder(); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { Ab.addChildAtIndexInPlace(coefficients[i][j], Ab.numberOfChildren(), Ab.numberOfChildren()); @@ -257,20 +257,20 @@ EquationStore::Error EquationStore::oneDimensialPolynomialSolve(Expression exact /* Equation ax^2+bx+c = 0 */ assert(degree == 2); // Compute delta = b*b-4ac - Expression delta = Subtraction(Power(coefficients[1].clone(), Rational(2)), Multiplication(Rational(4), coefficients[0].clone(), coefficients[2].clone())); + Expression delta = Subtraction::Builder(Power::Builder(coefficients[1].clone(), Rational(2)), Multiplication::Builder(Rational(4), coefficients[0].clone(), coefficients[2].clone())); delta = delta.simplify(*context, updatedComplexFormat(), Poincare::Preferences::sharedPreferences()->angleUnit()); if (delta.isUninitialized()) { delta = Poincare::Undefined(); } if (delta.isRationalZero()) { // if delta = 0, x0=x1= -b/(2a) - exactSolutions[0] = Division(Opposite(coefficients[1]), Multiplication(Rational(2), coefficients[2])); + exactSolutions[0] = Division::Builder(Opposite::Builder(coefficients[1]), Multiplication::Builder(Rational(2), coefficients[2])); m_numberOfSolutions = 2; } else { // x0 = (-b-sqrt(delta))/(2a) - exactSolutions[0] = Division(Subtraction(Opposite(coefficients[1].clone()), SquareRoot::Builder(delta.clone())), Multiplication(Rational(2), coefficients[2].clone())); + exactSolutions[0] = Division::Builder(Subtraction::Builder(Opposite::Builder(coefficients[1].clone()), SquareRoot::Builder(delta.clone())), Multiplication::Builder(Rational(2), coefficients[2].clone())); // x1 = (-b+sqrt(delta))/(2a) - exactSolutions[1] = Division(Addition(Opposite(coefficients[1]), SquareRoot::Builder(delta.clone())), Multiplication(Rational(2), coefficients[2])); + exactSolutions[1] = Division::Builder(Addition::Builder(Opposite::Builder(coefficients[1]), SquareRoot::Builder(delta.clone())), Multiplication::Builder(Rational(2), coefficients[2])); m_numberOfSolutions = 3; } exactSolutions[m_numberOfSolutions-1] = delta; @@ -285,23 +285,23 @@ EquationStore::Error EquationStore::oneDimensialPolynomialSolve(Expression exact Expression * c = coefficients[1]; Expression * d = coefficients[0]; // Delta = b^2*c^2+18abcd-27a^2*d^2-4ac^3-4db^3 - Expression * mult0Operands[2] = {new Power(b->clone(), new Rational(2), false), new Power(c->clone(), new Rational(2), false)}; + Expression * mult0Operands[2] = {new Power::Builder(b->clone(), new Rational(2), false), new Power::Builder(c->clone(), new Rational(2), false)}; Expression * mult1Operands[5] = {new Rational(18), a->clone(), b->clone(), c->clone(), d->clone()}; - Expression * mult2Operands[3] = {new Rational(-27), new Power(a->clone(), new Rational(2), false), new Power(d->clone(), new Rational(2), false)}; - Expression * mult3Operands[3] = {new Rational(-4), a->clone(), new Power(c->clone(), new Rational(3), false)}; - Expression * mult4Operands[3] = {new Rational(-4), d->clone(), new Power(b->clone(), new Rational(3), false)}; - Expression * add0Operands[5] = {new Multiplication(mult0Operands, 2, false), new Multiplication(mult1Operands, 5, false), new Multiplication(mult2Operands, 3, false), new Multiplication(mult3Operands, 3, false), new Multiplication(mult4Operands, 3, false)}; + Expression * mult2Operands[3] = {new Rational(-27), new Power::Builder(a->clone(), new Rational(2), false), new Power::Builder(d->clone(), new Rational(2), false)}; + Expression * mult3Operands[3] = {new Rational(-4), a->clone(), new Power::Builder(c->clone(), new Rational(3), false)}; + Expression * mult4Operands[3] = {new Rational(-4), d->clone(), new Power::Builder(b->clone(), new Rational(3), false)}; + Expression * add0Operands[5] = {new Multiplication::Builder(mult0Operands, 2, false), new Multiplication::Builder(mult1Operands, 5, false), new Multiplication::Builder(mult2Operands, 3, false), new Multiplication::Builder(mult3Operands, 3, false), new Multiplication::Builder(mult4Operands, 3, false)}; Expression * delta = new Addition(add0Operands, 5, false); PoincareHelpers::Simplify(&delta, *context); // Delta0 = b^2-3ac Expression * mult5Operands[3] = {new Rational(3), a->clone(), c->clone()}; - Expression * delta0 = new Subtraction(new Power(b->clone(), new Rational(2), false), new Multiplication(mult5Operands, 3, false), false); + Expression * delta0 = new Subtraction::Builder(new Power::Builder(b->clone(), new Rational(2), false), new Multiplication::Builder(mult5Operands, 3, false), false); Reduce(&delta0, *context); if (delta->isRationalZero()) { if (delta0->isRationalZero()) { // delta0 = 0 && delta = 0 --> x0 = -b/(3a) delete delta0; - m_exactSolutions[0] = new Opposite(new Division(b, new Multiplication(new Rational(3), a, false), false), false); + m_exactSolutions[0] = new Opposite::Builder(new Division::Builder(b, new Multiplication::Builder(new Rational(3), a, false), false), false); m_numberOfSolutions = 1; delete c; delete d; @@ -309,33 +309,33 @@ EquationStore::Error EquationStore::oneDimensialPolynomialSolve(Expression exact // delta = 0 --> x0 = (9ad-bc)/(2delta0) // --> x1 = (4abc-9a^2d-b^3)/(a*delta0) Expression * mult6Operands[3] = {new Rational(9), a, d}; - m_exactSolutions[0] = new Division(new Subtraction(new Multiplication(mult6Operands, 3, false), new Multiplication(b, c, false), false), new Multiplication(new Rational(2), delta0, false), false); + m_exactSolutions[0] = new Division::Builder(new Subtraction::Builder(new Multiplication::Builder(mult6Operands, 3, false), new Multiplication::Builder(b, c, false), false), new Multiplication::Builder(new Rational(2), delta0, false), false); Expression * mult7Operands[4] = {new Rational(4), a->clone(), b->clone(), c->clone()}; - Expression * mult8Operands[3] = {new Rational(-9), new Power(a->clone(), new Rational(2), false), d->clone()}; - Expression * add1Operands[3] = {new Multiplication(mult7Operands, 4, false), new Multiplication(mult8Operands,3, false), new Opposite(new Power(b->clone(), new Rational(3), false), false)}; - m_exactSolutions[1] = new Division(new Addition(add1Operands, 3, false), new Multiplication(a->clone(), delta0, false), false); + Expression * mult8Operands[3] = {new Rational(-9), new Power::Builder(a->clone(), new Rational(2), false), d->clone()}; + Expression * add1Operands[3] = {new Multiplication::Builder(mult7Operands, 4, false), new Multiplication::Builder(mult8Operands,3, false), new Opposite::Builder(new Power::Builder(b->clone(), new Rational(3), false), false)}; + m_exactSolutions[1] = new Division::Builder(new Addition(add1Operands, 3, false), new Multiplication::Builder(a->clone(), delta0, false), false); m_numberOfSolutions = 2; } } else { // delta1 = 2b^3-9abc+27a^2*d Expression * mult9Operands[4] = {new Rational(-9), a, b, c}; - Expression * mult10Operands[3] = {new Rational(27), new Power(a->clone(), new Rational(2), false), d}; - Expression * add2Operands[3] = {new Multiplication(new Rational(2), new Power(b->clone(), new Rational(3), false), false), new Multiplication(mult9Operands, 4, false), new Multiplication(mult10Operands, 3, false)}; + Expression * mult10Operands[3] = {new Rational(27), new Power::Builder(a->clone(), new Rational(2), false), d}; + Expression * add2Operands[3] = {new Multiplication::Builder(new Rational(2), new Power::Builder(b->clone(), new Rational(3), false), false), new Multiplication::Builder(mult9Operands, 4, false), new Multiplication::Builder(mult10Operands, 3, false)}; Expression * delta1 = new Addition(add2Operands, 3, false); // C = Root((delta1+sqrt(-27a^2*delta))/2, 3) - Expression * mult11Operands[3] = {new Rational(-27), new Power(a->clone(), new Rational(2), false), (*delta)->clone()}; - Expression * c = new Power(new Division(new Addition(delta1, new SquareRoot(new Multiplication(mult11Operands, 3, false), false), false), new Rational(2), false), new Rational(1,3), false); - Expression * unary3roots[2] = {new Addition(new Rational(-1,2), new Division(new Multiplication(new SquareRoot(new Rational(3), false), new Constant(Ion::Charset::IComplex), false), new Rational(2), false), false), new Subtraction(new Rational(-1,2), new Division(new Multiplication(new SquareRoot(new Rational(3), false), new Constant(Ion::Charset::IComplex), false), new Rational(2), false), false)}; + Expression * mult11Operands[3] = {new Rational(-27), new Power::Builder(a->clone(), new Rational(2), false), (*delta)->clone()}; + Expression * c = new Power::Builder(new Division::Builder(new Addition(delta1, new SquareRoot(new Multiplication::Builder(mult11Operands, 3, false), false), false), new Rational(2), false), new Rational(1,3), false); + Expression * unary3roots[2] = {new Addition(new Rational(-1,2), new Division::Builder(new Multiplication::Builder(new SquareRoot(new Rational(3), false), new Constant(Ion::Charset::IComplex), false), new Rational(2), false), false), new Subtraction::Builder(new Rational(-1,2), new Division::Builder(new Multiplication::Builder(new SquareRoot(new Rational(3), false), new Constant(Ion::Charset::IComplex), false), new Rational(2), false), false)}; // x_k = -1/(3a)*(b+C*z+delta0/(zC)) with z = unary cube root for (int k = 0; k < 3; k++) { Expression * ccopy = c; Expression * delta0copy = delta0; if (k < 2) { - ccopy = new Multiplication(c->clone(), unary3roots[k], false); + ccopy = new Multiplication::Builder(c->clone(), unary3roots[k], false); delta0copy = delta0->clone(); } - Expression * add3Operands[3] = {b->clone(), ccopy, new Division(delta0copy, ccopy->clone(), false)}; - m_exactSolutions[k] = new Multiplication(new Division(new Rational(-1), new Multiplication(new Rational(3), a->clone(), false), false), new Addition(add3Operands, 3, false), false); + Expression * add3Operands[3] = {b->clone(), ccopy, new Division::Builder(delta0copy, ccopy->clone(), false)}; + m_exactSolutions[k] = new Multiplication::Builder(new Division::Builder(new Rational(-1), new Multiplication::Builder(new Rational(3), a->clone(), false), false), new Addition(add3Operands, 3, false), false); } m_numberOfSolutions = 3; } diff --git a/apps/solver/solutions_controller.cpp b/apps/solver/solutions_controller.cpp index 3cf912611..5783f4287 100644 --- a/apps/solver/solutions_controller.cpp +++ b/apps/solver/solutions_controller.cpp @@ -75,7 +75,7 @@ SolutionsController::SolutionsController(Responder * parentResponder, EquationSt m_delta2Layout(), m_contentView(this) { - m_delta2Layout = HorizontalLayout(VerticalOffsetLayout(CharLayout('2', KDFont::SmallFont), VerticalOffsetLayoutNode::Type::Superscript), LayoutHelper::String("-4ac", 4, KDFont::SmallFont)); + m_delta2Layout = HorizontalLayout::Builder(VerticalOffsetLayout::Builder(CharLayout('2', KDFont::SmallFont), VerticalOffsetLayoutNode::Type::Superscript), LayoutHelper::String("-4ac", 4, KDFont::SmallFont)); char deltaB[] = {Ion::Charset::CapitalDelta, '=', 'b'}; static_cast(m_delta2Layout).addOrMergeChildAtIndex(LayoutHelper::String(deltaB, 3, KDFont::SmallFont), 0, false); for (int i = 0; i < EquationStore::k_maxNumberOfExactSolutions; i++) { diff --git a/escher/src/layout_field.cpp b/escher/src/layout_field.cpp index 866875eb2..b31123263 100644 --- a/escher/src/layout_field.cpp +++ b/escher/src/layout_field.cpp @@ -25,7 +25,7 @@ void LayoutField::ContentView::setEditing(bool isEditing) { } void LayoutField::ContentView::clearLayout() { - HorizontalLayout h; + HorizontalLayout h = HorizontalLayout::Builder(); m_expressionView.setLayout(h); m_cursor.setLayout(h); } diff --git a/poincare/include/poincare/absolute_value_layout.h b/poincare/include/poincare/absolute_value_layout.h index 098b7f3ee..a0dfde873 100644 --- a/poincare/include/poincare/absolute_value_layout.h +++ b/poincare/include/poincare/absolute_value_layout.h @@ -33,6 +33,8 @@ private: class AbsoluteValueLayout final : public Layout { public: + static AbsoluteValueLayout Builder(Layout l) { return AbsoluteValueLayout(l); } +private: explicit AbsoluteValueLayout(Layout l) : Layout(TreePool::sharedPool()->createTreeNode()) { diff --git a/poincare/include/poincare/addition.h b/poincare/include/poincare/addition.h index fd6f95dba..6c4348130 100644 --- a/poincare/include/poincare/addition.h +++ b/poincare/include/poincare/addition.h @@ -2,6 +2,7 @@ #define POINCARE_ADDITION_H #include +#include #include #include @@ -60,24 +61,23 @@ private: class Addition final : public NAryExpression { public: Addition(const AdditionNode * n) : NAryExpression(n) {} - Addition(); - explicit Addition(Expression e1) : Addition() { - addChildAtIndexInPlace(e1, 0, 0); - } - Addition(Expression e1, Expression e2) : Addition() { - addChildAtIndexInPlace(e2, 0, 0); - addChildAtIndexInPlace(e1, 0, numberOfChildren()); - } - Addition(Expression * children, size_t numberOfChildren) : Addition() { + static Addition Builder() { return Addition(); } + 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) { + Addition a = Addition::Builder(); for (size_t i = 0; i < numberOfChildren; i++) { - addChildAtIndexInPlace(children[i], i, i); + a.addChildAtIndexInPlace(children[i], i, i); } + return a; } // Expression Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); Expression shallowBeautify(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); int getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const; private: + Addition() : NAryExpression(TreePool::sharedPool()->createTreeNode()) {} + static const Number NumeralFactor(const Expression & e); static inline int NumberOfNonNumeralFactors(const Expression & e); static inline const Expression FirstNonNumeralFactor(const Expression & e); diff --git a/poincare/include/poincare/array_builder.h b/poincare/include/poincare/array_builder.h new file mode 100644 index 000000000..ed7b232f1 --- /dev/null +++ b/poincare/include/poincare/array_builder.h @@ -0,0 +1,20 @@ +#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/binomial_coefficient_layout.h b/poincare/include/poincare/binomial_coefficient_layout.h index 222d2e9b0..756f8862e 100644 --- a/poincare/include/poincare/binomial_coefficient_layout.h +++ b/poincare/include/poincare/binomial_coefficient_layout.h @@ -43,6 +43,9 @@ private: class BinomialCoefficientLayout final : public Layout { public: + static BinomialCoefficientLayout Builder(Layout n, Layout k) { return BinomialCoefficientLayout(n, k); } + +private: BinomialCoefficientLayout(Layout n, Layout k) : Layout(TreePool::sharedPool()->createTreeNode()) { diff --git a/poincare/include/poincare/ceiling_layout.h b/poincare/include/poincare/ceiling_layout.h index 4264e318f..72ce65484 100644 --- a/poincare/include/poincare/ceiling_layout.h +++ b/poincare/include/poincare/ceiling_layout.h @@ -30,6 +30,8 @@ protected: class CeilingLayout final : public Layout { public: + static CeilingLayout Builder(Layout l) { return CeilingLayout(l); } +private: explicit CeilingLayout(Layout l) : Layout(TreePool::sharedPool()->createTreeNode()) { replaceChildAtIndexInPlace(0, l); } diff --git a/poincare/include/poincare/condensed_sum_layout.h b/poincare/include/poincare/condensed_sum_layout.h index a705afbf2..59d2f6a7c 100644 --- a/poincare/include/poincare/condensed_sum_layout.h +++ b/poincare/include/poincare/condensed_sum_layout.h @@ -51,7 +51,15 @@ private: class CondensedSumLayout final : public Layout { public: - CondensedSumLayout(Layout base, Layout subscript, Layout superscript); + static CondensedSumLayout Builder(Layout base, Layout subscript, Layout superscript) { return CondensedSumLayout(base, subscript, superscript); } +private: + CondensedSumLayout(Layout base, Layout subscript, Layout superscript) : + Layout(TreePool::sharedPool()->createTreeNode()) + { + replaceChildAtIndexInPlace(0, base); + replaceChildAtIndexInPlace(1, subscript); + replaceChildAtIndexInPlace(2, superscript); + } }; } diff --git a/poincare/include/poincare/conjugate_layout.h b/poincare/include/poincare/conjugate_layout.h index 4e04da6f4..d95dde4f7 100644 --- a/poincare/include/poincare/conjugate_layout.h +++ b/poincare/include/poincare/conjugate_layout.h @@ -40,6 +40,8 @@ private: class ConjugateLayout final : public Layout { public: + static ConjugateLayout Builder(Layout l) { return ConjugateLayout(l); } +private: explicit ConjugateLayout(Layout l) : Layout(TreePool::sharedPool()->createTreeNode()) { replaceChildAtIndexInPlace(0, l); } diff --git a/poincare/include/poincare/division.h b/poincare/include/poincare/division.h index d330d34ec..b620eba3d 100644 --- a/poincare/include/poincare/division.h +++ b/poincare/include/poincare/division.h @@ -60,14 +60,19 @@ private: class Division final : public Expression { public: - Division(); - Division(Expression numerator, Expression denominator) : Division() { - replaceChildAtIndexInPlace(0, numerator); - replaceChildAtIndexInPlace(1, denominator); - } Division(const DivisionNode * n) : Expression(n) {} + static Division Builder() { return Division(); } + static Division Builder(Expression numerator, Expression denominator) { + Division d; + d.replaceChildAtIndexInPlace(0, numerator); + d.replaceChildAtIndexInPlace(1, denominator); + return d; + } Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); + +private: + Division() : Expression(TreePool::sharedPool()->createTreeNode()) {} }; } diff --git a/poincare/include/poincare/factorial.h b/poincare/include/poincare/factorial.h index 315010f42..2a1f2774d 100644 --- a/poincare/include/poincare/factorial.h +++ b/poincare/include/poincare/factorial.h @@ -51,16 +51,19 @@ private: class Factorial final : public Expression { public: - Factorial(); Factorial(const FactorialNode * n) : Expression(n) {} - explicit Factorial(Expression child) : Factorial() { - replaceChildAtIndexInPlace(0, child); + static Factorial Builder() { return Factorial(); } + static Factorial Builder(Expression child) { + Factorial f; + f.replaceChildAtIndexInPlace(0, child); + return f; } Expression shallowReduce(); Expression shallowBeautify(); private: constexpr static int k_maxOperandValue = 100; + Factorial() : Expression(TreePool::sharedPool()->createTreeNode()) {} }; } diff --git a/poincare/include/poincare/floor_layout.h b/poincare/include/poincare/floor_layout.h index eaada21f5..7caf67ed0 100644 --- a/poincare/include/poincare/floor_layout.h +++ b/poincare/include/poincare/floor_layout.h @@ -29,6 +29,8 @@ protected: class FloorLayout final : public Layout { public: + static FloorLayout Builder(Layout l) { return FloorLayout(l); } +private: explicit FloorLayout(Layout l) : Layout(TreePool::sharedPool()->createTreeNode()) { replaceChildAtIndexInPlace(0, l); } diff --git a/poincare/include/poincare/fraction_layout.h b/poincare/include/poincare/fraction_layout.h index 9239ccd6e..23ee39f8f 100644 --- a/poincare/include/poincare/fraction_layout.h +++ b/poincare/include/poincare/fraction_layout.h @@ -58,7 +58,14 @@ private: class FractionLayout final : public Layout { public: - FractionLayout(Layout numerator, Layout denominator); + static FractionLayout Builder(Layout numerator, Layout denominator) { return FractionLayout(numerator, denominator); } +private: + FractionLayout(Layout numerator, Layout denominator) : + Layout(TreePool::sharedPool()->createTreeNode()) + { + replaceChildAtIndexInPlace(0, numerator); + replaceChildAtIndexInPlace(1, denominator); + } }; } diff --git a/poincare/include/poincare/ghost.h b/poincare/include/poincare/ghost.h index a00098aee..d27eff5e9 100644 --- a/poincare/include/poincare/ghost.h +++ b/poincare/include/poincare/ghost.h @@ -12,6 +12,8 @@ namespace Poincare { class Ghost final : public TreeHandle { public: + static Ghost Builder() { return Ghost(); } +private: Ghost() : TreeHandle(TreePool::sharedPool()->createTreeNode()) {} }; diff --git a/poincare/include/poincare/grid_layout.h b/poincare/include/poincare/grid_layout.h index 562928911..46e0b8e2e 100644 --- a/poincare/include/poincare/grid_layout.h +++ b/poincare/include/poincare/grid_layout.h @@ -89,7 +89,7 @@ private: class GridLayout : public Layout { public: GridLayout(const GridLayoutNode * n) : Layout(n) {} - GridLayout() : Layout(TreePool::sharedPool()->createTreeNode()) {} + static GridLayout Builder() { return GridLayout(); } void setDimensions(int rows, int columns); void addChildAtIndex(Layout l, int index, int currentNumberOfChildren, LayoutCursor * cursor) { Layout::addChildAtIndex(l, index, currentNumberOfChildren, cursor); @@ -97,6 +97,7 @@ public: int numberOfRows() const { return node()->numberOfRows(); } int numberOfColumns() const { return node()->numberOfColumns(); } private: + GridLayout() : Layout(TreePool::sharedPool()->createTreeNode()) {} virtual GridLayoutNode * node() const { return static_cast(Layout::node()); } void setNumberOfRows(int rows) { assert(rows >= 0); diff --git a/poincare/include/poincare/horizontal_layout.h b/poincare/include/poincare/horizontal_layout.h index 9a2c06811..5cb32b211 100644 --- a/poincare/include/poincare/horizontal_layout.h +++ b/poincare/include/poincare/horizontal_layout.h @@ -1,6 +1,7 @@ #ifndef POINCARE_HORIZONTAL_LAYOUT_NODE_H #define POINCARE_HORIZONTAL_LAYOUT_NODE_H +#include #include #include @@ -65,13 +66,21 @@ private: class HorizontalLayout final : public Layout { friend class HorizontalLayoutNode; public: + // Constructors HorizontalLayout(HorizontalLayoutNode * n) : Layout(n) {} - HorizontalLayout(); - explicit HorizontalLayout(Layout l); - HorizontalLayout(Layout l1, Layout l2); - HorizontalLayout(Layout l1, Layout l2, Layout l3); - HorizontalLayout(Layout l1, Layout l2, Layout l3, Layout l4); - HorizontalLayout(const Layout * children, size_t numberOfChildren); + static HorizontalLayout Builder() { return HorizontalLayout(); } + 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(const Layout * children, size_t numberOfChildren) { + HorizontalLayout h = HorizontalLayout::Builder(); + for (size_t i = 0; i < numberOfChildren; i++) { + h.addChildAtIndexInPlace(children[i], i, i); + } + return h; + } + void addChildAtIndex(Layout l, int index, int currentNumberOfChildren, LayoutCursor * cursor, bool removeEmptyChildren = false); // Remove puts a child at the end of the pool void removeChild(Layout l, LayoutCursor * cursor, bool force = false) { @@ -82,7 +91,9 @@ public: } void addOrMergeChildAtIndex(Layout l, int index, bool removeEmptyChildren, LayoutCursor * cursor = nullptr); void mergeChildrenAtIndex(HorizontalLayout h, int index, bool removeEmptyChildren, LayoutCursor * cursor = nullptr); + private: + HorizontalLayout() : Layout(TreePool::sharedPool()->createTreeNode()) {} void removeEmptyChildBeforeInsertionAtIndex(int * index, int * currentNumberOfChildren, bool shouldRemoveOnLeft, LayoutCursor * cursor = nullptr); }; diff --git a/poincare/include/poincare/integral_layout.h b/poincare/include/poincare/integral_layout.h index f252c308f..26fc711a0 100644 --- a/poincare/include/poincare/integral_layout.h +++ b/poincare/include/poincare/integral_layout.h @@ -56,6 +56,8 @@ private: class IntegralLayout final : public Layout { public: + static IntegralLayout Builder(Layout integrand, Layout differential, Layout lowerBound, Layout upperBound) { return IntegralLayout(integrand, differential, lowerBound, upperBound); } +private: IntegralLayout(Layout integrand, Layout differential, Layout lowerBound, Layout upperBound) : Layout(TreePool::sharedPool()->createTreeNode()) { diff --git a/poincare/include/poincare/left_parenthesis_layout.h b/poincare/include/poincare/left_parenthesis_layout.h index 59747765a..5bf6d25e0 100644 --- a/poincare/include/poincare/left_parenthesis_layout.h +++ b/poincare/include/poincare/left_parenthesis_layout.h @@ -35,7 +35,9 @@ protected: class LeftParenthesisLayout final : public Layout { public: - LeftParenthesisLayout(); + static LeftParenthesisLayout Builder() { return LeftParenthesisLayout(); } +private: + LeftParenthesisLayout() : Layout(TreePool::sharedPool()->createTreeNode()) {} }; } diff --git a/poincare/include/poincare/left_square_bracket_layout.h b/poincare/include/poincare/left_square_bracket_layout.h index 80dc2e75e..c0dfed6cd 100644 --- a/poincare/include/poincare/left_square_bracket_layout.h +++ b/poincare/include/poincare/left_square_bracket_layout.h @@ -29,7 +29,9 @@ protected: class LeftSquareBracketLayout final : public Layout { public: - LeftSquareBracketLayout(); + static LeftSquareBracketLayout Builder() { return LeftSquareBracketLayout(); } +private: + LeftSquareBracketLayout() : Layout(TreePool::sharedPool()->createTreeNode()) {} }; } diff --git a/poincare/include/poincare/matrix.h b/poincare/include/poincare/matrix.h index cbe0a2c16..1c07e0708 100644 --- a/poincare/include/poincare/matrix.h +++ b/poincare/include/poincare/matrix.h @@ -62,14 +62,8 @@ class Matrix final : public Expression { template friend class MatrixComplexNode; friend class GlobalContext; public: - static Matrix EmptyMatrix() { - return Matrix(TreePool::sharedPool()->createTreeNode()); - } - Matrix() : Matrix(TreePool::sharedPool()->createTreeNode()) {} Matrix(const MatrixNode * node) : Expression(node) {} - explicit Matrix(Expression e) : Matrix() { - addChildAtIndexInPlace(e, 0, 0); - } + static Matrix Builder() { return Matrix(); } void setDimensions(int rows, int columns); int numberOfRows() const { return node()->numberOfRows(); } @@ -91,6 +85,7 @@ public: Expression inverse(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const; #endif private: + Matrix() : Matrix(TreePool::sharedPool()->createTreeNode()) {} // TODO: find another solution for inverse and determinant (avoid capping the matrix) static constexpr int k_maxNumberOfCoefficients = 100; @@ -98,7 +93,7 @@ private: void setNumberOfRows(int rows) { assert(rows >= 0); node()->setNumberOfRows(rows); } void setNumberOfColumns(int columns) { assert(columns >= 0); node()->setNumberOfColumns(columns); } /* rowCanonize turns a matrix in its reduced row echelon form. */ - Matrix rowCanonize(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, Multiplication m = Multiplication()); + Matrix rowCanonize(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, Multiplication m = Multiplication::Builder()); // Row canonize the array in place template static void ArrayRowCanonize(T * array, int numberOfRows, int numberOfColumns, T * c = nullptr); }; diff --git a/poincare/include/poincare/matrix_layout.h b/poincare/include/poincare/matrix_layout.h index 28374c557..9f3420136 100644 --- a/poincare/include/poincare/matrix_layout.h +++ b/poincare/include/poincare/matrix_layout.h @@ -57,13 +57,23 @@ private: class MatrixLayout /*final*/ : public GridLayout { friend class MatrixLayoutNode; public: - MatrixLayout(const MatrixLayoutNode * n); - MatrixLayout(); - MatrixLayout(Layout l1, Layout l2, Layout l3, Layout l4); + static MatrixLayout Builder() { return MatrixLayout(); } + MatrixLayout(const MatrixLayoutNode * n) : GridLayout(n) {} + static MatrixLayout Builder(Layout l1, Layout l2, Layout l3, Layout l4) { + MatrixLayout m = MatrixLayout::Builder(); + m.addChildAtIndexInPlace(l1, 0, 0); + m.addChildAtIndexInPlace(l2, 1, 1); + m.addChildAtIndexInPlace(l3, 2, 2); + m.addChildAtIndexInPlace(l4, 3, 3); + m.setDimensions(2, 2); + return m; + } + bool hasGreySquares() const { return node()->hasGreySquares(); } void addGreySquares() { node()->addGreySquares(); } void removeGreySquares() { node()->removeGreySquares(); } private: + MatrixLayout() : GridLayout(TreePool::sharedPool()->createTreeNode()) {} MatrixLayoutNode * node() const { return static_cast(Layout::node()); } }; diff --git a/poincare/include/poincare/multiplication.h b/poincare/include/poincare/multiplication.h index fadc6780a..b41bde2ce 100644 --- a/poincare/include/poincare/multiplication.h +++ b/poincare/include/poincare/multiplication.h @@ -2,6 +2,7 @@ #define POINCARE_MULTIPLICATION_H #include +#include #include namespace Poincare { @@ -66,17 +67,10 @@ class Multiplication final : public NAryExpression { friend class Power; public: Multiplication(const MultiplicationNode * n) : NAryExpression(n) {} - Multiplication(); - explicit Multiplication(Expression e1) : Multiplication() { - addChildAtIndexInPlace(e1, 0, 0); - } - Multiplication(Expression e1, Expression e2) : Multiplication() { - addChildAtIndexInPlace(e2, 0, 0); - addChildAtIndexInPlace(e1, 0, numberOfChildren()); - } - Multiplication(Expression e1, Expression e2, Expression e3) : Multiplication(e2, e3) { - addChildAtIndexInPlace(e1, 0, numberOfChildren()); - } + static Multiplication Builder() { return Multiplication(); } + static Multiplication Builder(Expression e1) { return Multiplication(&e1, 1); } + static Multiplication Builder(Expression e1, Expression e2) { return Multiplication(ArrayBuilder(e1, e2).array(), 2); } + static Multiplication Builder(Expression e1, Expression e2, Expression e3) { return Multiplication(ArrayBuilder(e1, e2, e3).array(), 3); } template static void computeOnArrays(T * m, T * n, T * result, int mNumberOfColumns, int mNumberOfRows, int nNumberOfColumns); // Expression @@ -86,6 +80,13 @@ public: int getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const; Expression denominator(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const; private: + // Constructors + Multiplication() : NAryExpression(TreePool::sharedPool()->createTreeNode()) {} + explicit Multiplication(Expression * children, size_t numberOfChildren) : Multiplication() { + for (size_t i = 0; i < numberOfChildren; i++) { + addChildAtIndexInPlace(children[i], i, i); + } + } // Simplification Expression privateShallowReduce(Context& context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target, bool expand, bool canBeInterrupted); void mergeMultiplicationChildrenInPlace(); diff --git a/poincare/include/poincare/nth_root_layout.h b/poincare/include/poincare/nth_root_layout.h index 8f9e59ebf..5cb5d51e3 100644 --- a/poincare/include/poincare/nth_root_layout.h +++ b/poincare/include/poincare/nth_root_layout.h @@ -67,10 +67,17 @@ private: class NthRootLayout final : public Layout { public: - explicit NthRootLayout(Layout radicand); - NthRootLayout(Layout radicand, Layout index); + static NthRootLayout Builder(Layout radicand) { return NthRootLayout(radicand); } + static NthRootLayout Builder(Layout radicand, Layout index) { + NthRootLayout n(radicand); + n.addChildAtIndexInPlace(index, 1, 1); + static_cast(n.node())->setNumberOfChildren(2); + return n; + } private: - NthRootLayout(); + NthRootLayout(Layout radicand) : Layout(TreePool::sharedPool()->createTreeNode()) { + replaceChildAtIndexInPlace(0, radicand); + } }; } diff --git a/poincare/include/poincare/opposite.h b/poincare/include/poincare/opposite.h index 9db4dd53d..23f1f19df 100644 --- a/poincare/include/poincare/opposite.h +++ b/poincare/include/poincare/opposite.h @@ -46,13 +46,17 @@ public: class Opposite final : public Expression { public: - Opposite(); Opposite(const OppositeNode * n) : Expression(n) {} + static Opposite Builder() { return Opposite(); } + static Opposite Builder(Expression child) { return Opposite(child); } + + Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); + +private: + Opposite() : Expression(TreePool::sharedPool()->createTreeNode()) {} explicit Opposite(Expression child) : Expression(TreePool::sharedPool()->createTreeNode()) { replaceChildAtIndexInPlace(0, child); } - - Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); }; } diff --git a/poincare/include/poincare/parenthesis.h b/poincare/include/poincare/parenthesis.h index ed3fd93b0..d4b940bea 100644 --- a/poincare/include/poincare/parenthesis.h +++ b/poincare/include/poincare/parenthesis.h @@ -38,11 +38,14 @@ private: class Parenthesis final : public Expression { public: Parenthesis(const ParenthesisNode * n) : Expression(n) {} + static Parenthesis Builder(Expression child) { return Parenthesis(child); } + // Expression + Expression shallowReduce(); + +private: Parenthesis(Expression exp) : Expression(TreePool::sharedPool()->createTreeNode()) { replaceChildAtIndexInPlace(0, exp); } - // Expression - Expression shallowReduce(); }; } diff --git a/poincare/include/poincare/power.h b/poincare/include/poincare/power.h index b506cac49..8ddc1d6b0 100644 --- a/poincare/include/poincare/power.h +++ b/poincare/include/poincare/power.h @@ -66,8 +66,9 @@ class Power final : public Expression { friend class PowerNode; friend class Round; public: - Power(Expression base, Expression exponent); Power(const PowerNode * n) : Expression(n) {} + static Power Builder(Expression base, Expression exponent) { return Power(base, exponent); } + Expression setSign(ExpressionNode::Sign s, Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); int getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const; Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); @@ -77,6 +78,12 @@ private: constexpr static int k_maxExactPowerMatrix = 100; constexpr static int k_maxNumberOfTermsInExpandedMultinome = 25; + // Constructors + Power(Expression base, Expression exponent) : Expression(TreePool::sharedPool()->createTreeNode()) { + replaceChildAtIndexInPlace(0, base); + replaceChildAtIndexInPlace(1, exponent); + } + // Simplification Expression denominator(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const; diff --git a/poincare/include/poincare/product_layout.h b/poincare/include/poincare/product_layout.h index 8eb2adccd..7c2298d95 100644 --- a/poincare/include/poincare/product_layout.h +++ b/poincare/include/poincare/product_layout.h @@ -25,6 +25,8 @@ private: class ProductLayout final : public Layout { public: + static ProductLayout Builder(Layout argument, Layout variable, Layout lowerB, Layout upperB) { return ProductLayout(argument, variable, lowerB, upperB); } +private: ProductLayout(Layout argument, Layout variable, Layout lowerB, Layout upperB) : Layout(TreePool::sharedPool()->createTreeNode()) { diff --git a/poincare/include/poincare/right_parenthesis_layout.h b/poincare/include/poincare/right_parenthesis_layout.h index 6f127afb3..342634b7f 100644 --- a/poincare/include/poincare/right_parenthesis_layout.h +++ b/poincare/include/poincare/right_parenthesis_layout.h @@ -36,7 +36,9 @@ protected: class RightParenthesisLayout final : public Layout { public: - RightParenthesisLayout(); + static RightParenthesisLayout Builder() { return RightParenthesisLayout(); } +private: + RightParenthesisLayout() : Layout(TreePool::sharedPool()->createTreeNode()) {} }; } diff --git a/poincare/include/poincare/right_square_bracket_layout.h b/poincare/include/poincare/right_square_bracket_layout.h index 1f6c5925f..860c15e20 100644 --- a/poincare/include/poincare/right_square_bracket_layout.h +++ b/poincare/include/poincare/right_square_bracket_layout.h @@ -29,7 +29,10 @@ protected: class RightSquareBracketLayout final : public Layout { public: - RightSquareBracketLayout(); + static RightSquareBracketLayout Builder() { return RightSquareBracketLayout(); } + +private: + RightSquareBracketLayout() : Layout(TreePool::sharedPool()->createTreeNode()) {} }; } diff --git a/poincare/include/poincare/store.h b/poincare/include/poincare/store.h index b4c9e61a5..0d780cd75 100644 --- a/poincare/include/poincare/store.h +++ b/poincare/include/poincare/store.h @@ -40,10 +40,7 @@ class Store final : public Expression { friend class StoreNode; public: Store(const StoreNode * n) : Expression(n) {} - Store(Expression value, SymbolAbstract symbol) : Expression(TreePool::sharedPool()->createTreeNode()) { - replaceChildAtIndexInPlace(0, value); - replaceChildAtIndexInPlace(1, symbol); - } + static Store Builder(Expression value, SymbolAbstract symbol) { return Store(value, symbol); } // Store const SymbolAbstract symbol() const { @@ -58,6 +55,11 @@ public: // Expression Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); private: + Store(Expression value, SymbolAbstract symbol) : Expression(TreePool::sharedPool()->createTreeNode()) { + replaceChildAtIndexInPlace(0, value); + replaceChildAtIndexInPlace(1, symbol); + } + Expression storeValueForSymbol(Context& context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const; StoreNode * node() const { return static_cast(Expression::node()); } }; diff --git a/poincare/include/poincare/subtraction.h b/poincare/include/poincare/subtraction.h index 393c0e13a..faae9c66b 100644 --- a/poincare/include/poincare/subtraction.h +++ b/poincare/include/poincare/subtraction.h @@ -54,15 +54,20 @@ private: class Subtraction final : public Expression { public: - Subtraction(); Subtraction(const SubtractionNode * n) : Expression(n) {} - Subtraction(Expression child0, Expression child1) : Subtraction() { - replaceChildAtIndexInPlace(0, child0); - replaceChildAtIndexInPlace(1, child1); + static Subtraction Builder() { return Subtraction(); } + static Subtraction Builder(Expression child0, Expression child1) { + Subtraction s = Subtraction::Builder(); + s.replaceChildAtIndexInPlace(0, child0); + s.replaceChildAtIndexInPlace(1, child1); + return s; } // Expression Expression shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target); + +private: + Subtraction() : Expression(TreePool::sharedPool()->createTreeNode()) {} }; } diff --git a/poincare/include/poincare/sum_layout.h b/poincare/include/poincare/sum_layout.h index f201a8e69..a21b6fd38 100644 --- a/poincare/include/poincare/sum_layout.h +++ b/poincare/include/poincare/sum_layout.h @@ -23,6 +23,8 @@ private: class SumLayout final : public Layout { public: + static SumLayout Builder(Layout argument, Layout variable, Layout lowerB, Layout upperB) { return SumLayout(argument, variable, lowerB, upperB); } +private: SumLayout(Layout argument, Layout variable, Layout lowerB, Layout upperB) : Layout(TreePool::sharedPool()->createTreeNode()) { diff --git a/poincare/include/poincare/vertical_offset_layout.h b/poincare/include/poincare/vertical_offset_layout.h index c46caba12..8ac17b24f 100644 --- a/poincare/include/poincare/vertical_offset_layout.h +++ b/poincare/include/poincare/vertical_offset_layout.h @@ -59,7 +59,15 @@ private: class VerticalOffsetLayout final : public Layout { public: - VerticalOffsetLayout(Layout l, VerticalOffsetLayoutNode::Type type); + static VerticalOffsetLayout Builder(Layout l, VerticalOffsetLayoutNode::Type type) { return VerticalOffsetLayout(l, type); } + +private: + VerticalOffsetLayout(Layout l, VerticalOffsetLayoutNode::Type type) : + Layout(TreePool::sharedPool()->createTreeNode()) + { + static_cast(node())->setType(type); + replaceChildAtIndexInPlace(0,l); + } }; } diff --git a/poincare/src/absolute_value.cpp b/poincare/src/absolute_value.cpp index dcb428794..a057ae5f0 100644 --- a/poincare/src/absolute_value.cpp +++ b/poincare/src/absolute_value.cpp @@ -20,7 +20,7 @@ Expression AbsoluteValueNode::setSign(Sign s, Context * context, Preferences::Co } Layout AbsoluteValueNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { - return AbsoluteValueLayout(childAtIndex(0)->createLayout(floatDisplayMode, numberOfSignificantDigits)); + return AbsoluteValueLayout::Builder(childAtIndex(0)->createLayout(floatDisplayMode, numberOfSignificantDigits)); } int AbsoluteValueNode::serialize(char * buffer, int bufferSize, Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { @@ -62,7 +62,7 @@ Expression AbsoluteValue::shallowReduce(Context & context, Preferences::ComplexF } else if (!std::isnan(app) && ((c.isNumber() && app < 0.0f) || app <= -Expression::Epsilon())) { // abs(a) = -a with a < 0 (same comment as above to check that a < 0) - Multiplication m(Rational(-1), c); + Multiplication m = Multiplication::Builder(Rational(-1), c); replaceWithInPlace(m); return m.shallowReduce(context, complexFormat, angleUnit, target); } diff --git a/poincare/src/addition.cpp b/poincare/src/addition.cpp index 6a34b2243..73814db1e 100644 --- a/poincare/src/addition.cpp +++ b/poincare/src/addition.cpp @@ -59,7 +59,6 @@ Expression AdditionNode::shallowBeautify(Context & context, Preferences::Complex } // Addition -Addition::Addition() : NAryExpression(TreePool::sharedPool()->createTreeNode()) {} const Number Addition::NumeralFactor(const Expression & e) { if (e.type() == ExpressionNode::Type::Multiplication && e.childAtIndex(0).isNumber()) { @@ -94,7 +93,7 @@ Expression Addition::shallowBeautify(Context & context, Preferences::ComplexForm * In practice, we want to turn "a+(-1)*b" into "a-b". Or, more precisely, any * "a+(-r)*b" into "a-r*b" where r is a positive Rational. * Note: the process will slightly differ if the negative product occurs on - * the first term: we want to turn "AdditionNode(Multiplication(-1,b))" into + * the first term: we want to turn "Addition(Multiplication::Builder(-1,b))" into * "Opposite(b)". * Last but not least, special care must be taken when iterating over children * since we may remove some during the process. */ @@ -115,7 +114,7 @@ Expression Addition::shallowBeautify(Context & context, Preferences::ComplexForm } if (i == 0) { - Opposite o = Opposite(subtractant); + Opposite o = Opposite::Builder(subtractant); replaceChildAtIndexInPlace(i, o); } else { Expression leftSibling = childAtIndex(i-1); @@ -123,7 +122,7 @@ Expression Addition::shallowBeautify(Context & context, Preferences::ComplexForm /* CAUTION: we removed a child. So we need to decrement i to make sure * the next iteration is actually on the next child. */ i--; - Subtraction s = Subtraction(leftSibling, subtractant); + Subtraction s = Subtraction::Builder(leftSibling, subtractant); /* We stole subtractant from this which replaced it by a ghost. We thus * need to put the subtraction at the previous index of subtractant, which * is still i because we updated i after removing a child. */ @@ -262,7 +261,7 @@ Expression Addition::shallowReduce(Context & context, Preferences::ComplexFormat * We can bubble up ComplexCartesian nodes. */ if (allChildrenAreReal(context) == 0) { /* We turn (a+ib)+(c+id) into (a+c)+i(c+d)*/ - Addition imag; // we store all imaginary parts in 'imag' + Addition imag = Addition::Builder(); // we store all imaginary parts in 'imag' Addition real = *this; // we store all real parts in 'real' i = numberOfChildren() - 1; while (i >= 0) { @@ -341,7 +340,7 @@ Expression Addition::factorizeOnCommonDenominator(Context & context, Preferences // We want to turn (a/b+c/d+e/b) into (a*d+b*c+e*d)/(b*d) // Step 1: We want to compute the common denominator, b*d - Multiplication commonDenominator = Multiplication(); + Multiplication commonDenominator; for (int i = 0; i < numberOfChildren(); i++) { Expression currentDenominator = childAtIndex(i).denominator(context, complexFormat, angleUnit); if (!currentDenominator.isUninitialized()) { @@ -356,16 +355,16 @@ Expression Addition::factorizeOnCommonDenominator(Context & context, Preferences /* Step 2: Create the numerator. We start with this being a/b+c/d+e/b and we * want to create numerator = a/b*b*d + c/d*b*d + e/b*b*d = a*d + c*b + e*d */ - Addition numerator = Addition(); + Addition numerator = Addition::Builder(); for (int i = 0; i < numberOfChildren(); i++) { - Multiplication m = Multiplication(childAtIndex(i), commonDenominator.clone()); + Multiplication m = Multiplication::Builder(childAtIndex(i), commonDenominator.clone()); numerator.addChildAtIndexInPlace(m, numerator.numberOfChildren(), numerator.numberOfChildren()); m.privateShallowReduce(context, complexFormat, angleUnit, ExpressionNode::ReductionTarget::User, true, false); } // Step 3: Add the denominator - Power inverseDenominator = Power(commonDenominator, Rational(-1)); - Multiplication result = Multiplication(numerator, inverseDenominator); + Power inverseDenominator = Power::Builder(commonDenominator, Rational(-1)); + Multiplication result = Multiplication::Builder(numerator, inverseDenominator); // Step 4: Simplify the numerator numerator.shallowReduce(context, complexFormat, angleUnit, ExpressionNode::ReductionTarget::User); @@ -396,7 +395,7 @@ void Addition::factorizeChildrenAtIndexesInPlace(int index1, int index2, Context removeChildAtIndexInPlace(index2); // Step 3: Create a multiplication - Multiplication m; + Multiplication m = Multiplication::Builder(); if (e1.type() == ExpressionNode::Type::Multiplication) { m = static_cast(e1); } else { diff --git a/poincare/src/binomial_coefficient.cpp b/poincare/src/binomial_coefficient.cpp index 84ad781fb..72661df33 100644 --- a/poincare/src/binomial_coefficient.cpp +++ b/poincare/src/binomial_coefficient.cpp @@ -19,7 +19,7 @@ Expression BinomialCoefficientNode::shallowReduce(Context & context, Preferences } Layout BinomialCoefficientNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { - return BinomialCoefficientLayout( + return BinomialCoefficientLayout::Builder( childAtIndex(0)->createLayout(floatDisplayMode, numberOfSignificantDigits), childAtIndex(1)->createLayout(floatDisplayMode, numberOfSignificantDigits)); } diff --git a/poincare/src/ceiling.cpp b/poincare/src/ceiling.cpp index 8c28d54d2..cd8ddf05c 100644 --- a/poincare/src/ceiling.cpp +++ b/poincare/src/ceiling.cpp @@ -16,7 +16,7 @@ constexpr Expression::FunctionHelper Ceiling::s_functionHelper; int CeilingNode::numberOfChildren() const { return Ceiling::s_functionHelper.numberOfChildren(); } Layout CeilingNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { - return CeilingLayout(childAtIndex(0)->createLayout(floatDisplayMode, numberOfSignificantDigits)); + return CeilingLayout::Builder(childAtIndex(0)->createLayout(floatDisplayMode, numberOfSignificantDigits)); } int CeilingNode::serialize(char * buffer, int bufferSize, Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { diff --git a/poincare/src/complex_cartesian.cpp b/poincare/src/complex_cartesian.cpp index fc2241a96..65ea33af3 100644 --- a/poincare/src/complex_cartesian.cpp +++ b/poincare/src/complex_cartesian.cpp @@ -106,13 +106,13 @@ Expression ComplexCartesian::squareNorm(Context & context, Preferences::ComplexF factorAndArgumentOfFunction(a, ExpressionNode::Type::Cosine, &aFactor, &aArgument, context, complexFormat, angleUnit, target); factorAndArgumentOfFunction(b, ExpressionNode::Type::Sine, &bFactor, &bArgument, context, complexFormat, angleUnit, target); if (!aFactor.isUninitialized() && !aArgument.isUninitialized() && !bFactor.isUninitialized() && !bArgument.isUninitialized() && aFactor.isIdenticalTo(bFactor) && aArgument.isIdenticalTo(bArgument)) { - Power result(aFactor, Rational(2)); + Power result = Power::Builder(aFactor, Rational(2)); aFactor.shallowReduce(context, complexFormat, angleUnit, target); return result; } - Expression a2 = Power(a, Rational(2)); - Expression b2 = Power(b, Rational(2)); - Addition add(a2, b2); + Expression a2 = Power::Builder(a, Rational(2)); + Expression b2 = Power::Builder(b, Rational(2)); + Addition add = Addition::Builder(a2, b2); a2.shallowReduce(context, complexFormat, angleUnit, target); b2.shallowReduce(context, complexFormat, angleUnit, target); return add; @@ -142,7 +142,7 @@ Expression ComplexCartesian::argument(Context & context, Preferences::ComplexFor if (!b.isRationalZero()) { // if b != 0, argument = sign(b) * Pi/2 - arctan(a/b) // First, compute arctan(a/b) or (Pi/180)*arctan(a/b) - Expression divab = Division(a, b.clone()); + Expression divab = Division::Builder(a, b.clone()); Expression arcTangent = ArcTangent::Builder(divab); divab.shallowReduce(context, complexFormat, angleUnit, target); if (angleUnit == Preferences::AngleUnit::Degree) { @@ -152,18 +152,18 @@ Expression ComplexCartesian::argument(Context & context, Preferences::ComplexFor } // Then, compute sign(b) * Pi/2 - arctan(a/b) Expression signb = SignFunction::Builder(b); - Expression signbPi2 = Multiplication(Rational(1,2), signb, Constant(Ion::Charset::SmallPi)); + Expression signbPi2 = Multiplication::Builder(Rational(1,2), signb, Constant(Ion::Charset::SmallPi)); signb.shallowReduce(context, complexFormat, angleUnit, target); - Expression sub = Subtraction(signbPi2, arcTangent); + Expression sub = Subtraction::Builder(signbPi2, arcTangent); signbPi2.shallowReduce(context, complexFormat, angleUnit, target); arcTangent.shallowReduce(context, complexFormat, angleUnit, target); return sub; } else { // if b == 0, argument = (1-sign(a))*Pi/2 Expression signa = SignFunction::Builder(a).shallowReduce(context, complexFormat, angleUnit, target); - Subtraction sub(Rational(1), signa); + Subtraction sub = Subtraction::Builder(Rational(1), signa); signa.shallowReduce(context, complexFormat, angleUnit, target); - Multiplication mul(Rational(1,2), Constant(Ion::Charset::SmallPi), sub); + Multiplication mul = Multiplication::Builder(Rational(1,2), Constant(Ion::Charset::SmallPi), sub); sub.shallowReduce(context, complexFormat, angleUnit, target); return mul; } @@ -175,14 +175,14 @@ ComplexCartesian ComplexCartesian::inverse(Context & context, Preferences::Compl // 1/(a+ib) = a/(a^2+b^2)+i*(-b/(a^2+b^2)) Expression denominatorReal = clone().convert().squareNorm(context, complexFormat, angleUnit, target); Expression denominatorImag = denominatorReal.clone(); - Expression denominatorRealInv = Power(denominatorReal, Rational(-1)); + Expression denominatorRealInv = Power::Builder(denominatorReal, Rational(-1)); denominatorReal.shallowReduce(context, complexFormat, angleUnit, target); - Expression denominatorImagInv = Power(denominatorImag, Rational(-1)); + Expression denominatorImagInv = Power::Builder(denominatorImag, Rational(-1)); denominatorImag.shallowReduce(context, complexFormat, angleUnit, target); - Multiplication A(a, denominatorRealInv); + Multiplication A = Multiplication::Builder(a, denominatorRealInv); denominatorRealInv.shallowReduce(context, complexFormat, angleUnit, target); - Expression numeratorImag = Multiplication(Rational(-1), b); - Multiplication B(numeratorImag, denominatorImagInv); + Expression numeratorImag = Multiplication::Builder(Rational(-1), b); + Multiplication B = Multiplication::Builder(numeratorImag, denominatorImagInv); numeratorImag.shallowReduce(context, complexFormat, angleUnit, target); denominatorImagInv.shallowReduce(context, complexFormat, angleUnit, target); ComplexCartesian result(A,B); @@ -193,11 +193,11 @@ ComplexCartesian ComplexCartesian::inverse(Context & context, Preferences::Compl Multiplication ComplexCartesian::squareRootHelper(Expression e, Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target) { //(1/2)*sqrt(2*e) - Multiplication doubleE(Rational(2), e); + Multiplication doubleE = Multiplication::Builder(Rational(2), e); e.shallowReduce(context, complexFormat, angleUnit, target); Expression sqrt = SquareRoot::Builder(doubleE); doubleE.shallowReduce(context, complexFormat, angleUnit, target); - Multiplication result(Rational(1,2), sqrt); + Multiplication result = Multiplication::Builder(Rational(1,2), sqrt); sqrt.shallowReduce(context, complexFormat, angleUnit, target); return result; } @@ -210,11 +210,11 @@ ComplexCartesian ComplexCartesian::squareRoot(Context & context, Preferences::Co Expression normA = clone().convert().norm(context, complexFormat, angleUnit, target); Expression normB = normA.clone(); // A = (1/2)*sqrt(2*(sqrt(a^2+b^2)+a)) - Addition normAdda(normA, a.clone()); + Addition normAdda = Addition::Builder(normA, a.clone()); normA.shallowReduce(context, complexFormat, angleUnit, target); Multiplication A = squareRootHelper(normAdda, context, complexFormat, angleUnit, target); // B = B: (1/2)*sqrt(2*(sqrt(a^2+b^2)-a)) - Subtraction normSuba(normB, a); + Subtraction normSuba = Subtraction::Builder(normB, a); normB.shallowReduce(context, complexFormat, angleUnit, target); Multiplication B = squareRootHelper(normSuba, context, complexFormat, angleUnit, target); // B = B: (1/2)*sqrt(2*(sqrt(a^2+b^2)-a))*sign(b) @@ -238,9 +238,9 @@ ComplexCartesian ComplexCartesian::powerInteger(int n, Context & context, Prefer // (b*i)^n = b^n*i^n with i^n == i, -i, 1 or -1 if (a.isRationalZero()) { ComplexCartesian result; - Expression bpow = Power(b, Rational(n)); + Expression bpow = Power::Builder(b, Rational(n)); if (n/2%2 == 1) { - Expression temp = Multiplication(Rational(-1), bpow); + Expression temp = Multiplication::Builder(Rational(-1), bpow); bpow.shallowReduce(context, complexFormat, angleUnit, target); bpow = temp; } @@ -255,16 +255,16 @@ ComplexCartesian ComplexCartesian::powerInteger(int n, Context & context, Prefer // (a+ib) = a^n+i*b*a^(n-1)+(-1)*b^2*a^(n-2)+(-i)*b^3*a^(n-3)+b^3*a^(n-4)+... // Real part: A = a^n+(-1)*b^2*a^(n-2)+... // Imaginary part: B = b*a^(n-1) - Addition A; - Addition B; + Addition A = Addition::Builder(); + Addition B = Addition::Builder(); ComplexCartesian result = ComplexCartesian::Builder(A, B); for (int i = 0; i <= n; i++) { BinomialCoefficient binom = BinomialCoefficient::Builder(Rational(n), Rational(i)); Expression aclone = i == n ? a : a.clone(); Expression bclone = i == n ? b : b.clone(); - Power apow(aclone, Rational(n-i)); - Power bpow(bclone, Rational(i)); - Multiplication m(binom, apow, bpow); + Power apow = Power::Builder(aclone, Rational(n-i)); + Power bpow = Power::Builder(bclone, Rational(i)); + Multiplication m = Multiplication::Builder(binom, apow, bpow); binom.shallowReduce(); apow.shallowReduce(context, complexFormat, angleUnit, target); bpow.shallowReduce(context, complexFormat, angleUnit, target); @@ -294,15 +294,15 @@ ComplexCartesian ComplexCartesian::multiply(ComplexCartesian & other, Context & Expression d = other.imag(); // (a+ib) * (c+id) = (ac-bd)+i*(ad+bc) // Compute ac-bd - Expression ac = Multiplication(a.clone(), c.clone()); - Expression bd = Multiplication(b.clone(), d.clone()); - Subtraction A(ac, bd); + Expression ac = Multiplication::Builder(a.clone(), c.clone()); + Expression bd = Multiplication::Builder(b.clone(), d.clone()); + Subtraction A = Subtraction::Builder(ac, bd); ac.shallowReduce(context, complexFormat, angleUnit, target); bd.shallowReduce(context, complexFormat, angleUnit, target); // Compute ad+bc - Expression ad = Multiplication(a, d); - Expression bc = Multiplication(b, c); - Addition B(ad, bc); + Expression ad = Multiplication::Builder(a, d); + Expression bc = Multiplication::Builder(b, c); + Addition B = Addition::Builder(ad, bc); ad.shallowReduce(context, complexFormat, angleUnit, target); bc.shallowReduce(context, complexFormat, angleUnit, target); ComplexCartesian result = ComplexCartesian::Builder(A, B); @@ -312,7 +312,7 @@ ComplexCartesian ComplexCartesian::multiply(ComplexCartesian & other, Context & } Expression ComplexCartesian::powerHelper(Expression norm, Expression trigo, Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target) { - Multiplication m(norm, trigo); + Multiplication m = Multiplication::Builder(norm, trigo); norm.shallowReduce(context, complexFormat, angleUnit, target); trigo.shallowReduce(context, complexFormat, angleUnit, target); return m; @@ -326,24 +326,24 @@ ComplexCartesian ComplexCartesian::power(ComplexCartesian & other, Context & con Expression c = other.real(); Expression d = other.imag(); // R = r^c*e^(-th*d) - Expression rpowc = Power(rclone, c.clone()); + Expression rpowc = Power::Builder(rclone, c.clone()); rclone.shallowReduce(context, complexFormat, angleUnit, target); - Expression thmuld = Multiplication(Rational(-1), thclone, d.clone()); + Expression thmuld = Multiplication::Builder(Rational(-1), thclone, d.clone()); thclone.shallowReduce(context, complexFormat, angleUnit, target); - Expression exp = Power(Constant(Ion::Charset::Exponential), thmuld); + Expression exp = Power::Builder(Constant(Ion::Charset::Exponential), thmuld); thmuld.shallowReduce(context, complexFormat, angleUnit, target); - Multiplication norm(rpowc, exp); + Multiplication norm = Multiplication::Builder(rpowc, exp); rpowc.shallowReduce(context, complexFormat, angleUnit, target); exp.shallowReduce(context, complexFormat, angleUnit, target); // TH = d*ln(r)+c*th Expression lnr = NaperianLogarithm::Builder(r); r.shallowReduce(context, complexFormat, angleUnit, target); - Multiplication dlnr(d, lnr); + Multiplication dlnr = Multiplication::Builder(d, lnr); lnr.shallowReduce(context, complexFormat, angleUnit, target); - Multiplication thc(th, c); + Multiplication thc = Multiplication::Builder(th, c); th.shallowReduce(context, complexFormat, angleUnit, target); - Expression argument = Addition(thc, dlnr); + Expression argument = Addition::Builder(thc, dlnr); thc.shallowReduce(context, complexFormat, angleUnit, target); dlnr.shallowReduce(context, complexFormat, angleUnit, target); diff --git a/poincare/src/condensed_sum_layout.cpp b/poincare/src/condensed_sum_layout.cpp index 68a74e188..3204fe357 100644 --- a/poincare/src/condensed_sum_layout.cpp +++ b/poincare/src/condensed_sum_layout.cpp @@ -37,12 +37,4 @@ KDPoint CondensedSumLayoutNode::positionOfChild(LayoutNode * child) { return KDPoint(x,y); } -CondensedSumLayout::CondensedSumLayout(Layout base, Layout subscript, Layout superscript) : - Layout(TreePool::sharedPool()->createTreeNode()) -{ - replaceChildAtIndexInPlace(0, base); - replaceChildAtIndexInPlace(1, subscript); - replaceChildAtIndexInPlace(2, superscript); -} - -} +} \ No newline at end of file diff --git a/poincare/src/confidence_interval.cpp b/poincare/src/confidence_interval.cpp index 1bf839197..c56b756a2 100644 --- a/poincare/src/confidence_interval.cpp +++ b/poincare/src/confidence_interval.cpp @@ -88,10 +88,10 @@ Expression ConfidenceInterval::shallowReduce(Context & context, Preferences::Com Rational r0 = static_cast(c0); Rational r1 = static_cast(c1); // Compute [r0-1/sqr(r1), r0+1/sqr(r1)] - Expression sqr = Power(r1, Rational(-1, 2)); - Matrix matrix; - matrix.addChildAtIndexInPlace(Addition(r0.clone(), Multiplication(Rational(-1), sqr.clone())), 0, 0); - matrix.addChildAtIndexInPlace(Addition(r0, sqr), 1, 1); + Expression sqr = Power::Builder(r1, Rational(-1, 2)); + Matrix matrix = Matrix::Builder(); + matrix.addChildAtIndexInPlace(Addition::Builder(r0.clone(), Multiplication::Builder(Rational(-1), sqr.clone())), 0, 0); + matrix.addChildAtIndexInPlace(Addition::Builder(r0, sqr), 1, 1); matrix.setDimensions(1, 2); replaceWithInPlace(matrix); matrix.deepReduceChildren(context, complexFormat, angleUnit, target); diff --git a/poincare/src/conjugate.cpp b/poincare/src/conjugate.cpp index 1b4467812..27ed8cc88 100644 --- a/poincare/src/conjugate.cpp +++ b/poincare/src/conjugate.cpp @@ -16,7 +16,7 @@ constexpr Expression::FunctionHelper Conjugate::s_functionHelper; int ConjugateNode::numberOfChildren() const { return Conjugate::s_functionHelper.numberOfChildren(); } Layout ConjugateNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { - return ConjugateLayout(childAtIndex(0)->createLayout(floatDisplayMode, numberOfSignificantDigits)); + return ConjugateLayout::Builder(childAtIndex(0)->createLayout(floatDisplayMode, numberOfSignificantDigits)); } int ConjugateNode::serialize(char * buffer, int bufferSize, Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { @@ -51,7 +51,7 @@ Expression Conjugate::shallowReduce(Context & context, Preferences::ComplexForma } if (c.type() == ExpressionNode::Type::ComplexCartesian) { ComplexCartesian complexChild = static_cast(c); - Multiplication m(Rational(-1), complexChild.imag()); + Multiplication m = Multiplication::Builder(Rational(-1), complexChild.imag()); complexChild.replaceChildAtIndexInPlace(1, m); m.shallowReduce(context, complexFormat, angleUnit, target); replaceWithInPlace(complexChild); diff --git a/poincare/src/decimal.cpp b/poincare/src/decimal.cpp index ebb6e2246..8272a2a79 100644 --- a/poincare/src/decimal.cpp +++ b/poincare/src/decimal.cpp @@ -378,7 +378,7 @@ Expression Decimal::shallowReduce() { Expression Decimal::shallowBeautify() { if (sign() == ExpressionNode::Sign::Negative) { Expression abs = setSign(ExpressionNode::Sign::Positive); - Opposite o; + Opposite o = Opposite::Builder(); replaceWithInPlace(o); o.replaceChildAtIndexInPlace(0, abs); return o; diff --git a/poincare/src/division.cpp b/poincare/src/division.cpp index 9f57e8286..48c6734c1 100644 --- a/poincare/src/division.cpp +++ b/poincare/src/division.cpp @@ -35,7 +35,7 @@ bool DivisionNode::childNeedsParenthesis(const TreeNode * child) const { Layout DivisionNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { const ExpressionNode * numerator = childAtIndex(0)->type() == Type::Parenthesis ? childAtIndex(0)->childAtIndex(0) : childAtIndex(0); const ExpressionNode * denominator = childAtIndex(1)->type() == Type::Parenthesis ? childAtIndex(1)->childAtIndex(0) : childAtIndex(1); - return FractionLayout(numerator->createLayout(floatDisplayMode, numberOfSignificantDigits), denominator->createLayout(floatDisplayMode, numberOfSignificantDigits)); + return FractionLayout::Builder(numerator->createLayout(floatDisplayMode, numberOfSignificantDigits), denominator->createLayout(floatDisplayMode, numberOfSignificantDigits)); } int DivisionNode::serialize(char * buffer, int bufferSize, Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { @@ -70,8 +70,6 @@ template MatrixComplex DivisionNode::computeOnMatrices(const Matr // Division -Division::Division() : Expression(TreePool::sharedPool()->createTreeNode()) {} - Expression Division::shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target) { { Expression e = Expression::defaultShallowReduce(); @@ -79,9 +77,9 @@ Expression Division::shallowReduce(Context & context, Preferences::ComplexFormat return e; } } - Expression p = Power(childAtIndex(1), Rational(-1)); - Multiplication m = Multiplication(childAtIndex(0), p); - p.shallowReduce(context, complexFormat, angleUnit, target); // Imagine Division(2,1). p would be 1^(-1) which can be simplified + Expression p = Power::Builder(childAtIndex(1), Rational(-1)); + Multiplication m = Multiplication::Builder(childAtIndex(0), p); + p.shallowReduce(context, complexFormat, angleUnit, target); // Imagine Division::Builder(2,1). p would be 1^(-1) which can be simplified replaceWithInPlace(m); return m.shallowReduce(context, complexFormat, angleUnit, target); } diff --git a/poincare/src/equal.cpp b/poincare/src/equal.cpp index ccb105e1a..dbcb1abaa 100644 --- a/poincare/src/equal.cpp +++ b/poincare/src/equal.cpp @@ -25,7 +25,7 @@ Expression EqualNode::shallowReduce(Context & context, Preferences::ComplexForma } Layout EqualNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { - HorizontalLayout result; + HorizontalLayout result = HorizontalLayout::Builder(); result.addOrMergeChildAtIndex(childAtIndex(0)->createLayout(floatDisplayMode, numberOfSignificantDigits), 0, false); result.addChildAtIndex(CharLayout('='), result.numberOfChildren(), result.numberOfChildren(), nullptr); result.addOrMergeChildAtIndex(childAtIndex(1)->createLayout(floatDisplayMode, numberOfSignificantDigits), result.numberOfChildren(), false); @@ -42,7 +42,7 @@ Evaluation EqualNode::templatedApproximate(Context& context, Preferences::Com } Expression Equal::standardEquation(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const { - Expression sub = Subtraction(childAtIndex(0).clone(), childAtIndex(1).clone()); + Expression sub = Subtraction::Builder(childAtIndex(0).clone(), childAtIndex(1).clone()); return sub.reduce(context, complexFormat, angleUnit); } diff --git a/poincare/src/expression.cpp b/poincare/src/expression.cpp index cf1b1bbaf..544814670 100644 --- a/poincare/src/expression.cpp +++ b/poincare/src/expression.cpp @@ -184,7 +184,7 @@ bool Expression::getLinearCoefficients(char * variables, int maxVariableSize, Ex equation = polynomialCoefficients[0]; index++; } - constant[0] = Opposite(equation.clone()).reduce(context, complexFormat, angleUnit); + constant[0] = Opposite::Builder(equation.clone()).reduce(context, complexFormat, angleUnit); /* The expression can be linear on all coefficients taken one by one but * non-linear (ex: xy = 2). We delete the results and return false if one of * the coefficients contains a variable. */ @@ -519,12 +519,12 @@ Expression Expression::ExpressionWithoutSymbols(Expression e, Context & context) Expression Expression::radianToDegree() { // e*180/Pi - return Multiplication(*this, Rational(180), Power(Constant(Ion::Charset::SmallPi), Rational(-1))); + return Multiplication::Builder(*this, Rational(180), Power::Builder(Constant(Ion::Charset::SmallPi), Rational(-1))); } Expression Expression::degreeToRadian() { // e*Pi/180 - return Multiplication(*this, Rational(1, 180), Constant(Ion::Charset::SmallPi)); + return Multiplication::Builder(*this, Rational(1, 180), Constant(Ion::Charset::SmallPi)); } Expression Expression::reduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) { @@ -619,7 +619,7 @@ Expression Expression::CreateComplexExpression(Expression ra, Expression tb, Pre Expression imag; if (!isZeroRa || isZeroTb) { if (isNegativeRa) { - real = Opposite(ra); + real = Opposite::Builder(ra); } else { real = ra; } @@ -628,21 +628,21 @@ Expression Expression::CreateComplexExpression(Expression ra, Expression tb, Pre if (isOneTb) { imag = Constant(Ion::Charset::IComplex); } else { - imag = Multiplication(tb , Constant(Ion::Charset::IComplex)); + imag = Multiplication::Builder(tb , Constant(Ion::Charset::IComplex)); } } if (imag.isUninitialized()) { return real; } else if (real.isUninitialized()) { if (isNegativeTb) { - return Opposite(imag); + return Opposite::Builder(imag); } else { return imag; } } else if (isNegativeTb) { - return Subtraction(real, imag); + return Subtraction::Builder(real, imag); } else { - return Addition(real, imag); + return Addition::Builder(real, imag); } } default: @@ -659,19 +659,19 @@ Expression Expression::CreateComplexExpression(Expression ra, Expression tb, Pre if (isOneTb) { arg = Constant(Ion::Charset::IComplex); } else { - arg = Multiplication(tb, Constant(Ion::Charset::IComplex)); + arg = Multiplication::Builder(tb, Constant(Ion::Charset::IComplex)); } if (isNegativeTb) { - arg = Opposite(arg); + arg = Opposite::Builder(arg); } - exp = Power(Constant(Ion::Charset::Exponential), arg); + exp = Power::Builder(Constant(Ion::Charset::Exponential), arg); } if (exp.isUninitialized()) { return norm; } else if (norm.isUninitialized()) { return exp; } else { - return Multiplication(norm, exp); + return Multiplication::Builder(norm, exp); } } } diff --git a/poincare/src/factor.cpp b/poincare/src/factor.cpp index 0f9ae90a3..d303b3a06 100644 --- a/poincare/src/factor.cpp +++ b/poincare/src/factor.cpp @@ -56,10 +56,10 @@ Expression Factor::shallowBeautify(Context & context, Preferences::ComplexFormat replaceWithInPlace(result); return result; } - result = Division(result, denominatorDecomp.squashUnaryHierarchyInPlace()); + result = Division::Builder(result, denominatorDecomp.squashUnaryHierarchyInPlace()); } if (r.sign() == ExpressionNode::Sign::Negative) { - result = Opposite(result); + result = Opposite::Builder(result); } replaceWithInPlace(result); return result; @@ -68,7 +68,7 @@ Expression Factor::shallowBeautify(Context & context, Preferences::ComplexFormat Multiplication Factor::createMultiplicationOfIntegerPrimeDecomposition(Integer i, Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const { assert(!i.isZero()); assert(!i.isNegative()); - Multiplication m; + Multiplication m = Multiplication::Builder(); Integer factors[Arithmetic::k_maxNumberOfPrimeFactors]; Integer coefficients[Arithmetic::k_maxNumberOfPrimeFactors]; int numberOfPrimeFactors = Arithmetic::PrimeFactorization(i, factors, coefficients, Arithmetic::k_maxNumberOfPrimeFactors); @@ -83,7 +83,7 @@ Multiplication Factor::createMultiplicationOfIntegerPrimeDecomposition(Integer i for (int index = 0; index < numberOfPrimeFactors; index++) { Expression factor = Rational(factors[index]); if (!coefficients[index].isOne()) { - factor = Power(factor, Rational(coefficients[index])); + factor = Power::Builder(factor, Rational(coefficients[index])); } m.addChildAtIndexInPlace(factor, m.numberOfChildren(), m.numberOfChildren()); } diff --git a/poincare/src/factorial.cpp b/poincare/src/factorial.cpp index 289c504ab..94a03f10b 100644 --- a/poincare/src/factorial.cpp +++ b/poincare/src/factorial.cpp @@ -59,7 +59,7 @@ Complex FactorialNode::computeOnComplex(const std::complex c, Preferences: } Layout FactorialNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { - HorizontalLayout result; + HorizontalLayout result = HorizontalLayout::Builder(); result.addOrMergeChildAtIndex(childAtIndex(0)->createLayout(floatDisplayMode, numberOfSignificantDigits), 0, false); int childrenCount = result.numberOfChildren(); result.addChildAtIndex(CharLayout('!'), childrenCount, childrenCount, nullptr); @@ -89,8 +89,6 @@ int FactorialNode::serialize(char * buffer, int bufferSize, Preferences::PrintFl return numberOfChar; } -Factorial::Factorial() : Expression(TreePool::sharedPool()->createTreeNode()) {} - Expression Factorial::shallowReduce() { { Expression e = Expression::defaultShallowReduce(); @@ -133,7 +131,7 @@ Expression Factorial::shallowBeautify() { || childAtIndex(0).type() == ExpressionNode::Type::Multiplication || childAtIndex(0).type() == ExpressionNode::Type::Power) { - Expression result = Factorial(Parenthesis(childAtIndex(0))); + Expression result = Factorial::Builder(Parenthesis::Builder(childAtIndex(0))); replaceWithInPlace(result); return result; } diff --git a/poincare/src/floor.cpp b/poincare/src/floor.cpp index 94ef4d3f4..8694f4509 100644 --- a/poincare/src/floor.cpp +++ b/poincare/src/floor.cpp @@ -16,7 +16,7 @@ constexpr Expression::FunctionHelper Floor::s_functionHelper; int FloorNode::numberOfChildren() const { return Floor::s_functionHelper.numberOfChildren(); } Layout FloorNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { - return FloorLayout(childAtIndex(0)->createLayout(floatDisplayMode, numberOfSignificantDigits)); + return FloorLayout::Builder(childAtIndex(0)->createLayout(floatDisplayMode, numberOfSignificantDigits)); } int FloorNode::serialize(char * buffer, int bufferSize, Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { diff --git a/poincare/src/fraction_layout.cpp b/poincare/src/fraction_layout.cpp index da2053c95..f18e88600 100644 --- a/poincare/src/fraction_layout.cpp +++ b/poincare/src/fraction_layout.cpp @@ -216,11 +216,4 @@ void FractionLayoutNode::render(KDContext * ctx, KDPoint p, KDColor expressionCo ctx->fillRect(KDRect(p.x()+Metric::FractionAndConjugateHorizontalMargin, fractionLineY, layoutSize().width()-2*Metric::FractionAndConjugateHorizontalMargin, k_fractionLineHeight), expressionColor); } -FractionLayout::FractionLayout(Layout numerator, Layout denominator) : - Layout(TreePool::sharedPool()->createTreeNode()) -{ - replaceChildAtIndexInPlace(0, numerator); - replaceChildAtIndexInPlace(1, denominator); -} - -} +} \ No newline at end of file diff --git a/poincare/src/function.cpp b/poincare/src/function.cpp index 5ad9a6cbe..1eada76cb 100644 --- a/poincare/src/function.cpp +++ b/poincare/src/function.cpp @@ -105,7 +105,7 @@ Expression Function::replaceSymbolWithExpression(const SymbolAbstract & symbol, value = value.replaceSymbolWithExpression(xSymbol, xValue); Expression p = parent(); if (!p.isUninitialized() && p.node()->childNeedsParenthesis(value.node())) { - value = Parenthesis(value); + value = Parenthesis::Builder(value); } replaceWithInPlace(value); return value; diff --git a/poincare/src/horizontal_layout.cpp b/poincare/src/horizontal_layout.cpp index d3ad2c1d6..871ff5af3 100644 --- a/poincare/src/horizontal_layout.cpp +++ b/poincare/src/horizontal_layout.cpp @@ -226,7 +226,7 @@ KDPoint HorizontalLayoutNode::positionOfChild(LayoutNode * l) { bool HorizontalLayoutNode::willAddChildAtIndex(LayoutNode * l, int * index, int * currentNumberOfChildren, LayoutCursor * cursor) { if (m_numberOfChildren > 0) { - HorizontalLayout thisRef = HorizontalLayout(this); + HorizontalLayout thisRef(this); thisRef.removeEmptyChildBeforeInsertionAtIndex(index, currentNumberOfChildren, !l->mustHaveLeftSibling(), cursor); *currentNumberOfChildren = thisRef.numberOfChildren(); } @@ -353,33 +353,6 @@ bool HorizontalLayoutNode::willReplaceChild(LayoutNode * oldChild, LayoutNode * // HorizontalLayout -HorizontalLayout::HorizontalLayout() : Layout(TreePool::sharedPool()->createTreeNode()) {} - -HorizontalLayout::HorizontalLayout(Layout l) : HorizontalLayout() { - addChildAtIndexInPlace(l, 0, 0); -} - -HorizontalLayout::HorizontalLayout(Layout l1, Layout l2) : HorizontalLayout() { - addChildAtIndexInPlace(l1, 0, 0); - addChildAtIndexInPlace(l2, 1, 1); -} -HorizontalLayout::HorizontalLayout(Layout l1, Layout l2, Layout l3) : HorizontalLayout() { - addChildAtIndexInPlace(l1, 0, 0); - addChildAtIndexInPlace(l2, 1, 1); - addChildAtIndexInPlace(l3, 2, 2); -} -HorizontalLayout::HorizontalLayout(Layout l1, Layout l2, Layout l3, Layout l4) : HorizontalLayout() { - addChildAtIndexInPlace(l1, 0, 0); - addChildAtIndexInPlace(l2, 1, 1); - addChildAtIndexInPlace(l3, 2, 2); - addChildAtIndexInPlace(l4, 3, 3); -} -HorizontalLayout::HorizontalLayout(const Layout * children, size_t numberOfChildren) : HorizontalLayout() { - for (size_t i = 0; i < numberOfChildren; i++) { - addChildAtIndexInPlace(children[i], i, i); - } -} - void HorizontalLayout::addOrMergeChildAtIndex(Layout l, int index, bool removeEmptyChildren, LayoutCursor * cursor) { if (l.isHorizontal()) { mergeChildrenAtIndex(HorizontalLayout(static_cast(l.node())), index, removeEmptyChildren, cursor); diff --git a/poincare/src/integral.cpp b/poincare/src/integral.cpp index 77e59259f..00d64baad 100644 --- a/poincare/src/integral.cpp +++ b/poincare/src/integral.cpp @@ -33,7 +33,7 @@ Expression IntegralNode::replaceUnknown(const Symbol & symbol) { } Layout IntegralNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { - return IntegralLayout( + return IntegralLayout::Builder( childAtIndex(0)->createLayout(floatDisplayMode, numberOfSignificantDigits), childAtIndex(1)->createLayout(floatDisplayMode, numberOfSignificantDigits), childAtIndex(2)->createLayout(floatDisplayMode, numberOfSignificantDigits), diff --git a/poincare/src/layout.cpp b/poincare/src/layout.cpp index fb43bfa2e..da2c66c5e 100644 --- a/poincare/src/layout.cpp +++ b/poincare/src/layout.cpp @@ -97,7 +97,7 @@ void Layout::replaceWithJuxtapositionOf(Layout leftChild, Layout rightChild, Lay if (!p.isHorizontal()) { /* One of the children to juxtapose might be "this", so we cannot just call * replaceWith. */ - HorizontalLayout horizontalLayoutR; + HorizontalLayout horizontalLayoutR = HorizontalLayout::Builder(); p.replaceChild(*this, horizontalLayoutR, cursor); horizontalLayoutR.addOrMergeChildAtIndex(leftChild, 0, false); if (putCursorInTheMiddle) { @@ -286,7 +286,7 @@ void Layout::collapseSiblings(LayoutCursor * cursor) { if (node()->shouldCollapseSiblingsOnRight()) { Layout absorbingChild = childAtIndex(rightCollapsingAbsorbingChildIndex()); if (!absorbingChild.isHorizontal()) { - Layout horRef = HorizontalLayout(); + Layout horRef = HorizontalLayout::Builder(); replaceChild(absorbingChild, horRef, cursor, true); horRef.addChildAtIndexInPlace(absorbingChild, 0, 0); } @@ -295,7 +295,7 @@ void Layout::collapseSiblings(LayoutCursor * cursor) { if (node()->shouldCollapseSiblingsOnLeft()) { Layout absorbingChild = childAtIndex(leftCollapsingAbsorbingChildIndex()); if (!absorbingChild.isHorizontal()) { - Layout horRef = HorizontalLayout(); + Layout horRef = HorizontalLayout::Builder(); replaceChild(absorbingChild, horRef, cursor, true); horRef.addChildAtIndexInPlace(absorbingChild, 0, 0); } diff --git a/poincare/src/layout_cursor.cpp b/poincare/src/layout_cursor.cpp index 77a39a976..22a7915b4 100644 --- a/poincare/src/layout_cursor.cpp +++ b/poincare/src/layout_cursor.cpp @@ -74,15 +74,15 @@ void LayoutCursor::move(MoveDirection direction, bool * shouldRecomputeLayout) { void LayoutCursor::addEmptyExponentialLayout() { EmptyLayout emptyLayout; - HorizontalLayout sibling = HorizontalLayout( + HorizontalLayout sibling = HorizontalLayout::Builder( CharLayout(Ion::Charset::Exponential), - VerticalOffsetLayout(emptyLayout, VerticalOffsetLayoutNode::Type::Superscript)); + VerticalOffsetLayout::Builder(emptyLayout, VerticalOffsetLayoutNode::Type::Superscript)); m_layout.addSibling(this, sibling, false); m_layout = emptyLayout; } void LayoutCursor::addEmptyMatrixLayout() { - MatrixLayout matrixLayout = MatrixLayout( + MatrixLayout matrixLayout = MatrixLayout::Builder( EmptyLayout(EmptyLayoutNode::Color::Yellow), EmptyLayout(EmptyLayoutNode::Color::Grey), EmptyLayout(EmptyLayoutNode::Color::Grey), @@ -93,31 +93,31 @@ void LayoutCursor::addEmptyMatrixLayout() { } void LayoutCursor::addEmptySquareRootLayout() { - HorizontalLayout child1 = HorizontalLayout(EmptyLayout()); - NthRootLayout newChild = NthRootLayout(child1); + HorizontalLayout child1 = HorizontalLayout::Builder(EmptyLayout()); + NthRootLayout newChild = NthRootLayout::Builder(child1); m_layout.addSibling(this, newChild, false); m_layout = newChild.childAtIndex(0); ((Layout *)&newChild)->collapseSiblings(this); } void LayoutCursor::addEmptyPowerLayout() { - VerticalOffsetLayout offsetLayout = VerticalOffsetLayout(EmptyLayout(), VerticalOffsetLayoutNode::Type::Superscript); + VerticalOffsetLayout offsetLayout = VerticalOffsetLayout::Builder(EmptyLayout(), VerticalOffsetLayoutNode::Type::Superscript); privateAddEmptyPowerLayout(offsetLayout); m_layout = offsetLayout.childAtIndex(0); } void LayoutCursor::addEmptySquarePowerLayout() { - VerticalOffsetLayout offsetLayout = VerticalOffsetLayout(CharLayout('2'), VerticalOffsetLayoutNode::Type::Superscript); + VerticalOffsetLayout offsetLayout = VerticalOffsetLayout::Builder(CharLayout('2'), VerticalOffsetLayoutNode::Type::Superscript); privateAddEmptyPowerLayout(offsetLayout); } void LayoutCursor::addEmptyTenPowerLayout() { EmptyLayout emptyLayout; - HorizontalLayout sibling = HorizontalLayout( + HorizontalLayout sibling = HorizontalLayout::Builder( CharLayout(Ion::Charset::MiddleDot), CharLayout('1'), CharLayout('0'), - VerticalOffsetLayout( + VerticalOffsetLayout::Builder( emptyLayout, VerticalOffsetLayoutNode::Type::Superscript)); m_layout.addSibling(this, sibling, false); @@ -125,9 +125,9 @@ void LayoutCursor::addEmptyTenPowerLayout() { } void LayoutCursor::addFractionLayoutAndCollapseSiblings() { - HorizontalLayout child1 = HorizontalLayout(EmptyLayout()); - HorizontalLayout child2 = HorizontalLayout(EmptyLayout()); - FractionLayout newChild = FractionLayout(child1, child2); + HorizontalLayout child1 = HorizontalLayout::Builder(EmptyLayout()); + HorizontalLayout child2 = HorizontalLayout::Builder(EmptyLayout()); + FractionLayout newChild = FractionLayout::Builder(child1, child2); m_layout.addSibling(this, newChild, true); Layout(newChild.node()).collapseSiblings(this); } @@ -150,12 +150,12 @@ void LayoutCursor::insertText(const char * text) { if (text[i] == Ion::Charset::MultiplicationSign) { newChild = CharLayout(Ion::Charset::MiddleDot); } else if (text[i] == '(') { - newChild = LeftParenthesisLayout(); + newChild = LeftParenthesisLayout::Builder(); if (pointedChild.isUninitialized()) { pointedChild = newChild; } } else if (text[i] == ')') { - newChild = RightParenthesisLayout(); + newChild = RightParenthesisLayout::Builder(); } /* We never insert text with brackets for now. Removing this code saves the * binary file 2K. */ @@ -218,7 +218,7 @@ void LayoutCursor::privateAddEmptyPowerLayout(VerticalOffsetLayout v) { } // Else, add an empty base EmptyLayout e = EmptyLayout(); - HorizontalLayout newChild = HorizontalLayout(e, v); + HorizontalLayout newChild = HorizontalLayout::Builder(e, v); m_layout.addSibling(this, newChild, true); } diff --git a/poincare/src/layout_helper.cpp b/poincare/src/layout_helper.cpp index 750bfe098..9d7c584a6 100644 --- a/poincare/src/layout_helper.cpp +++ b/poincare/src/layout_helper.cpp @@ -11,7 +11,7 @@ namespace Poincare { Layout LayoutHelper::Infix(const Expression & expression, Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits, const char * operatorName) { int numberOfChildren = expression.numberOfChildren(); assert(numberOfChildren > 1); - HorizontalLayout result; + HorizontalLayout result = HorizontalLayout::Builder(); result.addOrMergeChildAtIndex(expression.childAtIndex(0).createLayout(floatDisplayMode, numberOfSignificantDigits), 0, true); for (int i = 1; i < numberOfChildren; i++) { result.addOrMergeChildAtIndex(String(operatorName, strlen(operatorName)), result.numberOfChildren(), true); @@ -24,12 +24,12 @@ Layout LayoutHelper::Infix(const Expression & expression, Preferences::PrintFloa } Layout LayoutHelper::Prefix(const Expression & expression, Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits, const char * operatorName) { - HorizontalLayout result; + HorizontalLayout result = HorizontalLayout::Builder(); // Add the operator name. result.addOrMergeChildAtIndex(String(operatorName, strlen(operatorName)), 0, true); // Create the layout of arguments separated by commas. - HorizontalLayout args; + HorizontalLayout args = HorizontalLayout::Builder(); int numberOfChildren = expression.numberOfChildren(); if (numberOfChildren > 0) { args.addOrMergeChildAtIndex(expression.childAtIndex(0).createLayout(floatDisplayMode, numberOfSignificantDigits), 0, true); @@ -44,18 +44,18 @@ Layout LayoutHelper::Prefix(const Expression & expression, Preferences::PrintFlo } Layout LayoutHelper::Parentheses(Layout layout, bool cloneLayout) { - HorizontalLayout result; - result.addChildAtIndex(LeftParenthesisLayout(), 0, 0, nullptr); + HorizontalLayout result = HorizontalLayout::Builder(); + result.addChildAtIndex(LeftParenthesisLayout::Builder(), 0, 0, nullptr); if (!layout.isUninitialized()) { result.addOrMergeChildAtIndex(cloneLayout ? layout.clone() : layout, 1, true); } - result.addChildAtIndex(RightParenthesisLayout(), result.numberOfChildren(), result.numberOfChildren(), nullptr); + result.addChildAtIndex(RightParenthesisLayout::Builder(), result.numberOfChildren(), result.numberOfChildren(), nullptr); return result; } HorizontalLayout LayoutHelper::String(const char * buffer, int bufferLen, const KDFont * font) { assert(bufferLen > 0); - HorizontalLayout resultLayout; + HorizontalLayout resultLayout = HorizontalLayout::Builder(); for (int i = 0; i < bufferLen; i++) { resultLayout.addChildAtIndex(CharLayout(buffer[i], font), i, i, nullptr); } @@ -64,7 +64,7 @@ HorizontalLayout LayoutHelper::String(const char * buffer, int bufferLen, const Layout LayoutHelper::Logarithm(Layout argument, Layout index) { HorizontalLayout resultLayout = String("log", 3); - VerticalOffsetLayout offsetLayout = VerticalOffsetLayout(index, VerticalOffsetLayoutNode::Type::Subscript); + VerticalOffsetLayout offsetLayout = VerticalOffsetLayout::Builder(index, VerticalOffsetLayoutNode::Type::Subscript); resultLayout.addChildAtIndex(offsetLayout, resultLayout.numberOfChildren(), resultLayout.numberOfChildren(), nullptr); resultLayout.addOrMergeChildAtIndex(Parentheses(argument, false), resultLayout.numberOfChildren(), true); return resultLayout; diff --git a/poincare/src/left_parenthesis_layout.cpp b/poincare/src/left_parenthesis_layout.cpp index 150af8b98..8ddd2dea5 100644 --- a/poincare/src/left_parenthesis_layout.cpp +++ b/poincare/src/left_parenthesis_layout.cpp @@ -59,6 +59,4 @@ void LeftParenthesisLayoutNode::render(KDContext * ctx, KDPoint p, KDColor expre RenderWithChildHeight(ParenthesisLayoutNode::ChildHeightGivenLayoutHeight(layoutSize().height()), ctx, p, expressionColor, backgroundColor); } -LeftParenthesisLayout::LeftParenthesisLayout() : Layout(TreePool::sharedPool()->createTreeNode()) {} - } diff --git a/poincare/src/left_square_bracket_layout.cpp b/poincare/src/left_square_bracket_layout.cpp index b380e9b8c..2a8d85c92 100644 --- a/poincare/src/left_square_bracket_layout.cpp +++ b/poincare/src/left_square_bracket_layout.cpp @@ -8,6 +8,4 @@ void LeftSquareBracketLayoutNode::render(KDContext * ctx, KDPoint p, KDColor exp ctx->fillRect(KDRect(p.x()+k_externWidthMargin, p.y() + childHeight(), k_bracketWidth, k_lineThickness), expressionColor); } -LeftSquareBracketLayout::LeftSquareBracketLayout() : Layout(TreePool::sharedPool()->createTreeNode()) {} - } diff --git a/poincare/src/logarithm.cpp b/poincare/src/logarithm.cpp index e812c4a39..9e69d9de8 100644 --- a/poincare/src/logarithm.cpp +++ b/poincare/src/logarithm.cpp @@ -160,7 +160,7 @@ Expression Logarithm::shallowReduce(Context & context, Preferences::ComplexForma Expression x = p.childAtIndex(0); Expression y = p.childAtIndex(1); replaceChildInPlace(p, x); - Multiplication mult(y); + Multiplication mult = Multiplication::Builder(y); replaceWithInPlace(mult); mult.addChildAtIndexInPlace(*this, 1, 1); // --> y*log(x,b) shallowReduce(context, complexFormat, angleUnit, target); // reduce log (ie log(e, e) = 1) @@ -168,7 +168,7 @@ Expression Logarithm::shallowReduce(Context & context, Preferences::ComplexForma } // log(x*y, b)->log(x,b)+log(y, b) if x,y>0 if (!letLogAtRoot && c.type() == ExpressionNode::Type::Multiplication) { - Addition a = Addition(); + Addition a = Addition::Builder(); for (int i = 0; i < c.numberOfChildren()-1; i++) { Expression factor = c.childAtIndex(i); if (factor.sign(&context) == ExpressionNode::Sign::Positive) { @@ -190,7 +190,7 @@ Expression Logarithm::shallowReduce(Context & context, Preferences::ComplexForma // log(r) with r Rational if (!letLogAtRoot && c.type() == ExpressionNode::Type::Rational) { Rational r = static_cast(c); - Addition a; + Addition a = Addition::Builder(); // if the log base is Integer: log_b(r) = c + log_b(r') with r = b^c*r' if (childAtIndex(1).type() == ExpressionNode::Type::Rational && childAtIndex(1).convert().integerDenominator().isOne()) { Integer b = childAtIndex(1).convert().signedIntegerNumerator(); @@ -320,17 +320,17 @@ Expression Logarithm::splitLogarithmInteger(Integer i, bool isDenominator, Conte if (!isDenominator) { return e; } - Multiplication m = Multiplication(Rational(-1), e); + Multiplication m = Multiplication::Builder(Rational(-1), e); return m; } - Addition a; + Addition a = Addition::Builder(); for (int index = 0; index < numberOfPrimeFactors; index++) { if (isDenominator) { coefficients[index].setNegative(true); } Logarithm e = clone().convert(); e.replaceChildAtIndexInPlace(0, Rational(factors[index])); - Multiplication m = Multiplication(Rational(coefficients[index]), e); + Multiplication m = Multiplication::Builder(Rational(coefficients[index]), e); e.simpleShallowReduce(context, complexFormat, angleUnit); a.addChildAtIndexInPlace(m, a.numberOfChildren(), a.numberOfChildren()); m.shallowReduce(context, complexFormat, angleUnit, target); diff --git a/poincare/src/matrix.cpp b/poincare/src/matrix.cpp index 181fc72a3..66177d840 100644 --- a/poincare/src/matrix.cpp +++ b/poincare/src/matrix.cpp @@ -23,7 +23,7 @@ int MatrixNode::polynomialDegree(Context & context, const char * symbolName) con Layout MatrixNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { assert(numberOfChildren() > 0); - MatrixLayout layout; + MatrixLayout layout = MatrixLayout::Builder(); for (ExpressionNode * c : children()) { layout.addChildAtIndex(c->createLayout(floatDisplayMode, numberOfSignificantDigits), layout.numberOfChildren(), layout.numberOfChildren(), nullptr); } @@ -196,7 +196,7 @@ Matrix Matrix::rowCanonize(Context & context, Preferences::ComplexFormat complex if (!determinant.isUninitialized()) { determinant.addChildAtIndexInPlace(divisor.clone(), 0, determinant.numberOfChildren()); } for (int j = k+1; j < n; j++) { Expression opHJ = matrixChild(h, j); - Expression newOpHJ = Division(opHJ, divisor.clone()); + Expression newOpHJ = Division::Builder(opHJ, divisor.clone()); replaceChildAtIndexInPlace(h*n+j, newOpHJ); newOpHJ = newOpHJ.shallowReduce(context, complexFormat, angleUnit, ExpressionNode::ReductionTarget::System); } @@ -208,7 +208,7 @@ Matrix Matrix::rowCanonize(Context & context, Preferences::ComplexFormat complex Expression factor = matrixChild(i, k); for (int j = k+1; j < n; j++) { Expression opIJ = matrixChild(i, j); - Expression newOpIJ = Subtraction(opIJ, Multiplication(matrixChild(h, j).clone(), factor.clone())); + Expression newOpIJ = Subtraction::Builder(opIJ, Multiplication::Builder(matrixChild(h, j).clone(), factor.clone())); replaceChildAtIndexInPlace(i*n+j, newOpIJ); newOpIJ.childAtIndex(1).shallowReduce(context, complexFormat, angleUnit, ExpressionNode::ReductionTarget::System); newOpIJ = newOpIJ.shallowReduce(context, complexFormat, angleUnit, ExpressionNode::ReductionTarget::System); @@ -305,7 +305,7 @@ Expression Matrix::inverse(Context & context, Preferences::ComplexFormat complex } int dim = m_numberOfRows; /* Create the matrix inv = (A|I) with A the input matrix and I the dim identity matrix */ - Matrix AI; + Matrix AI = Matrix::Builder(); for (int i = 0; i < dim; i++) { for (int j = 0; j < dim; j++) { AI.addChildAtIndexInPlace(matrixChild(i, j), i*2*dim+j, i*2*dim+j); diff --git a/poincare/src/matrix_complex.cpp b/poincare/src/matrix_complex.cpp index 5cabea7a7..7e7d34906 100644 --- a/poincare/src/matrix_complex.cpp +++ b/poincare/src/matrix_complex.cpp @@ -38,7 +38,7 @@ bool MatrixComplexNode::isUndefined() const { template Expression MatrixComplexNode::complexToExpression(Preferences::ComplexFormat complexFormat) const { - Matrix matrix = Matrix::EmptyMatrix(); + Matrix matrix = Matrix::Builder(); int i = 0; for (EvaluationNode * c : this->children()) { if (c->type() == EvaluationNode::Type::Complex) { diff --git a/poincare/src/matrix_dimension.cpp b/poincare/src/matrix_dimension.cpp index cf33a7c03..d9cd3e758 100644 --- a/poincare/src/matrix_dimension.cpp +++ b/poincare/src/matrix_dimension.cpp @@ -48,14 +48,14 @@ Expression MatrixDimension::shallowReduce() { #if MATRIX_EXACT_REDUCING if (c.type() == ExpressionNode::Type::Matrix) { Matrix m = static_cast(c); - Matrix result; + Matrix result = Matrix::Builder(); result.addChildAtIndexInPlace(Rational(m.numberOfRows()), 0, 0); result.addChildAtIndexInPlace(Rational(m.numberOfColumns()), 1, 1); result.setDimensions(1, 2); return result; } if (!c.recursivelyMatches(Expression::IsMatrix)) { - Matrix result; + Matrix result = Matrix::Builder(); result.addChildAtIndexInPlace(Rational(1), 0, 0); result.addChildAtIndexInPlace(Rational(1), 1, 1); result.setDimensions(1, 2); @@ -64,7 +64,7 @@ Expression MatrixDimension::shallowReduce() { return *this; #else if (c.type() != ExpressionNode::Type::Matrix) { - Matrix result; + Matrix result = Matrix::Builder(); result.addChildAtIndexInPlace(Rational(1), 0, 0); result.addChildAtIndexInPlace(Rational(1), 1, 1); result.setDimensions(1, 2); diff --git a/poincare/src/matrix_inverse.cpp b/poincare/src/matrix_inverse.cpp index e00cb9f56..16e29a94a 100644 --- a/poincare/src/matrix_inverse.cpp +++ b/poincare/src/matrix_inverse.cpp @@ -53,7 +53,7 @@ Expression MatrixInverse::shallowReduce(Context & context, Preferences::ComplexF #if MATRIX_EXACT_REDUCING #if 0 if (!c.recursivelyMatches(Expression::IsMatrix)) { - return Power(c, Rational(-1).shallowReduce(context, complexFormat, angleUnit, target); + return Power::Builder(c, Rational(-1).shallowReduce(context, complexFormat, angleUnit, target); } if (c.type() == ExpressionNode::Type::Matrix) { Matrix mat = static_cast(c); @@ -65,7 +65,7 @@ Expression MatrixInverse::shallowReduce(Context & context, Preferences::ComplexF #endif #else if (c.type() != ExpressionNode::Type::Matrix) { - Expression result = Power(c, Rational(-1)); + Expression result = Power::Builder(c, Rational(-1)); replaceWithInPlace(result); result = result.shallowReduce(context, complexFormat, angleUnit, target); return result; diff --git a/poincare/src/matrix_layout.cpp b/poincare/src/matrix_layout.cpp index 57b085ab0..32d07c60f 100644 --- a/poincare/src/matrix_layout.cpp +++ b/poincare/src/matrix_layout.cpp @@ -266,16 +266,4 @@ void MatrixLayoutNode::didReplaceChildAtIndex(int index, LayoutCursor * cursor, } } -MatrixLayout::MatrixLayout(const MatrixLayoutNode * n) : GridLayout(n) {} -MatrixLayout::MatrixLayout() : GridLayout(TreePool::sharedPool()->createTreeNode()) {} -MatrixLayout::MatrixLayout(Layout l1, Layout l2, Layout l3, Layout l4) : - MatrixLayout() -{ - addChildAtIndexInPlace(l1, 0, 0); - addChildAtIndexInPlace(l2, 1, 1); - addChildAtIndexInPlace(l3, 2, 2); - addChildAtIndexInPlace(l4, 3, 3); - setDimensions(2, 2); -} - } diff --git a/poincare/src/multiplication.cpp b/poincare/src/multiplication.cpp index ac04919e1..7e927711f 100644 --- a/poincare/src/multiplication.cpp +++ b/poincare/src/multiplication.cpp @@ -108,8 +108,6 @@ Expression MultiplicationNode::denominator(Context & context, Preferences::Compl /* Multiplication */ -Multiplication::Multiplication() : NAryExpression(TreePool::sharedPool()->createTreeNode()) {} - template void Multiplication::computeOnArrays(T * m, T * n, T * result, int mNumberOfColumns, int mNumberOfRows, int nNumberOfColumns) { for (int i = 0; i < mNumberOfRows; i++) { @@ -148,7 +146,7 @@ Expression Multiplication::shallowBeautify(Context & context, Preferences::Compl Expression noNegativeNumeral = makePositiveAnyNegativeNumeralFactor(context, complexFormat, angleUnit, target); // If one negative numeral factor was made positive, we turn the expression in an Opposite if (!noNegativeNumeral.isUninitialized()) { - Opposite o = Opposite(); + Opposite o = Opposite::Builder(); noNegativeNumeral.replaceWithInPlace(o); o.replaceChildAtIndexInPlace(0, noNegativeNumeral); return o; @@ -166,7 +164,7 @@ Expression Multiplication::shallowBeautify(Context & context, Preferences::Compl for (int i = 0; i < thisExp.numberOfChildren(); i++) { const Expression o = thisExp.childAtIndex(i); if (o.type() == ExpressionNode::Type::Addition) { - Parenthesis p(o); + Parenthesis p = Parenthesis::Builder(o); thisExp.replaceChildAtIndexInPlace(i, p); } } @@ -190,7 +188,7 @@ Expression Multiplication::shallowBeautify(Context & context, Preferences::Compl numeratorOperand = numeratorChild0; } Expression originalParent = numeratorOperand.parent(); - Division d; + Division d = Division::Builder(); numeratorOperand.replaceWithInPlace(d); d.replaceChildAtIndexInPlace(0, numeratorOperand); d.replaceChildAtIndexInPlace(1, denominatorOperand); @@ -218,18 +216,18 @@ int Multiplication::getPolynomialCoefficients(Context & context, const char * sy assert(degI <= Expression::k_maxPolynomialDegree); for (int j = deg; j > 0; j--) { // new coefficients[j] = b(0)*a(j)+b(1)*a(j-1)+b(2)*a(j-2)+... - Addition a; + Addition a = Addition::Builder(); int jbis = j > degI ? degI : j; for (int l = 0; l <= jbis ; l++) { // Always copy the a and b coefficients are they are used multiple times - a.addChildAtIndexInPlace(Multiplication(intermediateCoefficients[l].clone(), coefficients[j-l].clone()), a.numberOfChildren(), a.numberOfChildren()); + a.addChildAtIndexInPlace(Multiplication::Builder(intermediateCoefficients[l].clone(), coefficients[j-l].clone()), a.numberOfChildren(), a.numberOfChildren()); } /* a(j) and b(j) are used only to compute coefficient at rank >= j, we * can delete them as we compute new coefficient by decreasing ranks. */ coefficients[j] = a; } // new coefficients[0] = a(0)*b(0) - coefficients[0] = Multiplication(coefficients[0], intermediateCoefficients[0]); + coefficients[0] = Multiplication::Builder(coefficients[0], intermediateCoefficients[0]); } return deg; } @@ -322,7 +320,7 @@ Expression Multiplication::privateShallowReduce(Context & context, Preferences:: int i2 = e%m; int i1 = e/m; for (int j = 0; j < n; j++) { - Expression * mult = new Multiplication(currentMatrix->childAtIndex(j+om*i1), resultMatrix->childAtIndex(j*m+i2), true); + Expression * mult = new Multiplication::Builder(currentMatrix->childAtIndex(j+om*i1), resultMatrix->childAtIndex(j*m+i2), true); static_cast(newMatrixOperands[e])->addOperand(mult); mult->shallowReduce(context, complexFormat, angleUnit, target); } @@ -538,8 +536,8 @@ void Multiplication::mergeMultiplicationChildrenInPlace() { void Multiplication::factorizeBase(int i, int j, Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target) { /* This function factorizes two children which have a common base. For example - * if this is Multiplication(pi^2, pi^3), then pi^2 and pi^3 could be merged - * and this turned into Multiplication(pi^5). */ + * if this is Multiplication::Builder(pi^2, pi^3), then pi^2 and pi^3 could be merged + * and this turned into Multiplication::Builder(pi^5). */ Expression e = childAtIndex(j); // Step 1: Get rid of the child j @@ -553,9 +551,9 @@ void Multiplication::mergeInChildByFactorizingBase(int i, Expression e, Context * and childAtIndex(i) are supposed to have a common base. */ // Step 1: Find the new exponent - Expression s = Addition(CreateExponent(childAtIndex(i)), CreateExponent(e)); // pi^2*pi^3 -> pi^(2+3) -> pi^5 + Expression s = Addition::Builder(CreateExponent(childAtIndex(i)), CreateExponent(e)); // pi^2*pi^3 -> pi^(2+3) -> pi^5 // Step 2: Create the new Power - Expression p = Power(Base(childAtIndex(i)), s); // pi^2*pi^-2 -> pi^0 -> 1 + Expression p = Power::Builder(Base(childAtIndex(i)), s); // pi^2*pi^-2 -> pi^0 -> 1 s.shallowReduce(context, complexFormat, angleUnit, target); // Step 3: Replace one of the child replaceChildAtIndexInPlace(i, p); @@ -570,10 +568,10 @@ void Multiplication::mergeInChildByFactorizingBase(int i, Expression e, Context void Multiplication::factorizeExponent(int i, int j, Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target) { /* This function factorizes children which share a common exponent. For - * example, it turns Multiplication(2^x,3^x) into Multiplication(6^x). */ + * example, it turns Multiplication::Builder(2^x,3^x) into Multiplication::Builder(6^x). */ // Step 1: Find the new base - Expression m = Multiplication(Base(childAtIndex(i)), Base(childAtIndex(j))); // 2^x*3^x -> (2*3)^x -> 6^x + Expression m = Multiplication::Builder(Base(childAtIndex(i)), Base(childAtIndex(j))); // 2^x*3^x -> (2*3)^x -> 6^x // Step 2: Get rid of one of the children removeChildAtIndexInPlace(j); // Step 3: Replace the other child @@ -595,7 +593,7 @@ Expression Multiplication::distributeOnOperandAtIndex(int i, Context & context, assert(i >= 0 && i < numberOfChildren()); assert(childAtIndex(i).type() == ExpressionNode::Type::Addition); - Addition a; + Addition a = Addition::Builder(); Expression childI = childAtIndex(i); int numberOfAdditionTerms = childI.numberOfChildren(); for (int j = 0; j < numberOfAdditionTerms; j++) { @@ -635,13 +633,13 @@ void Multiplication::addMissingFactors(Expression factor, Context & context, Pre * base if any. Otherwise, we add it as an new child. */ for (int i = 0; i < numberOfChildren(); i++) { if (TermsHaveIdenticalBase(childAtIndex(i), factor)) { - Expression sub = Subtraction(CreateExponent(childAtIndex(i)), CreateExponent(factor)).deepReduce(context, complexFormat, angleUnit, ExpressionNode::ReductionTarget::User); + Expression sub = Subtraction::Builder(CreateExponent(childAtIndex(i)), CreateExponent(factor)).deepReduce(context, complexFormat, angleUnit, ExpressionNode::ReductionTarget::User); if (sub.sign(&context) == ExpressionNode::Sign::Negative) { // index[0] < index[1] - sub = Opposite(sub); + sub = Opposite::Builder(sub); if (factor.type() == ExpressionNode::Type::Power) { factor.replaceChildAtIndexInPlace(1, sub); } else { - factor = Power(factor, sub); + factor = Power::Builder(factor, sub); } sub.shallowReduce(context, complexFormat, angleUnit, ExpressionNode::ReductionTarget::User); mergeInChildByFactorizingBase(i, factor, context, complexFormat, angleUnit, ExpressionNode::ReductionTarget::User); @@ -677,20 +675,20 @@ void Multiplication::factorizeSineAndCosine(int i, int j, Context & context, Pre if (p.isRationalOne()) { replaceChildAtIndexInPlace(i, tan); } else { - replaceChildAtIndexInPlace(i, Power(tan, p)); + replaceChildAtIndexInPlace(i, Power::Builder(tan, p)); } childAtIndex(i).shallowReduce(context, complexFormat, angleUnit, ExpressionNode::ReductionTarget::User); // Replace cos(x)^q by cos(x)^(p+q) - replaceChildAtIndexInPlace(j, Power(Base(childAtIndex(j)), sumPQ)); + replaceChildAtIndexInPlace(j, Power::Builder(Base(childAtIndex(j)), sumPQ)); childAtIndex(j).shallowReduce(context, complexFormat, angleUnit, ExpressionNode::ReductionTarget::User); } else { // Replace cos(x)^q by tan(x)^(-q) - Expression newPower = Power(tan, Number::Multiplication(q, Rational(-1))); + Expression newPower = Power::Builder(tan, Number::Multiplication(q, Rational(-1))); newPower.childAtIndex(1).shallowReduce(context, complexFormat, angleUnit, ExpressionNode::ReductionTarget::User); replaceChildAtIndexInPlace(j, newPower); newPower.shallowReduce(context, complexFormat, angleUnit, ExpressionNode::ReductionTarget::User); // Replace sin(x)^p by sin(x)^(p+q) - replaceChildAtIndexInPlace(i, Power(Base(childAtIndex(i)), sumPQ)); + replaceChildAtIndexInPlace(i, Power::Builder(Base(childAtIndex(i)), sumPQ)); childAtIndex(i).shallowReduce(context, complexFormat, angleUnit, ExpressionNode::ReductionTarget::User); } } @@ -745,7 +743,7 @@ bool Multiplication::TermHasNumeralExponent(const Expression & e) { Expression Multiplication::mergeNegativePower(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) { /* mergeNegativePower groups all factors that are power of form a^(-b) together * for instance, a^(-1)*b^(-c)*c = c*(a*b^c)^(-1) */ - Multiplication m; + Multiplication m = Multiplication::Builder(); // Special case for rational p/q: if q != 1, q should be at denominator if (childAtIndex(0).type() == ExpressionNode::Type::Rational && !childAtIndex(0).convert().integerDenominator().isOne()) { Rational r = childAtIndex(0).convert(); @@ -780,7 +778,7 @@ Expression Multiplication::mergeNegativePower(Context & context, Preferences::Co return *this; } m.sortChildrenInPlace([](const ExpressionNode * e1, const ExpressionNode * e2, bool canBeInterrupted) { return ExpressionNode::SimplificationOrder(e1, e2, true, canBeInterrupted); }, true); - Power p(m.squashUnaryHierarchyInPlace(), Rational(-1)); + Power p = Power::Builder(m.squashUnaryHierarchyInPlace(), Rational(-1)); addChildAtIndexInPlace(p, 0, numberOfChildren()); sortChildrenInPlace([](const ExpressionNode * e1, const ExpressionNode * e2, bool canBeInterrupted) { return ExpressionNode::SimplificationOrder(e1, e2, true, canBeInterrupted); }, true); return squashUnaryHierarchyInPlace(); diff --git a/poincare/src/nth_root.cpp b/poincare/src/nth_root.cpp index e570abd7e..5c1cac751 100644 --- a/poincare/src/nth_root.cpp +++ b/poincare/src/nth_root.cpp @@ -19,7 +19,7 @@ constexpr Expression::FunctionHelper NthRoot::s_functionHelper; int NthRootNode::numberOfChildren() const { return NthRoot::s_functionHelper.numberOfChildren(); } Layout NthRootNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { - return NthRootLayout( + return NthRootLayout::Builder( childAtIndex(0)->createLayout(floatDisplayMode, numberOfSignificantDigits), childAtIndex(1)->createLayout(floatDisplayMode, numberOfSignificantDigits)); } @@ -75,8 +75,8 @@ Expression NthRoot::shallowReduce(Context & context, Preferences::ComplexFormat return Undefined(); } #endif - Expression invIndex = Power(childAtIndex(1), Rational(-1)); - Power p = Power(childAtIndex(0), invIndex); + Expression invIndex = Power::Builder(childAtIndex(1), Rational(-1)); + Power p = Power::Builder(childAtIndex(0), invIndex); invIndex.shallowReduce(context, complexFormat, angleUnit, target); replaceWithInPlace(p); return p.shallowReduce(context, complexFormat, angleUnit, target); diff --git a/poincare/src/nth_root_layout.cpp b/poincare/src/nth_root_layout.cpp index 208952e46..b19ea55d2 100644 --- a/poincare/src/nth_root_layout.cpp +++ b/poincare/src/nth_root_layout.cpp @@ -270,16 +270,4 @@ void NthRootLayoutNode::render(KDContext * ctx, KDPoint p, KDColor expressionCol } } -NthRootLayout::NthRootLayout(Layout radicand) : NthRootLayout() { - replaceChildAtIndexInPlace(0, radicand); -} - -NthRootLayout::NthRootLayout(Layout radicand, Layout index) : NthRootLayout() { - replaceChildAtIndexInPlace(0, radicand); - addChildAtIndexInPlace(index, 1, 1); - static_cast(node())->setNumberOfChildren(2); -} - -NthRootLayout::NthRootLayout() : Layout(TreePool::sharedPool()->createTreeNode()) {} - } diff --git a/poincare/src/opposite.cpp b/poincare/src/opposite.cpp index 927f832c6..12aa72853 100644 --- a/poincare/src/opposite.cpp +++ b/poincare/src/opposite.cpp @@ -41,7 +41,7 @@ bool OppositeNode::childNeedsParenthesis(const TreeNode * child) const { } Layout OppositeNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { - HorizontalLayout result = HorizontalLayout(CharLayout('-')); + HorizontalLayout result = HorizontalLayout::Builder(CharLayout('-')); if (childAtIndex(0)->type() == Type::Opposite) { result.addOrMergeChildAtIndex(LayoutHelper::Parentheses(childAtIndex(0)->createLayout(floatDisplayMode, numberOfSignificantDigits), false), 1, false); } else { @@ -69,8 +69,6 @@ Expression OppositeNode::shallowReduce(Context & context, Preferences::ComplexFo /* Simplification */ -Opposite::Opposite() : Expression(TreePool::sharedPool()->createTreeNode()) {} - Expression Opposite::shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target) { Expression result = Expression::defaultShallowReduce(); if (result.isUndefined()) { @@ -79,7 +77,7 @@ Expression Opposite::shallowReduce(Context & context, Preferences::ComplexFormat Expression child = result.childAtIndex(0); #if MATRIX_EXACT_REDUCING #endif - result = Multiplication(Rational(-1), child); + result = Multiplication::Builder(Rational(-1), child); replaceWithInPlace(result); return result.shallowReduce(context, complexFormat, angleUnit, target); } diff --git a/poincare/src/parsing/parser.cpp b/poincare/src/parsing/parser.cpp index 26eb10d01..ae1024e34 100644 --- a/poincare/src/parsing/parser.cpp +++ b/poincare/src/parsing/parser.cpp @@ -155,7 +155,7 @@ void Parser::parseNumber(Expression & leftHandSide, Token::Type stoppingType) { void Parser::parsePlus(Expression & leftHandSide, Token::Type stoppingType) { Expression rightHandSide; if (parseBinaryOperator(leftHandSide, rightHandSide, Token::Plus)) { - leftHandSide = Addition(leftHandSide, rightHandSide); + leftHandSide = Addition::Builder(leftHandSide, rightHandSide); } } @@ -173,41 +173,41 @@ void Parser::parseMinus(Expression & leftHandSide, Token::Type stoppingType) { if (m_status != Status::Progress) { return; } - leftHandSide = Opposite(rightHandSide); + leftHandSide = Opposite::Builder(rightHandSide); } else { Expression rightHandSide = parseUntil(Token::Minus); // Subtraction is left-associative if (m_status != Status::Progress) { return; } - leftHandSide = Subtraction(leftHandSide, rightHandSide); + leftHandSide = Subtraction::Builder(leftHandSide, rightHandSide); } } void Parser::parseTimes(Expression & leftHandSide, Token::Type stoppingType) { Expression rightHandSide; if (parseBinaryOperator(leftHandSide, rightHandSide, Token::Times)) { - leftHandSide = Multiplication(leftHandSide, rightHandSide); + leftHandSide = Multiplication::Builder(leftHandSide, rightHandSide); } } void Parser::parseSlash(Expression & leftHandSide, Token::Type stoppingType) { Expression rightHandSide; if (parseBinaryOperator(leftHandSide, rightHandSide, Token::Slash)) { - leftHandSide = Division(leftHandSide, rightHandSide); + leftHandSide = Division::Builder(leftHandSide, rightHandSide); } } void Parser::parseImplicitTimes(Expression & leftHandSide, Token::Type stoppingType) { Expression rightHandSide; if (parseBinaryOperator(leftHandSide, rightHandSide, Token::Slash)) { - leftHandSide = Multiplication(leftHandSide, rightHandSide); + leftHandSide = Multiplication::Builder(leftHandSide, rightHandSide); } } void Parser::parseCaret(Expression & leftHandSide, Token::Type stoppingType) { Expression rightHandSide; if (parseBinaryOperator(leftHandSide, rightHandSide, Token::ImplicitTimes)) { - leftHandSide = Power(leftHandSide, rightHandSide); + leftHandSide = Power::Builder(leftHandSide, rightHandSide); } } @@ -252,7 +252,7 @@ void Parser::parseStore(Expression & leftHandSide, Token::Type stoppingType) { m_status = Status::Error; // Store expects a single symbol or function. return; } - leftHandSide = Store(leftHandSide, static_cast(rightHandSide)); + leftHandSide = Store::Builder(leftHandSide, static_cast(rightHandSide)); } void Parser::parseLeftSuperscript(Expression & leftHandSide, Token::Type stoppingType) { @@ -268,7 +268,7 @@ void Parser::parseLeftSuperscript(Expression & leftHandSide, Token::Type stoppin m_status = Status::Error; // Right superscript marker missing. return; } - leftHandSide = Power(leftHandSide, rightHandSide); + leftHandSide = Power::Builder(leftHandSide, rightHandSide); isThereImplicitMultiplication(); } @@ -301,7 +301,7 @@ void Parser::parseLeftParenthesis(Expression & leftHandSide, Token::Type stoppin m_status = Status::Error; // Right parenthesis missing. return; } - leftHandSide = Parenthesis(leftHandSide); + leftHandSide = Parenthesis::Builder(leftHandSide); isThereImplicitMultiplication(); } @@ -309,7 +309,7 @@ void Parser::parseBang(Expression & leftHandSide, Token::Type stoppingType) { if (leftHandSide.isUninitialized()) { m_status = Status::Error; // Left-hand side missing } else { - leftHandSide = Factorial(leftHandSide); + leftHandSide = Factorial::Builder(leftHandSide); } isThereImplicitMultiplication(); } @@ -363,7 +363,7 @@ void Parser::parseSequence(Expression & leftHandSide, const char name, Token::Ty } else if (rank.isIdenticalTo(Symbol("n",1))) { char sym[5] = {name, '(', 'n', ')', 0}; leftHandSide = Symbol(sym, 4); - } else if (rank.isIdenticalTo(Addition(Symbol("n",1),Rational("1")))) { + } else if (rank.isIdenticalTo(Addition::Builder(Symbol("n",1),Rational("1")))) { char sym[7] = {name, '(', 'n', '+', '1', ')', 0}; leftHandSide = Symbol(sym, 6); } else { @@ -459,7 +459,7 @@ Expression Parser::parseFunctionParameters() { return Expression(); } if (popTokenIfType(Token::RightParenthesis)) { - return Matrix(); // The function has no parameter. + return Matrix::Builder(); // The function has no parameter. } Expression commaSeparatedList = parseCommaSeparatedList(); if (m_status != Status::Progress) { @@ -477,7 +477,7 @@ void Parser::parseMatrix(Expression & leftHandSide, Token::Type stoppingType) { m_status = Status::Error; //FIXME return; } - Matrix matrix; + Matrix matrix = Matrix::Builder(); int numberOfRows = 0; int numberOfColumns = 0; while (!popTokenIfType(Token::RightBracket)) { @@ -520,7 +520,7 @@ Expression Parser::parseVector() { } Expression Parser::parseCommaSeparatedList() { - Matrix commaSeparatedList; + Matrix commaSeparatedList = Matrix::Builder(); int length = 0; do { Expression item = parseUntil(Token::Comma); diff --git a/poincare/src/power.cpp b/poincare/src/power.cpp index 1cfa9a51f..620dcc3e7 100644 --- a/poincare/src/power.cpp +++ b/poincare/src/power.cpp @@ -134,9 +134,9 @@ Layout PowerNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int if (indiceOperand->type() == ExpressionNode::Type::Parenthesis) { indiceOperand = indiceOperand->childAtIndex(0); } - HorizontalLayout result = HorizontalLayout(); + HorizontalLayout result = HorizontalLayout::Builder(); result.addOrMergeChildAtIndex(childAtIndex(0)->createLayout(floatDisplayMode, numberOfSignificantDigits), 0, false); - result.addChildAtIndex(VerticalOffsetLayout( + result.addChildAtIndex(VerticalOffsetLayout::Builder( indiceOperand->createLayout(floatDisplayMode, numberOfSignificantDigits), VerticalOffsetLayoutNode::Type::Superscript), result.numberOfChildren(), @@ -235,15 +235,11 @@ template MatrixComplex PowerNode::computeOnMatrices(const MatrixC } // Power -Power::Power(Expression base, Expression exponent) : Expression(TreePool::sharedPool()->createTreeNode()) { - replaceChildAtIndexInPlace(0, base); - replaceChildAtIndexInPlace(1, exponent); -} Expression Power::setSign(ExpressionNode::Sign s, Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target) { assert(s == ExpressionNode::Sign::Positive); if (childAtIndex(0).sign(context) == ExpressionNode::Sign::Negative) { - Expression result = Power(childAtIndex(0).setSign(ExpressionNode::Sign::Positive, context, complexFormat, angleUnit, target), childAtIndex(1)); + Expression result = Power::Builder(childAtIndex(0).setSign(ExpressionNode::Sign::Positive, context, complexFormat, angleUnit, target), childAtIndex(1)); replaceWithInPlace(result); return result.shallowReduce(*context, complexFormat, angleUnit, target); } @@ -321,7 +317,7 @@ Expression Power::shallowReduce(Context & context, Preferences::ComplexFormat co if (exp == 0) { return replaceWith(id, true); } - Multiplication * result = new Multiplication(id, mat->clone()); + Multiplication * result = new Multiplication::Builder(id, mat->clone()); // TODO: implement a quick exponentiation for (int k = 1; k < exp; k++) { result->addOperand(mat->clone()); @@ -487,7 +483,7 @@ Expression Power::shallowReduce(Context & context, Preferences::ComplexFormat co if (childAtIndex(0).sign(&context) == ExpressionNode::Sign::Negative) { // (-inf)^x --> (-1)^x*inf Power p(Rational(-1), childAtIndex(1)); - result = Multiplication(p, result); + result = Multiplication::Builder(p, result); p.shallowReduce(context, complexFormat, angleUnit, target); } } @@ -524,7 +520,7 @@ Expression Power::shallowReduce(Context & context, Preferences::ComplexFormat co if (!m0.isUninitialized()) { replaceChildAtIndexInPlace(0, m0); // m0 doest not need to be shallowReduce as makePositiveAnyNegativeNumeralFactor returns a reduced expression - Multiplication m1 = Multiplication(); + Multiplication m1; replaceWithInPlace(m1); // Multiply m1 by i complex Constant i(Ion::Charset::IComplex); @@ -546,9 +542,9 @@ Expression Power::shallowReduce(Context & context, Preferences::ComplexFormat co Expression cos = Cosine::Builder(m); m = m.shallowReduce(context, complexFormat, angleUnit, target); Expression sin = Sine::Builder(m.clone()); - Expression complexPart = Multiplication(sin, i); + Expression complexPart = Multiplication::Builder(sin, i); sin.shallowReduce(context, complexFormat, angleUnit, target); - Expression a = Addition(cos, complexPart); + Expression a = Addition::Builder(cos, complexPart); cos.shallowReduce(context, complexFormat, angleUnit, target); complexPart.shallowReduce(context, complexFormat, angleUnit, target); replaceWithInPlace(a); @@ -624,11 +620,11 @@ Expression Power::shallowReduce(Context & context, Preferences::ComplexFormat co m.shallowReduce(context, complexFormat, angleUnit, target); // |a|^r - Power p = Power(factor, rCopy); + Power p = Power::Builder(factor, rCopy); // |a|^r*(sign(a)*b*...)^r Power thisRef = *this; - Multiplication root = Multiplication(p); + Multiplication root = Multiplication::Builder(p); replaceWithInPlace(root); root.addChildAtIndexInPlace(thisRef, 1, 1); p.shallowReduce(context, complexFormat, angleUnit, target); @@ -665,12 +661,12 @@ Expression Power::shallowReduce(Context & context, Preferences::ComplexFormat co if (RationalExponentShouldNotBeReduced(rationalBase, rationalIndex)) { return *this; } - Power p1 = Power(childAtIndex(0).clone(), a.childAtIndex(0)); + Power p1 = Power::Builder(childAtIndex(0).clone(), a.childAtIndex(0)); Power thisRef = *this; childAtIndex(1).convert().removeChildAtIndexInPlace(0); // p2 = a^(c+...) // if addition had only 2 children childAtIndex(1).convert().squashUnaryHierarchyInPlace(); - Multiplication m = Multiplication(p1); + Multiplication m = Multiplication::Builder(p1); replaceWithInPlace(m); m.addChildAtIndexInPlace(thisRef, 1, 1); p1.simplifyRationalRationalPower(context, complexFormat, angleUnit, target); @@ -711,13 +707,13 @@ Expression Power::shallowReduce(Context & context, Preferences::ComplexFormat co // result = result * (a0+a1+...+a(m-1) in its expanded form if (result.type() == ExpressionNode::Type::Addition) { // We need a 'double' distribution and newA will hold the new expanded form - Expression newA = Addition(); + Expression newA = Addition::Builder(); for (int j = 0; j < a.numberOfChildren(); j++) { - Expression m = Multiplication(result.clone(), a.childAtIndex(j).clone()).distributeOnOperandAtIndex(0, context, complexFormat, angleUnit, target); + Expression m = Multiplication::Builder(result.clone(), a.childAtIndex(j).clone()).distributeOnOperandAtIndex(0, context, complexFormat, angleUnit, target); if (newA.type() == ExpressionNode::Type::Addition) { static_cast(newA).addChildAtIndexInPlace(m, newA.numberOfChildren(), newA.numberOfChildren()); } else { - newA = Addition(newA, m); + newA = Addition::Builder(newA, m); } newA = newA.shallowReduce(context, complexFormat, angleUnit, target); } @@ -725,7 +721,7 @@ Expression Power::shallowReduce(Context & context, Preferences::ComplexFormat co result = newA; } else { // Just distribute result on a - Multiplication m = Multiplication(a.clone(), result.clone()); + Multiplication m = Multiplication::Builder(a.clone(), result.clone()); Expression distributedM = m.distributeOnOperandAtIndex(0, context, complexFormat, angleUnit, target); result.replaceWithInPlace(distributedM); result = distributedM; @@ -757,10 +753,10 @@ Expression Power::shallowReduce(Context & context, Preferences::ComplexFormat co Addition * a = new Addition(); for (int i = 0; i <= clippedN; i++) { Rational * r = new Rational(static_cast(BinomialCoefficient::compute(static_cast(i), static_cast(clippedN)))); - Power * p0 = new Power(x0->clone(), new Rational(i), false); - Power * p1 = new Power(x1->clone(), new Rational(clippedN-i), false); + Power * p0 = new Power::Builder(x0->clone(), new Rational(i), false); + Power * p1 = new Power::Builder(x1->clone(), new Rational(clippedN-i), false); const Expression * operands[3] = {r, p0, p1}; - Multiplication * m = new Multiplication(operands, 3, false); + Multiplication * m = new Multiplication::Builder(operands, 3, false); p0->shallowReduce(context, complexFormat, angleUnit, target); p1->shallowReduce(context, complexFormat, angleUnit, target); a->addOperand(m); @@ -783,7 +779,7 @@ Expression Power::shallowBeautify(Context & context, Preferences::ComplexFormat Expression p = denominator(context, complexFormat, angleUnit); // If the denominator is initialized, the index of the power is of form -y if (!p.isUninitialized()) { - Division d = Division(Rational(1), p); + Division d = Division::Builder(Rational(1), p); p.shallowReduce(context, complexFormat, angleUnit, ExpressionNode::ReductionTarget::User); replaceWithInPlace(d); return d.shallowBeautify(context, complexFormat, angleUnit, target); @@ -811,7 +807,7 @@ Expression Power::shallowBeautify(Context & context, Preferences::ComplexFormat Integer p = childAtIndex(1).convert().signedIntegerNumerator(); Integer q = childAtIndex(1).convert().integerDenominator(); Expression nthRoot = q.isOne() ? childAtIndex(0) : NthRoot::Builder(childAtIndex(0), Rational(q)); - Expression result = p.isOne() ? nthRoot : Power(nthRoot, Rational(p)); + Expression result = p.isOne() ? nthRoot : Power::Builder(nthRoot, Rational(p)); replaceWithInPlace(result); return result; } @@ -820,7 +816,7 @@ Expression Power::shallowBeautify(Context & context, Preferences::ComplexFormat if (childAtIndex(0).type() == ExpressionNode::Type::Addition || childAtIndex(0).type() == ExpressionNode::Type::Multiplication) { - Parenthesis p = Parenthesis(childAtIndex(0)); + Parenthesis p = Parenthesis::Builder(childAtIndex(0)); replaceChildAtIndexInPlace(0, p); } return *this; @@ -831,7 +827,7 @@ Expression Power::shallowBeautify(Context & context, Preferences::ComplexFormat // Simplification Expression Power::denominator(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const { // Clone the power - Expression clone = Power(childAtIndex(0).clone(), childAtIndex(1).clone()); + Expression clone = Power::Builder(childAtIndex(0).clone(), childAtIndex(1).clone()); // If the power is of form x^(-y), denominator should be x^y Expression positiveIndex = clone.childAtIndex(1).makePositiveAnyNegativeNumeralFactor(context, complexFormat, angleUnit, ExpressionNode::ReductionTarget::User); if (!positiveIndex.isUninitialized()) { @@ -848,7 +844,7 @@ Expression Power::denominator(Context & context, Preferences::ComplexFormat comp Expression Power::simplifyPowerPower(Context& context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target) { // this is p^e = (a^b)^e, we want a^(b*e) Expression p = childAtIndex(0); - Multiplication m(p.childAtIndex(1), childAtIndex(1)); + Multiplication m = Multiplication::Builder(p.childAtIndex(1), childAtIndex(1)); replaceChildAtIndexInPlace(0, p.childAtIndex(0)); replaceChildAtIndexInPlace(1, m); m.shallowReduce(context, complexFormat, angleUnit, target); @@ -860,7 +856,7 @@ Expression Power::simplifyPowerMultiplication(Context& context, Preferences::Com Expression m = childAtIndex(0); Expression r = childAtIndex(1); for (int index = 0; index < m.numberOfChildren(); index++) { - Power p = Power(m.childAtIndex(index).clone(), r.clone()); // We copy r and factor to avoid inheritance issues + Power p = Power::Builder(m.childAtIndex(index).clone(), r.clone()); // We copy r and factor to avoid inheritance issues m.replaceChildAtIndexInPlace(index, p); p.shallowReduce(context, complexFormat, angleUnit, target); } @@ -875,7 +871,7 @@ Expression Power::simplifyRationalRationalPower(Context& context, Preferences::C if (b.integerDenominator().isOne()) { Rational r = Rational::IntegerPower(a, b.signedIntegerNumerator()); if (r.numeratorOrDenominatorIsInfinity()) { - return Power(a, b); + return Power::Builder(a, b); } replaceWithInPlace(r); return r; @@ -890,7 +886,7 @@ Expression Power::simplifyRationalRationalPower(Context& context, Preferences::C n = CreateSimplifiedIntegerRationalPower(a.signedIntegerNumerator(), b, false, context, complexFormat, angleUnit, target); d = CreateSimplifiedIntegerRationalPower(a.integerDenominator(), b, true, context, complexFormat, angleUnit, target); } - Multiplication m = Multiplication(n, d); + Multiplication m = Multiplication::Builder(n, d); replaceWithInPlace(m); return m.shallowReduce(context, complexFormat, angleUnit, target); } @@ -908,7 +904,7 @@ Expression Power::CreateSimplifiedIntegerRationalPower(Integer i, Rational r, bo /* We could not break i in prime factors (it might take either too many * factors or too much time). */ Expression rClone = r.clone().setSign(isDenominator ? ExpressionNode::Sign::Negative : ExpressionNode::Sign::Positive, &context, complexFormat, angleUnit, target); - return Power(Rational(i), rClone); + return Power::Builder(Rational(i), rClone); } Integer r1(1); @@ -921,19 +917,19 @@ Expression Power::CreateSimplifiedIntegerRationalPower(Integer i, Rational r, bo } if (r2.isOverflow() || r1.isOverflow()) { // we overflow Integer at one point: we abort - return Power(Rational(i), r.clone()); + return Power::Builder(Rational(i), r.clone()); } Rational p1 = Rational(r2); Integer oneExponent = isDenominator ? Integer(-1) : Integer(1); Integer rDenominator = r.integerDenominator(); Rational p2 = Rational(oneExponent, rDenominator); - Power p = Power(p1, p2); + Power p = Power::Builder(p1, p2); if (r1.isEqualTo(Integer(1)) && !i.isNegative()) { return p; } Integer one(1); Rational r3 = isDenominator ? Rational(one, r1) : Rational(r1); - Multiplication m; + Multiplication m = Multiplication::Builder(); m.addChildAtIndexInPlace(r3, 0, 0); if (!r2.isOne()) { m.addChildAtIndexInPlace(p, 1, 1); @@ -981,12 +977,12 @@ Expression Power::removeSquareRootsFromDenominator(Context & context, Preference if (pq.isOverflow()) { return result; } - Power sqrt = Power(Rational(pq), Rational(1, 2)); + Power sqrt = Power::Builder(Rational(pq), Rational(1, 2)); Integer one(1); if (castedChild1.isHalf()) { - result = Multiplication(Rational(one, q), sqrt); + result = Multiplication::Builder(Rational(one, q), sqrt); } else { - result = Multiplication(Rational(one, p), sqrt); // We use here the assertion that p != 0 + result = Multiplication::Builder(Rational(one, p), sqrt); // We use here the assertion that p != 0 } sqrt.shallowReduce(context, complexFormat, angleUnit, ExpressionNode::ReductionTarget::User); } @@ -1036,29 +1032,29 @@ Expression Power::removeSquareRootsFromDenominator(Context & context, Preference // Compute the numerator Integer pq1 = Integer::Multiplication(p1, q1); Integer pq2 = Integer::Multiplication(p2, q2); - Power sqrt1 = Power(Rational(pq1), Rational(1, 2)); - Power sqrt2 = Power(Rational(pq2), Rational(1, 2)); + Power sqrt1 = Power::Builder(Rational(pq1), Rational(1, 2)); + Power sqrt2 = Power::Builder(Rational(pq2), Rational(1, 2)); Integer factor1 = Integer::Multiplication( Integer::Multiplication(n1, d1), Integer::Multiplication(Integer::Power(d2, Integer(2)), q2)); - Multiplication m1 = Multiplication(Rational(factor1), sqrt1); + Multiplication m1 = Multiplication::Builder(Rational(factor1), sqrt1); Integer factor2 = Integer::Multiplication( Integer::Multiplication(n2, d2), Integer::Multiplication(Integer::Power(d1, Integer(2)), q1)); - Multiplication m2 = Multiplication(Rational(factor2), sqrt2); + Multiplication m2 = Multiplication::Builder(Rational(factor2), sqrt2); Expression numerator; if (denominator.isNegative()) { - numerator = Subtraction(m2, m1); + numerator = Subtraction::Builder(m2, m1); denominator.setNegative(false); } else { - numerator = Subtraction(m1, m2); + numerator = Subtraction::Builder(m1, m2); } if (denominator.isOverflow() || factor1.isOverflow() || factor2.isOverflow() || pq1.isOverflow() || pq2.isOverflow()) { return result; // Escape } numerator = numerator.deepReduce(context, complexFormat, angleUnit, ExpressionNode::ReductionTarget::User); Integer one(1); - result = Multiplication(numerator, Rational(one, denominator)); + result = Multiplication::Builder(numerator, Rational(one, denominator)); } if (!result.isUninitialized()) { @@ -1127,13 +1123,13 @@ bool Power::isNthRootOfUnity() const { Expression Power::equivalentExpressionUsingStandardExpression() const { if (childAtIndex(1).type() == ExpressionNode::Type::Rational) { if (childAtIndex(1).convert().isMinusOne()) { - return Division(Rational(1), childAtIndex(0).clone()); + return Division::Builder(Rational(1), childAtIndex(0).clone()); } if (childAtIndex(1).convert().isHalf()) { return SquareRoot::Builder(childAtIndex(0).clone()); } if (childAtIndex(1).convert().isMinusHalf()) { - return Division(Rational(1), SquareRoot::Builder(childAtIndex(0).clone())); + return Division::Builder(Rational(1), SquareRoot::Builder(childAtIndex(0).clone())); } } return Expression(); @@ -1144,7 +1140,7 @@ Expression Power::CreateComplexExponent(const Expression & r, Context & context, const Constant exp = Constant(Ion::Charset::Exponential); Constant iComplex = Constant(Ion::Charset::IComplex); const Constant pi = Constant(Ion::Charset::SmallPi); - Multiplication mExp = Multiplication(iComplex, pi, r.clone()); + Multiplication mExp = Multiplication::Builder(iComplex, pi, r.clone()); iComplex.shallowReduce(context, complexFormat, angleUnit, target); Power p(exp, mExp); mExp.shallowReduce(context, complexFormat, angleUnit, target); @@ -1152,11 +1148,11 @@ Expression Power::CreateComplexExponent(const Expression & r, Context & context, #if 0 const Constant iComplex = Constant(Ion::Charset::IComplex); const Constant pi = Constant(Ion::Charset::SmallPi); - Expression op = Multiplication(pi, r).shallowReduce(context, complexFormat, angleUnit, false); + Expression op = Multiplication::Builder(pi, r).shallowReduce(context, complexFormat, angleUnit, false); Cosine cos = Cosine(op).shallowReduce(context, complexFormat, angleUnit, false);; Sine sin = Sine(op).shallowReduce(context, complexFormat, angleUnit, false); - Expression m = Multiplication(iComplex, sin); - Expression a = Addition(cos, m); + Expression m = Multiplication::Builder(iComplex, sin); + Expression a = Addition::Builder(cos, m); const Expression * multExpOperands[3] = {pi, r->clone()}; #endif } diff --git a/poincare/src/prediction_interval.cpp b/poincare/src/prediction_interval.cpp index 12b438031..fd8074ee3 100644 --- a/poincare/src/prediction_interval.cpp +++ b/poincare/src/prediction_interval.cpp @@ -95,11 +95,11 @@ Expression PredictionInterval::shallowReduce(Context & context, Preferences::Com return *this; } // Compute sqr = sqrt(r0*(1-r0)/r1) - Expression sqr = Power(Division(numerator, r1), Rational(1, 2)); - Expression m = Multiplication(Rational(196, 100), sqr); - Matrix matrix; - matrix.addChildAtIndexInPlace(Addition(r0.clone(), Multiplication(Rational(-1), m.clone())), 0, 0); - matrix.addChildAtIndexInPlace(Addition(r0.clone(), m), 1, 1); + Expression sqr = Power::Builder(Division::Builder(numerator, r1), Rational(1, 2)); + Expression m = Multiplication::Builder(Rational(196, 100), sqr); + Matrix matrix = Matrix::Builder(); + matrix.addChildAtIndexInPlace(Addition::Builder(r0.clone(), Multiplication::Builder(Rational(-1), m.clone())), 0, 0); + matrix.addChildAtIndexInPlace(Addition::Builder(r0.clone(), m), 1, 1); matrix.setDimensions(1, 2); replaceWithInPlace(matrix); matrix.deepReduceChildren(context, complexFormat, angleUnit, target); diff --git a/poincare/src/product.cpp b/poincare/src/product.cpp index caa9be26c..f855e9974 100644 --- a/poincare/src/product.cpp +++ b/poincare/src/product.cpp @@ -19,7 +19,7 @@ Expression ProductNode::replaceUnknown(const Symbol & symbol) { } Layout ProductNode::createSequenceLayout(Layout argumentLayout, Layout symbolLayout, Layout subscriptLayout, Layout superscriptLayout) const { - return ProductLayout(argumentLayout, symbolLayout, subscriptLayout, superscriptLayout); + return ProductLayout::Builder(argumentLayout, symbolLayout, subscriptLayout, superscriptLayout); } int ProductNode::serialize(char * buffer, int bufferSize, Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { diff --git a/poincare/src/rational.cpp b/poincare/src/rational.cpp index bccd82fb1..504aa05cf 100644 --- a/poincare/src/rational.cpp +++ b/poincare/src/rational.cpp @@ -111,7 +111,7 @@ Layout RationalNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, return numeratorLayout; } HorizontalLayout denominatorLayout = denominator().createLayout(); - return FractionLayout(numeratorLayout, denominatorLayout); + return FractionLayout::Builder(numeratorLayout, denominatorLayout); } // Approximation @@ -266,7 +266,7 @@ Expression Rational::shallowReduce() { Expression Rational::shallowBeautify() { if (sign() == ExpressionNode::Sign::Negative) { Expression abs = setSign(ExpressionNode::Sign::Positive); - Opposite o; + Opposite o = Opposite::Builder(); replaceWithInPlace(o); o.replaceChildAtIndexInPlace(0, abs); return o; diff --git a/poincare/src/right_parenthesis_layout.cpp b/poincare/src/right_parenthesis_layout.cpp index e6a305113..d38345f20 100644 --- a/poincare/src/right_parenthesis_layout.cpp +++ b/poincare/src/right_parenthesis_layout.cpp @@ -59,6 +59,4 @@ void RightParenthesisLayoutNode::render(KDContext * ctx, KDPoint p, KDColor expr RenderWithChildHeight(ParenthesisLayoutNode::ChildHeightGivenLayoutHeight(layoutSize().height()), ctx, p, expressionColor, backgroundColor); } -RightParenthesisLayout::RightParenthesisLayout() : Layout(TreePool::sharedPool()->createTreeNode()) {} - } diff --git a/poincare/src/right_square_bracket_layout.cpp b/poincare/src/right_square_bracket_layout.cpp index f5b6aecc4..cd1608a02 100644 --- a/poincare/src/right_square_bracket_layout.cpp +++ b/poincare/src/right_square_bracket_layout.cpp @@ -8,6 +8,4 @@ void RightSquareBracketLayoutNode::render(KDContext * ctx, KDPoint p, KDColor ex ctx->fillRect(KDRect(p.x()+k_widthMargin-k_bracketWidth+1, p.y() + childHeight(), k_bracketWidth, k_lineThickness), expressionColor); } -RightSquareBracketLayout::RightSquareBracketLayout() : Layout(TreePool::sharedPool()->createTreeNode()) {} - } diff --git a/poincare/src/sign_function.cpp b/poincare/src/sign_function.cpp index 74cd540b3..340beb9a8 100644 --- a/poincare/src/sign_function.cpp +++ b/poincare/src/sign_function.cpp @@ -83,7 +83,7 @@ Expression SignFunction::shallowReduce(Context & context, Preferences::ComplexFo return *this; } Expression sign = *this; - Multiplication m(Rational(-1)); + Multiplication m = Multiplication::Builder(Rational(-1)); replaceWithInPlace(m); m.addChildAtIndexInPlace(sign, 1, 1); // sign does not need to be shallowReduced because -x = NAN --> x = NAN return m; // m does not need to be shallowReduced, -1*sign cannot be reduced diff --git a/poincare/src/simplification_helper.cpp b/poincare/src/simplification_helper.cpp index ce828c6a4..4b3220212 100644 --- a/poincare/src/simplification_helper.cpp +++ b/poincare/src/simplification_helper.cpp @@ -7,7 +7,7 @@ namespace Poincare { Expression SimplificationHelper::Map(const Expression & e, Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) { assert(e->numberOfChildren() == 1 && e->childAtIndex(0)->type() == ExpressionNode::Type::Matrix); Expression c = e.childAtIndex(0); - Matrix matrix; + Matrix matrix = Matrix::Builder(); for (int i = 0; i < c->numberOfChildren(); i++) { Expression f = e.replaceChildAtIndexInPlace(0, e.childAtIndex(0).childAtIndex(i)); matrix.addChildAtIndexInPlace(f, i, i); diff --git a/poincare/src/square_root.cpp b/poincare/src/square_root.cpp index 438dab169..8438dd663 100644 --- a/poincare/src/square_root.cpp +++ b/poincare/src/square_root.cpp @@ -19,7 +19,7 @@ constexpr Expression::FunctionHelper SquareRoot::s_functionHelper; int SquareRootNode::numberOfChildren() const { return SquareRoot::s_functionHelper.numberOfChildren(); } Layout SquareRootNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { - return NthRootLayout(childAtIndex(0)->createLayout(floatDisplayMode, numberOfSignificantDigits)); + return NthRootLayout::Builder(childAtIndex(0)->createLayout(floatDisplayMode, numberOfSignificantDigits)); } int SquareRootNode::serialize(char * buffer, int bufferSize, Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { @@ -54,7 +54,7 @@ Expression SquareRoot::shallowReduce(Context & context, Preferences::ComplexForm return SimplificationHelper::Map(this, context, angleUnit); } #endif - Power p = Power(childAtIndex(0), Rational(1, 2)); + Power p = Power::Builder(childAtIndex(0), Rational(1, 2)); replaceWithInPlace(p); return p.shallowReduce(context, complexFormat, angleUnit, target); } diff --git a/poincare/src/store.cpp b/poincare/src/store.cpp index 7039a3fd9..1c1bdc2f3 100644 --- a/poincare/src/store.cpp +++ b/poincare/src/store.cpp @@ -32,7 +32,7 @@ int StoreNode::serialize(char * buffer, int bufferSize, Preferences::PrintFloatM } Layout StoreNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { - HorizontalLayout result = HorizontalLayout(); + HorizontalLayout result = HorizontalLayout::Builder(); result.addOrMergeChildAtIndex(childAtIndex(0)->createLayout(floatDisplayMode, numberOfSignificantDigits), 0, false); result.addChildAtIndex(CharLayout(Ion::Charset::Sto), result.numberOfChildren(), result.numberOfChildren(), nullptr); result.addOrMergeChildAtIndex(childAtIndex(1)->createLayout(floatDisplayMode, numberOfSignificantDigits), result.numberOfChildren(), false); diff --git a/poincare/src/subtraction.cpp b/poincare/src/subtraction.cpp index 73daf456b..4dabad1b0 100644 --- a/poincare/src/subtraction.cpp +++ b/poincare/src/subtraction.cpp @@ -56,15 +56,13 @@ Expression SubtractionNode::shallowReduce(Context & context, Preferences::Comple return Subtraction(this).shallowReduce(context, complexFormat, angleUnit, target); } -Subtraction::Subtraction() : Expression(TreePool::sharedPool()->createTreeNode()) {} - Expression Subtraction::shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target) { Expression e = Expression::defaultShallowReduce(); if (e.isUndefined()) { return e; } - Expression m = Multiplication(Rational(-1), childAtIndex(1)); - Addition a(childAtIndex(0), m); + Expression m = Multiplication::Builder(Rational(-1), childAtIndex(1)); + Addition a = Addition::Builder(childAtIndex(0), m); m = m.shallowReduce(context, complexFormat, angleUnit, target); replaceWithInPlace(a); return a.shallowReduce(context, complexFormat, angleUnit, target); diff --git a/poincare/src/sum.cpp b/poincare/src/sum.cpp index 9c7a5305b..ffc0620ad 100644 --- a/poincare/src/sum.cpp +++ b/poincare/src/sum.cpp @@ -19,7 +19,7 @@ Expression SumNode::replaceUnknown(const Symbol & symbol) { } Layout SumNode::createSequenceLayout(Layout argumentLayout, Layout symbolLayout, Layout subscriptLayout, Layout superscriptLayout) const { - return SumLayout(argumentLayout, symbolLayout, subscriptLayout, superscriptLayout); + return SumLayout::Builder(argumentLayout, symbolLayout, subscriptLayout, superscriptLayout); } int SumNode::serialize(char * buffer, int bufferSize, Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { diff --git a/poincare/src/symbol.cpp b/poincare/src/symbol.cpp index 97144e75e..f497b5458 100644 --- a/poincare/src/symbol.cpp +++ b/poincare/src/symbol.cpp @@ -80,30 +80,30 @@ Layout SymbolNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, in return CharLayout(Symbol::k_unknownXReadableChar); } if (strcmp(m_name, "u(n)") == 0) { - return HorizontalLayout( + return HorizontalLayout::Builder( CharLayout('u'), - VerticalOffsetLayout( + VerticalOffsetLayout::Builder( CharLayout('n'), VerticalOffsetLayoutNode::Type::Subscript)); } if (strcmp(m_name, "u(n+1)") == 0) { - return HorizontalLayout( + return HorizontalLayout::Builder( CharLayout('u'), - VerticalOffsetLayout( + VerticalOffsetLayout::Builder( LayoutHelper::String("n+1", 3), VerticalOffsetLayoutNode::Type::Subscript)); } if (strcmp(m_name, "v(n)") == 0) { - return HorizontalLayout( + return HorizontalLayout::Builder( CharLayout('v'), - VerticalOffsetLayout( + VerticalOffsetLayout::Builder( CharLayout('n'), VerticalOffsetLayoutNode::Type::Subscript)); } if (strcmp(m_name, "v(n+1)") == 0) { - return HorizontalLayout( + return HorizontalLayout::Builder( CharLayout('v'), - VerticalOffsetLayout( + VerticalOffsetLayout::Builder( LayoutHelper::String("n+1", 3), VerticalOffsetLayoutNode::Type::Subscript)); } @@ -173,7 +173,7 @@ Expression Symbol::replaceSymbolWithExpression(const SymbolAbstract & symbol, co Expression value = expression.clone(); Expression p = parent(); if (!p.isUninitialized() && p.node()->childNeedsParenthesis(value.node())) { - value = Parenthesis(value); + value = Parenthesis::Builder(value); } replaceWithInPlace(value); return value; diff --git a/poincare/src/tangent.cpp b/poincare/src/tangent.cpp index 6d9e7dd1a..01510753c 100644 --- a/poincare/src/tangent.cpp +++ b/poincare/src/tangent.cpp @@ -54,7 +54,7 @@ Expression Tangent::shallowReduce(Context & context, Preferences::ComplexFormat if (newExpression.type() == ExpressionNode::Type::Tangent) { Sine s = Sine::Builder(newExpression.childAtIndex(0).clone()); Cosine c = Cosine::Builder(newExpression.childAtIndex(0)); - Division d = Division(s, c); + Division d = Division::Builder(s, c); s.shallowReduce(context, complexFormat, angleUnit, target); c.shallowReduce(context, complexFormat, angleUnit, target); newExpression.replaceWithInPlace(d); diff --git a/poincare/src/tree_handle.cpp b/poincare/src/tree_handle.cpp index 1ae1abe60..51cd46dc0 100644 --- a/poincare/src/tree_handle.cpp +++ b/poincare/src/tree_handle.cpp @@ -69,7 +69,7 @@ void TreeHandle::replaceChildAtIndexInPlace(int oldChildIndex, TreeHandle newChi } void TreeHandle::replaceChildWithGhostInPlace(TreeHandle t) { - Ghost ghost; + Ghost ghost = Ghost::Builder(); return replaceChildInPlace(t, ghost); } diff --git a/poincare/src/trigonometry.cpp b/poincare/src/trigonometry.cpp index a3832d366..1daeec03f 100644 --- a/poincare/src/trigonometry.cpp +++ b/poincare/src/trigonometry.cpp @@ -105,12 +105,12 @@ Expression Trigonometry::shallowReduceDirectFunction(Expression & e, Context& co // These equalities are true on complexes if ((e.type() == ExpressionNode::Type::Cosine && e.childAtIndex(0).type() == ExpressionNode::Type::ArcSine) || (e.type() == ExpressionNode::Type::Sine && e.childAtIndex(0).type() == ExpressionNode::Type::ArcCosine)) { Expression sqrt = - Power( - Addition( + Power::Builder( + Addition::Builder( Rational(1), - Multiplication( + Multiplication::Builder( Rational(-1), - Power(e.childAtIndex(0).childAtIndex(0), Rational(2)) + Power::Builder(e.childAtIndex(0).childAtIndex(0), Rational(2)) ) ), Rational(1,2) @@ -134,10 +134,10 @@ Expression Trigonometry::shallowReduceDirectFunction(Expression & e, Context& co Expression x = e.childAtIndex(0).childAtIndex(0); // Build 1/sqrt(1+x^2) Expression res = - Power( - Addition( + Power::Builder( + Addition::Builder( Rational(1), - Power( + Power::Builder( e.type() == ExpressionNode::Type::Cosine ? x : x.clone(), Rational(2)) ), @@ -149,7 +149,7 @@ Expression Trigonometry::shallowReduceDirectFunction(Expression & e, Context& co // reduce 1+*x^2 res.childAtIndex(0).shallowReduce(context, complexFormat, angleUnit, target); if (e.type() == ExpressionNode::Type::Sine) { - res = Multiplication(x, res); + res = Multiplication::Builder(x, res); // reduce (1+x^2)^(-1/2) res.childAtIndex(0).shallowReduce(context, complexFormat, angleUnit, target); } @@ -167,7 +167,7 @@ Expression Trigonometry::shallowReduceDirectFunction(Expression & e, Context& co return e.shallowReduce(context, complexFormat, angleUnit, target); } else { // sin(-a) = -sin(a) or tan(-a) = -tan(a) - Multiplication m(Rational(-1)); + Multiplication m = Multiplication::Builder(Rational(-1)); e.replaceWithInPlace(m); m.addChildAtIndexInPlace(e, 1, 1); e.shallowReduce(context, complexFormat, angleUnit, target); @@ -233,7 +233,7 @@ Expression Trigonometry::shallowReduceDirectFunction(Expression & e, Context& co unaryCoefficient *= -1; } Expression simplifiedCosine = e.shallowReduce(context, complexFormat, angleUnit, target); // recursive - Multiplication m = Multiplication(Rational(unaryCoefficient)); + Multiplication m = Multiplication::Builder(Rational(unaryCoefficient)); simplifiedCosine.replaceWithInPlace(m); m.addChildAtIndexInPlace(simplifiedCosine, 1, 1); return m.shallowReduce(context, complexFormat, angleUnit, target); @@ -278,12 +278,12 @@ Expression Trigonometry::shallowReduceInverseFunction(Expression & e, Context& c * reduced to undef) */ if (target == ExpressionNode::ReductionTarget::User || x.isNumber()) { Expression sign = SignFunction::Builder(x.clone()); - Multiplication m0(Rational(1,2), sign, Constant(Ion::Charset::SmallPi)); + Multiplication m0 = Multiplication::Builder(Rational(1,2), sign, Constant(Ion::Charset::SmallPi)); sign.shallowReduce(context, complexFormat, angleUnit, target); e.replaceChildAtIndexInPlace(0, x); - Addition a(m0); + Addition a = Addition::Builder(m0); e.replaceWithInPlace(a); - Multiplication m1(Rational(-1), e); + Multiplication m1 = Multiplication::Builder(Rational(-1), e); e.shallowReduce(context, complexFormat, angleUnit, target); a.addChildAtIndexInPlace(m1, 1, 1); return a.shallowReduce(context, complexFormat, angleUnit, target); @@ -315,7 +315,7 @@ Expression Trigonometry::shallowReduceInverseFunction(Expression & e, Context& c // acos(-x) = pi-acos(x) if (e.type() == ExpressionNode::Type::ArcCosine) { Expression pi = angleUnit == Preferences::AngleUnit::Radian ? static_cast(Constant(Ion::Charset::SmallPi)) : static_cast(Rational(180)); - Subtraction s; + Subtraction s = Subtraction::Builder(); e.replaceWithInPlace(s); s.replaceChildAtIndexInPlace(0, pi); s.replaceChildAtIndexInPlace(1, e); @@ -323,7 +323,7 @@ Expression Trigonometry::shallowReduceInverseFunction(Expression & e, Context& c return s.shallowReduce(context, complexFormat, angleUnit, target); } else { // asin(-x) = -asin(x) or atan(-x) = -atan(x) - Multiplication m(Rational(-1)); + Multiplication m = Multiplication::Builder(Rational(-1)); e.replaceWithInPlace(m); m.addChildAtIndexInPlace(e, 1, 1); e.shallowReduce(context, complexFormat, angleUnit, target); diff --git a/poincare/src/vertical_offset_layout.cpp b/poincare/src/vertical_offset_layout.cpp index 582b96208..69feb1557 100644 --- a/poincare/src/vertical_offset_layout.cpp +++ b/poincare/src/vertical_offset_layout.cpp @@ -231,7 +231,7 @@ bool VerticalOffsetLayoutNode::willAddSibling(LayoutCursor * cursor, LayoutNode // Add the Left parenthesis int idxInParent = parentRef.indexOfChild(thisRef); int leftParenthesisIndex = idxInParent; - LeftParenthesisLayout leftParenthesis = LeftParenthesisLayout(); + LeftParenthesisLayout leftParenthesis = LeftParenthesisLayout::Builder(); int numberOfOpenParenthesis = 0; while (leftParenthesisIndex > 0 && parentRef.childAtIndex(leftParenthesisIndex-1).isCollapsable(&numberOfOpenParenthesis, true)) @@ -242,7 +242,7 @@ bool VerticalOffsetLayoutNode::willAddSibling(LayoutCursor * cursor, LayoutNode idxInParent = parentRef.indexOfChild(thisRef); // Add the Right parenthesis - RightParenthesisLayout rightParenthesis = RightParenthesisLayout(); + RightParenthesisLayout rightParenthesis = RightParenthesisLayout::Builder(); if (cursor->position() == LayoutCursor::Position::Right) { parentRef.addChildAtIndex(rightParenthesis, idxInParent + 1, parentRef.numberOfChildren(), nullptr); } else { @@ -266,11 +266,4 @@ LayoutNode * VerticalOffsetLayoutNode::baseLayout() { return parentNode->childAtIndex(idxInParent - 1); } -VerticalOffsetLayout::VerticalOffsetLayout(Layout l, VerticalOffsetLayoutNode::Type type) : - Layout(TreePool::sharedPool()->createTreeNode()) -{ - static_cast(node())->setType(type); - replaceChildAtIndexInPlace(0,l); -} - } diff --git a/poincare/test/addition.cpp b/poincare/test/addition.cpp index f47829f2f..49803abba 100644 --- a/poincare/test/addition.cpp +++ b/poincare/test/addition.cpp @@ -24,7 +24,7 @@ static inline void assert_parsed_expression_is_equal_to(const char * exp, Expres QUIZ_CASE(poincare_addition_cast_does_not_copy) { Rational i1(1); Rational i2(2); - Addition j(i1, i2); + Addition j = Addition::Builder(i1, i2); Expression k = j; quiz_assert(k.identifier() == (static_cast(k)).identifier()); quiz_assert(i1.identifier() == (static_cast(i1)).identifier()); @@ -34,14 +34,14 @@ QUIZ_CASE(poincare_addition_cast_does_not_copy) { QUIZ_CASE(poincare_addition_without_parsing) { Rational i1(1); Rational i2(2); - Addition j(i1, i2); + Addition j = Addition::Builder(i1, i2); assert_approximation_equals(j, 3.0f); } QUIZ_CASE(poincare_addition_parsing) { Rational i1(1); Rational i2(2); - Addition j1(i1, i2); + Addition j1 = Addition::Builder(i1, i2); assert_parsed_expression_is_equal_to("1+2", j1); } diff --git a/poincare/test/expression_order.cpp b/poincare/test/expression_order.cpp index 9db677bb9..2b2ca3408 100644 --- a/poincare/test/expression_order.cpp +++ b/poincare/test/expression_order.cpp @@ -23,8 +23,8 @@ void assert_multiplication_or_addition_is_ordered_as(Expression e1, Expression e QUIZ_CASE(poincare_expression_order) { { // 2 * 5 - Expression e1 = Multiplication(Rational(5), Rational(2)); - Expression e2 = Multiplication(Rational(2), Rational(5)); + Expression e1 = Multiplication::Builder(Rational(5), Rational(2)); + Expression e2 = Multiplication::Builder(Rational(2), Rational(5)); assert_multiplication_or_addition_is_ordered_as(e1, e2); } { @@ -32,8 +32,8 @@ QUIZ_CASE(poincare_expression_order) { constexpr int numberOfChildren = 3; Expression children[numberOfChildren] = {Rational(1), Rational(2), Rational(0)}; Expression childrenSorted[numberOfChildren] = {Rational(2), Rational(1), Rational(0)}; - Expression e1 = Addition(children, numberOfChildren); - Expression e2 = Addition(childrenSorted, numberOfChildren); + Expression e1 = Addition::Builder(children, numberOfChildren); + Expression e2 = Addition::Builder(childrenSorted, numberOfChildren); assert_multiplication_or_addition_is_ordered_as(e1, e2); } { @@ -44,65 +44,65 @@ QUIZ_CASE(poincare_expression_order) { constexpr int numberOfChildren = 3; Expression children[numberOfChildren] = {pi.clone(), i.clone(), e.clone()}; Expression childrenSorted[numberOfChildren] = {e, pi, i}; - Expression e1 = Addition(children, numberOfChildren); - Expression e2 = Addition(childrenSorted, numberOfChildren); + Expression e1 = Addition::Builder(children, numberOfChildren); + Expression e2 = Addition::Builder(childrenSorted, numberOfChildren); assert_multiplication_or_addition_is_ordered_as(e1, e2); } { // 2 * root(3) - Expression e1 = Multiplication(SquareRoot::Builder(Rational(3)), Rational(2)); - Expression e2 = Multiplication(Rational(2), SquareRoot::Builder(Rational(3))); + Expression e1 = Multiplication::Builder(SquareRoot::Builder(Rational(3)), Rational(2)); + Expression e2 = Multiplication::Builder(Rational(2), SquareRoot::Builder(Rational(3))); assert_multiplication_or_addition_is_ordered_as(e1, e2); } { constexpr int numberOfChildren = 4; Expression children[numberOfChildren] = { Symbol('c'), - Power(Symbol('b'), Rational(2)), - Power(Symbol('a'), Rational(2)), + Power::Builder(Symbol('b'), Rational(2)), + Power::Builder(Symbol('a'), Rational(2)), Symbol('a') }; Expression childrenSorted[numberOfChildren] = { - Power(Symbol('a'), Rational(2)), + Power::Builder(Symbol('a'), Rational(2)), Symbol('a'), - Power(Symbol('b'), Rational(2)), + Power::Builder(Symbol('b'), Rational(2)), Symbol('c') }; // a^2 + a + b^2 + c - Expression e1 = Addition(children, numberOfChildren); - Expression e2 = Addition(childrenSorted, numberOfChildren); + Expression e1 = Addition::Builder(children, numberOfChildren); + Expression e2 = Addition::Builder(childrenSorted, numberOfChildren); assert_multiplication_or_addition_is_ordered_as(e1, e2); } { // 2*x^3 + 3*x^2 - Expression child1 = Multiplication(Rational(2), Power(Symbol('x'), Rational(3))); - Expression child2 = Multiplication(Rational(3), Power(Symbol('x'), Rational(2))); - Expression e1 = Addition(child2.clone(), child1.clone()); - Expression e2 = Addition(child1, child2); + Expression child1 = Multiplication::Builder(Rational(2), Power::Builder(Symbol('x'), Rational(3))); + Expression child2 = Multiplication::Builder(Rational(3), Power::Builder(Symbol('x'), Rational(2))); + Expression e1 = Addition::Builder(child2.clone(), child1.clone()); + Expression e2 = Addition::Builder(child1, child2); assert_multiplication_or_addition_is_ordered_as(e1, e2); } { // 3*x + 2*x - Expression child1 = Multiplication(Rational(3), Symbol('x')); - Expression child2 = Multiplication(Rational(2), Symbol('x')); - Expression e1 = Addition(child2.clone(), child1.clone()); - Expression e2 = Addition(child1, child2); + Expression child1 = Multiplication::Builder(Rational(3), Symbol('x')); + Expression child2 = Multiplication::Builder(Rational(2), Symbol('x')); + Expression e1 = Addition::Builder(child2.clone(), child1.clone()); + Expression e2 = Addition::Builder(child1, child2); assert_multiplication_or_addition_is_ordered_as(e1, e2); } { // pi^a * pi^b - Expression child1 = Power(Constant(Ion::Charset::SmallPi), Symbol('a')); - Expression child2 = Power(Constant(Ion::Charset::SmallPi), Symbol('b')); - Expression e1 = Multiplication(child2.clone(), child1.clone()); - Expression e2 = Multiplication(child1, child2); + Expression child1 = Power::Builder(Constant(Ion::Charset::SmallPi), Symbol('a')); + Expression child2 = Power::Builder(Constant(Ion::Charset::SmallPi), Symbol('b')); + Expression e1 = Multiplication::Builder(child2.clone(), child1.clone()); + Expression e2 = Multiplication::Builder(child1, child2); assert_multiplication_or_addition_is_ordered_as(e1, e2); } { // pi^2 * pi^3 - Expression child1 = Power(Constant(Ion::Charset::SmallPi), Rational(2)); - Expression child2 = Power(Constant(Ion::Charset::SmallPi), Rational(3)); - Expression e1 = Multiplication(child2.clone(), child1.clone()); - Expression e2 = Multiplication(child1, child2); + Expression child1 = Power::Builder(Constant(Ion::Charset::SmallPi), Rational(2)); + Expression child2 = Power::Builder(Constant(Ion::Charset::SmallPi), Rational(3)); + Expression e1 = Multiplication::Builder(child2.clone(), child1.clone()); + Expression e2 = Multiplication::Builder(child1, child2); assert_multiplication_or_addition_is_ordered_as(e1, e2); } diff --git a/poincare/test/fraction_layout.cpp b/poincare/test/fraction_layout.cpp index 095721bd5..9d38c8691 100644 --- a/poincare/test/fraction_layout.cpp +++ b/poincare/test/fraction_layout.cpp @@ -25,8 +25,8 @@ QUIZ_CASE(poincare_fraction_layout_delete) { * --- -> "BackSpace" -> 12|34 * |34 * */ - HorizontalLayout layout1 = HorizontalLayout( - FractionLayout( + HorizontalLayout layout1 = HorizontalLayout::Builder( + FractionLayout::Builder( LayoutHelper::String("12", 2), LayoutHelper::String("34", 2) ) @@ -40,10 +40,10 @@ QUIZ_CASE(poincare_fraction_layout_delete) { * 1 + --- -> "BackSpace" -> 1+|3 * |3 * */ - HorizontalLayout layout2 = HorizontalLayout( + HorizontalLayout layout2 = HorizontalLayout::Builder( CharLayout('1'), CharLayout('+'), - FractionLayout( + FractionLayout::Builder( EmptyLayout(), CharLayout('3') ) @@ -55,7 +55,7 @@ QUIZ_CASE(poincare_fraction_layout_delete) { } QUIZ_CASE(poincare_fraction_layout_serialize) { - FractionLayout layout = FractionLayout( + FractionLayout layout = FractionLayout::Builder( CharLayout('1'), LayoutHelper::String("2+3", 3) ); diff --git a/poincare/test/layouts.cpp b/poincare/test/layouts.cpp index dff41720e..a69665b59 100644 --- a/poincare/test/layouts.cpp +++ b/poincare/test/layouts.cpp @@ -43,31 +43,37 @@ void assert_parsed_layout_is(Layout l, Poincare::Expression r) { QUIZ_CASE(poincare_create_all_layouts) { EmptyLayout e0; - AbsoluteValueLayout e1(e0); + AbsoluteValueLayout e1 = AbsoluteValueLayout::Builder(e0); CharLayout e2('a'); - BinomialCoefficientLayout e3(e1, e2); - CeilingLayout e4(e3); - RightParenthesisLayout e5; - RightSquareBracketLayout e6; - CondensedSumLayout e7(e4, e5, e6); - ConjugateLayout e8(e7); - LeftParenthesisLayout e10; - FloorLayout e11(e10); - FractionLayout e12(e8, e11); - HorizontalLayout e13; - LeftSquareBracketLayout e14; - IntegralLayout e15(e11, e12, e13, e14); - NthRootLayout e16(e15); - MatrixLayout e17; + BinomialCoefficientLayout e3 = BinomialCoefficientLayout::Builder(e1, e2); + CeilingLayout e4 = CeilingLayout::Builder(e3); + RightParenthesisLayout e5 = RightParenthesisLayout::Builder(); + RightSquareBracketLayout e6 = RightSquareBracketLayout::Builder(); + CondensedSumLayout e7 = CondensedSumLayout::Builder(e4, e5, e6); + ConjugateLayout e8 = ConjugateLayout::Builder(e7); + LeftParenthesisLayout e10 = LeftParenthesisLayout::Builder(); + FloorLayout e11 = FloorLayout::Builder(e10); + FractionLayout e12 = FractionLayout::Builder(e8, e11); + HorizontalLayout e13 = HorizontalLayout::Builder(); + LeftSquareBracketLayout e14 = LeftSquareBracketLayout::Builder(); + IntegralLayout e15 = IntegralLayout::Builder(e11, e12, e13, e14); + NthRootLayout e16 = NthRootLayout::Builder(e15); + MatrixLayout e17 = MatrixLayout::Builder(); EmptyLayout e18; EmptyLayout e19; EmptyLayout e20; - ProductLayout e21(e17, e18, e19, e20); + ProductLayout e21 = ProductLayout::Builder(e17, e18, e19, e20); EmptyLayout e22; EmptyLayout e23; EmptyLayout e24; - SumLayout e25(e21, e22, e23, e24); - VerticalOffsetLayout e26(e25, VerticalOffsetLayoutNode::Type::Superscript); + SumLayout e25 = SumLayout::Builder(e21, e22, e23, e24); + VerticalOffsetLayout e26 = VerticalOffsetLayout::Builder(e25, VerticalOffsetLayoutNode::Type::Superscript); +} + +Matrix BuildOneChildMatrix(Expression entry) { + Matrix m = Matrix::Builder(); + m.addChildAtIndexInPlace(entry, 0, 0); + return m; } QUIZ_CASE(poincare_parse_layouts) { @@ -75,31 +81,31 @@ QUIZ_CASE(poincare_parse_layouts) { Expression e; // 1+2 - l = HorizontalLayout( + l = HorizontalLayout::Builder( CharLayout('1'), CharLayout('+'), CharLayout('2')); - e = Addition(Rational(1), Rational(2)); + e = Addition::Builder(Rational(1), Rational(2)); assert_parsed_layout_is(l, e); // |3+3/6| - l = AbsoluteValueLayout( - HorizontalLayout( + l = AbsoluteValueLayout:: Builder( + HorizontalLayout::Builder( CharLayout('3'), CharLayout('+'), - FractionLayout( + FractionLayout::Builder( CharLayout('3'), CharLayout('6')))); e = AbsoluteValue::Builder( - Addition( + Addition::Builder( Rational(3), - Division( + Division::Builder( Rational(3), Rational(6)))); assert_parsed_layout_is(l, e); // binCoef(4,5) - l = BinomialCoefficientLayout( + l = BinomialCoefficientLayout::Builder( CharLayout('4'), CharLayout('5')); e = BinomialCoefficient::Builder( @@ -108,8 +114,8 @@ QUIZ_CASE(poincare_parse_layouts) { assert_parsed_layout_is(l, e); // ceil(4.6) - l = CeilingLayout( - HorizontalLayout( + l = CeilingLayout::Builder( + HorizontalLayout::Builder( CharLayout('4'), CharLayout('.'), CharLayout('6'))); @@ -118,8 +124,8 @@ QUIZ_CASE(poincare_parse_layouts) { assert_parsed_layout_is(l, e); // floor(7.2) - l = FloorLayout( - HorizontalLayout( + l = FloorLayout::Builder( + HorizontalLayout::Builder( CharLayout('7'), CharLayout('.'), CharLayout('2'))); @@ -128,30 +134,30 @@ QUIZ_CASE(poincare_parse_layouts) { assert_parsed_layout_is(l, e); // 2^(3+4) - l = HorizontalLayout( + l = HorizontalLayout::Builder( CharLayout('2'), - VerticalOffsetLayout( - HorizontalLayout( + VerticalOffsetLayout::Builder( + HorizontalLayout::Builder( CharLayout('3'), CharLayout('+'), CharLayout('4')), VerticalOffsetLayoutNode::Type::Superscript)); - e = Power( + e = Power::Builder( Rational(2), - Addition( + Addition::Builder( Rational(3), Rational(4))); assert_parsed_layout_is(l, e); // log_3(2) - HorizontalLayout l1 = HorizontalLayout(); + HorizontalLayout l1 = HorizontalLayout::Builder(); l1.addChildAtIndex(CharLayout('l'), l1.numberOfChildren(), l1.numberOfChildren(), nullptr); l1.addChildAtIndex(CharLayout('o'), l1.numberOfChildren(), l1.numberOfChildren(), nullptr); l1.addChildAtIndex(CharLayout('g'), l1.numberOfChildren(), l1.numberOfChildren(), nullptr); - l1.addChildAtIndex(VerticalOffsetLayout(CharLayout('3'), VerticalOffsetLayoutNode::Type::Subscript), l1.numberOfChildren(), l1.numberOfChildren(), nullptr); - l1.addChildAtIndex(LeftParenthesisLayout(), l1.numberOfChildren(), l1.numberOfChildren(), nullptr); + l1.addChildAtIndex(VerticalOffsetLayout::Builder(CharLayout('3'), VerticalOffsetLayoutNode::Type::Subscript), l1.numberOfChildren(), l1.numberOfChildren(), nullptr); + l1.addChildAtIndex(LeftParenthesisLayout::Builder(), l1.numberOfChildren(), l1.numberOfChildren(), nullptr); l1.addChildAtIndex(CharLayout('2'), l1.numberOfChildren(), l1.numberOfChildren(), nullptr); - l1.addChildAtIndex(RightParenthesisLayout(), l1.numberOfChildren(), l1.numberOfChildren(), nullptr); + l1.addChildAtIndex(RightParenthesisLayout::Builder(), l1.numberOfChildren(), l1.numberOfChildren(), nullptr); l = l1; e = Logarithm::Builder( Rational(2), @@ -159,14 +165,14 @@ QUIZ_CASE(poincare_parse_layouts) { assert_parsed_layout_is(l, e); // root(5,3) - l = NthRootLayout( + l = NthRootLayout::Builder( CharLayout('5'), CharLayout('3')); e = NthRoot::Builder(Rational(5), Rational(3)); assert_parsed_layout_is(l, e); // int(7, x, 4, 5) - l = IntegralLayout( + l = IntegralLayout::Builder( CharLayout('7'), CharLayout('x'), CharLayout('4'), @@ -179,52 +185,52 @@ QUIZ_CASE(poincare_parse_layouts) { assert_parsed_layout_is(l, e); // 2^2 ! - l = HorizontalLayout( + l = HorizontalLayout::Builder( CharLayout('2'), - VerticalOffsetLayout( + VerticalOffsetLayout::Builder( CharLayout('2'), VerticalOffsetLayoutNode::Type::Superscript), CharLayout('!')); - e = Factorial( - Power( + e = Factorial::Builder( + Power::Builder( Rational(2), Rational(2))); assert_parsed_layout_is(l, e); // 5* 6/(7+5) *3 - l = HorizontalLayout( + l = HorizontalLayout::Builder( CharLayout('5'), - FractionLayout( + FractionLayout::Builder( CharLayout('6'), - HorizontalLayout( + HorizontalLayout::Builder( CharLayout('7'), CharLayout('+'), CharLayout('5'))), CharLayout('3')); - e = Multiplication( + e = Multiplication::Builder( Rational(5), - Division( + Division::Builder( Rational(6), - Addition( + Addition::Builder( Rational(7), Rational(5))), Rational(3)); assert_parsed_layout_is(l, e); // [[3^2!, 7][4,5] - l = MatrixLayout( - HorizontalLayout( + l = MatrixLayout::Builder( + HorizontalLayout::Builder( CharLayout('3'), - VerticalOffsetLayout( + VerticalOffsetLayout::Builder( CharLayout('2'), VerticalOffsetLayoutNode::Type::Superscript), CharLayout('!')), CharLayout('7'), CharLayout('4'), CharLayout('5')); - Matrix m = Matrix( - Factorial( - Power( + Matrix m = BuildOneChildMatrix( + Factorial::Builder( + Power::Builder( Rational(3), Rational(2)))); m.addChildAtIndexInPlace(Rational(7), 1, 1); @@ -235,35 +241,35 @@ QUIZ_CASE(poincare_parse_layouts) { assert_parsed_layout_is(l, e); // 2^det([[3!, 7][4,5]) - l = HorizontalLayout( + l = HorizontalLayout::Builder( CharLayout('2'), - VerticalOffsetLayout( - MatrixLayout( - HorizontalLayout( + VerticalOffsetLayout::Builder( + MatrixLayout::Builder( + HorizontalLayout::Builder( CharLayout('3'), CharLayout('!')), CharLayout('7'), CharLayout('4'), CharLayout('5')), VerticalOffsetLayoutNode::Type::Superscript)); - m = Matrix( - Factorial( + m = BuildOneChildMatrix( + Factorial::Builder( Rational(3))); m.addChildAtIndexInPlace(Rational(7), 1, 1); m.addChildAtIndexInPlace(Rational(4), 2, 2); m.addChildAtIndexInPlace(Rational(5), 3, 3); m.setDimensions(2,2); - e = Power(Rational(2), m); + e = Power::Builder(Rational(2), m); assert_parsed_layout_is(l, e); // 2e^3 - l = HorizontalLayout( + l = HorizontalLayout::Builder( CharLayout('2'), CharLayout(Ion::Charset::Exponential), - VerticalOffsetLayout( + VerticalOffsetLayout::Builder( CharLayout('3'), VerticalOffsetLayoutNode::Type::Superscript)); - e = Multiplication(Rational(2),Power(Constant(Ion::Charset::Exponential),Parenthesis(Rational(3)))); - assert_parsed_expression_is("2X^(3)", Multiplication(Rational(2),Power(Constant(Ion::Charset::Exponential),Parenthesis(Rational(3))))); + e = Multiplication::Builder(Rational(2),Power::Builder(Constant(Ion::Charset::Exponential),Parenthesis::Builder(Rational(3)))); + assert_parsed_expression_is("2X^(3)", Multiplication::Builder(Rational(2),Power::Builder(Constant(Ion::Charset::Exponential),Parenthesis::Builder(Rational(3))))); assert_parsed_layout_is(l, e); } diff --git a/poincare/test/parentheses_layout.cpp b/poincare/test/parentheses_layout.cpp index 2518d312a..31cb61069 100644 --- a/poincare/test/parentheses_layout.cpp +++ b/poincare/test/parentheses_layout.cpp @@ -12,18 +12,18 @@ QUIZ_CASE(poincare_parenthesis_layout_size) { * 4 * Assert that the first and last parentheses have the same size. */ - HorizontalLayout layout = HorizontalLayout(); - LeftParenthesisLayout leftPar = LeftParenthesisLayout(); - RightParenthesisLayout rightPar = RightParenthesisLayout(); + HorizontalLayout layout = HorizontalLayout::Builder(); + LeftParenthesisLayout leftPar = LeftParenthesisLayout::Builder(); + RightParenthesisLayout rightPar = RightParenthesisLayout::Builder(); layout.addChildAtIndex(leftPar, 0, 0, nullptr); layout.addChildAtIndex(CharLayout('2'), 1, 1, nullptr); layout.addChildAtIndex(CharLayout('+'), 2, 2, nullptr); - layout.addChildAtIndex(LeftParenthesisLayout(), 3, 3, nullptr); - layout.addChildAtIndex(FractionLayout( + layout.addChildAtIndex(LeftParenthesisLayout::Builder(), 3, 3, nullptr); + layout.addChildAtIndex(FractionLayout::Builder( CharLayout('3'), CharLayout('4')), 4, 4, nullptr); - layout.addChildAtIndex(RightParenthesisLayout(), 4, 4, nullptr); + layout.addChildAtIndex(RightParenthesisLayout::Builder(), 4, 4, nullptr); layout.addChildAtIndex(CharLayout('6'), 5, 5, nullptr); layout.addChildAtIndex(rightPar, 7, 7, nullptr); layout.addChildAtIndex(CharLayout('1'), 8, 8, nullptr); diff --git a/poincare/test/parser.cpp b/poincare/test/parser.cpp index c2f313e25..f8f9cff22 100644 --- a/poincare/test/parser.cpp +++ b/poincare/test/parser.cpp @@ -104,7 +104,7 @@ QUIZ_CASE(poincare_parser_memory_exhaustion) { { Poincare::ExceptionCheckpoint ecp; if (ExceptionRun(ecp)) { - Addition a = Addition(); + Addition a = Addition::Builder(); while (true) { Expression e = Expression::Parse("1+2+3+4+5+6+7+8+9+10"); a.addChildAtIndexInPlace(e, 0, a.numberOfChildren()); @@ -124,65 +124,65 @@ QUIZ_CASE(poincare_parser_memory_exhaustion) { QUIZ_CASE(poincare_parser_parse) { assert_parsed_expression_is("1", Rational(1)); - assert_parsed_expression_is("(1)", Parenthesis(Rational(1))); - assert_parsed_expression_is("((1))", Parenthesis((Expression)Parenthesis(Rational(1)))); - assert_parsed_expression_is("1+2", Addition(Rational(1),Rational(2))); - assert_parsed_expression_is("(1)+2", Addition(Parenthesis(Rational(1)),Rational(2))); - assert_parsed_expression_is("(1+2)", Parenthesis(Addition(Rational(1),Rational(2)))); - assert_parsed_expression_is("1+2+3", Addition(Addition(Rational(1),Rational(2)),Rational(3))); - assert_parsed_expression_is("1+2+(3+4)", Addition(Addition(Rational(1),Rational(2)),Parenthesis(Addition(Rational(3),Rational(4))))); - assert_parsed_expression_is("1*2", Multiplication(Rational(1),Rational(2))); - assert_parsed_expression_is("1*2*3", Multiplication(Multiplication(Rational(1),Rational(2)),Rational(3))); - assert_parsed_expression_is("1+2*3", Addition(Rational(1), Multiplication(Rational(2), Rational(3)))); - assert_parsed_expression_is("1/2", Division(Rational(1),Rational(2))); - assert_parsed_expression_is("(1/2)", Parenthesis(Division(Rational(1),Rational(2)))); - assert_parsed_expression_is("1/2/3", Division(Division(Rational(1),Rational(2)),Rational(3))); - assert_parsed_expression_is("1/2*3", Multiplication(Division(Rational(1),Rational(2)),Rational(3))); - assert_parsed_expression_is("(1/2*3)", Parenthesis(Multiplication(Division(Rational(1),Rational(2)),Rational(3)))); - assert_parsed_expression_is("1*2/3", Multiplication(Rational(1),Division(Rational(2),Rational(3)))); - assert_parsed_expression_is("(1*2/3)", Parenthesis(Multiplication(Rational(1),Division(Rational(2),Rational(3))))); - assert_parsed_expression_is("(1/2/3)", Parenthesis(Division(Division(Rational(1),Rational(2)),Rational(3)))); - assert_parsed_expression_is("1^2", Power(Rational(1),Rational(2))); - assert_parsed_expression_is("1^2^3", Power(Rational(1),Power(Rational(2),Rational(3)))); + assert_parsed_expression_is("(1)", Parenthesis::Builder(Rational(1))); + assert_parsed_expression_is("((1))", Parenthesis::Builder((Expression)Parenthesis::Builder(Rational(1)))); + assert_parsed_expression_is("1+2", Addition::Builder(Rational(1),Rational(2))); + assert_parsed_expression_is("(1)+2", Addition::Builder(Parenthesis::Builder(Rational(1)),Rational(2))); + assert_parsed_expression_is("(1+2)", Parenthesis::Builder(Addition::Builder(Rational(1),Rational(2)))); + assert_parsed_expression_is("1+2+3", Addition::Builder(Addition::Builder(Rational(1),Rational(2)),Rational(3))); + assert_parsed_expression_is("1+2+(3+4)", Addition::Builder(Addition::Builder(Rational(1),Rational(2)),Parenthesis::Builder(Addition::Builder(Rational(3),Rational(4))))); + assert_parsed_expression_is("1*2", Multiplication::Builder(Rational(1),Rational(2))); + assert_parsed_expression_is("1*2*3", Multiplication::Builder(Multiplication::Builder(Rational(1),Rational(2)),Rational(3))); + assert_parsed_expression_is("1+2*3", Addition::Builder(Rational(1), Multiplication::Builder(Rational(2), Rational(3)))); + assert_parsed_expression_is("1/2", Division::Builder(Rational(1),Rational(2))); + assert_parsed_expression_is("(1/2)", Parenthesis::Builder(Division::Builder(Rational(1),Rational(2)))); + assert_parsed_expression_is("1/2/3", Division::Builder(Division::Builder(Rational(1),Rational(2)),Rational(3))); + assert_parsed_expression_is("1/2*3", Multiplication::Builder(Division::Builder(Rational(1),Rational(2)),Rational(3))); + assert_parsed_expression_is("(1/2*3)", Parenthesis::Builder(Multiplication::Builder(Division::Builder(Rational(1),Rational(2)),Rational(3)))); + assert_parsed_expression_is("1*2/3", Multiplication::Builder(Rational(1),Division::Builder(Rational(2),Rational(3)))); + assert_parsed_expression_is("(1*2/3)", Parenthesis::Builder(Multiplication::Builder(Rational(1),Division::Builder(Rational(2),Rational(3))))); + assert_parsed_expression_is("(1/2/3)", Parenthesis::Builder(Division::Builder(Division::Builder(Rational(1),Rational(2)),Rational(3)))); + assert_parsed_expression_is("1^2", Power::Builder(Rational(1),Rational(2))); + assert_parsed_expression_is("1^2^3", Power::Builder(Rational(1),Power::Builder(Rational(2),Rational(3)))); assert_parsed_expression_is("1=2", Equal(Rational(1),Rational(2))); assert_raises_parsing_error("=5"); assert_raises_parsing_error("1=2=3"); - assert_parsed_expression_is("-1", Opposite(Rational(1))); - assert_parsed_expression_is("(-1)", Parenthesis(Opposite(Rational(1)))); - assert_parsed_expression_is("1-2", Subtraction(Rational(1),Rational(2))); - assert_parsed_expression_is("-1-2", Subtraction(Opposite(Rational(1)),Rational(2))); - assert_parsed_expression_is("1-2-3", Subtraction(Subtraction(Rational(1),Rational(2)),Rational(3))); - assert_parsed_expression_is("(1-2)", Parenthesis(Subtraction(Rational(1),Rational(2)))); - assert_parsed_expression_is("1+-2", Addition(Rational(1),Opposite(Rational(2)))); - assert_parsed_expression_is("--1", Opposite((Expression)Opposite(Rational(1)))); - assert_parsed_expression_is("(1+2)-3", Subtraction(Parenthesis(Addition(Rational(1),Rational(2))),Rational(3))); - assert_parsed_expression_is("(2*-3)", Parenthesis(Multiplication(Rational(2),Opposite(Rational(3))))); - assert_parsed_expression_is("1^(2)-3", Subtraction(Power(Rational(1),Parenthesis(Rational(2))),Rational(3))); - assert_parsed_expression_is("1^2-3", Subtraction(Power(Rational(1),Rational(2)),Rational(3))); - assert_parsed_expression_is("2^-3", Power(Rational(2),Opposite(Rational(3)))); - assert_parsed_expression_is("2--2+-1", Addition(Subtraction(Rational(2),Opposite(Rational(2))),Opposite(Rational(1)))); - assert_parsed_expression_is("2--2*-1", Subtraction(Rational(2),Opposite(Multiplication(Rational(2),Opposite(Rational(1)))))); - assert_parsed_expression_is("-1^2", Opposite(Power(Rational(1),Rational(2)))); - assert_parsed_expression_is("2/-3/-4", Division(Division(Rational(2),Opposite(Rational(3))),Opposite(Rational(4)))); - assert_parsed_expression_is("1*2-3*4", Subtraction(Multiplication(Rational(1),Rational(2)),Multiplication(Rational(3),Rational(4)))); - assert_parsed_expression_is("-1*2", Opposite(Multiplication(Rational(1), Rational(2)))); - assert_parsed_expression_is("1!", Factorial(Rational(1))); - assert_parsed_expression_is("1+2!", Addition(Rational(1),Factorial(Rational(2)))); - assert_parsed_expression_is("1!+2", Addition(Factorial(Rational(1)),Rational(2))); - assert_parsed_expression_is("1!+2!", Addition(Factorial(Rational(1)),Factorial(Rational(2)))); - assert_parsed_expression_is("1*2!", Multiplication(Rational(1),Factorial(Rational(2)))); - assert_parsed_expression_is("1!*2", Multiplication(Factorial(Rational(1)),Rational(2))); - assert_parsed_expression_is("1!*2!", Multiplication(Factorial(Rational(1)),Factorial(Rational(2)))); - assert_parsed_expression_is("1-2!", Subtraction(Rational(1),Factorial(Rational(2)))); - assert_parsed_expression_is("1!-2", Subtraction(Factorial(Rational(1)),Rational(2))); - assert_parsed_expression_is("1!-2!", Subtraction(Factorial(Rational(1)),Factorial(Rational(2)))); - assert_parsed_expression_is("1/2!", Division(Rational(1),Factorial(Rational(2)))); - assert_parsed_expression_is("1!/2", Division(Factorial(Rational(1)),Rational(2))); - assert_parsed_expression_is("1!/2!", Division(Factorial(Rational(1)),Factorial(Rational(2)))); - assert_parsed_expression_is("1^2!", Power(Rational(1),Factorial(Rational(2)))); - assert_parsed_expression_is("1!^2", Power(Factorial(Rational(1)),Rational(2))); - assert_parsed_expression_is("1!^2!", Power(Factorial(Rational(1)),Factorial(Rational(2)))); - assert_parsed_expression_is("(1)!", Factorial(Parenthesis(Rational(1)))); + assert_parsed_expression_is("-1", Opposite::Builder(Rational(1))); + assert_parsed_expression_is("(-1)", Parenthesis::Builder(Opposite::Builder(Rational(1)))); + assert_parsed_expression_is("1-2", Subtraction::Builder(Rational(1),Rational(2))); + assert_parsed_expression_is("-1-2", Subtraction::Builder(Opposite::Builder(Rational(1)),Rational(2))); + assert_parsed_expression_is("1-2-3", Subtraction::Builder(Subtraction::Builder(Rational(1),Rational(2)),Rational(3))); + assert_parsed_expression_is("(1-2)", Parenthesis::Builder(Subtraction::Builder(Rational(1),Rational(2)))); + assert_parsed_expression_is("1+-2", Addition::Builder(Rational(1),Opposite::Builder(Rational(2)))); + assert_parsed_expression_is("--1", Opposite::Builder((Expression)Opposite::Builder(Rational(1)))); + assert_parsed_expression_is("(1+2)-3", Subtraction::Builder(Parenthesis::Builder(Addition::Builder(Rational(1),Rational(2))),Rational(3))); + assert_parsed_expression_is("(2*-3)", Parenthesis::Builder(Multiplication::Builder(Rational(2),Opposite::Builder(Rational(3))))); + assert_parsed_expression_is("1^(2)-3", Subtraction::Builder(Power::Builder(Rational(1),Parenthesis::Builder(Rational(2))),Rational(3))); + assert_parsed_expression_is("1^2-3", Subtraction::Builder(Power::Builder(Rational(1),Rational(2)),Rational(3))); + assert_parsed_expression_is("2^-3", Power::Builder(Rational(2),Opposite::Builder(Rational(3)))); + assert_parsed_expression_is("2--2+-1", Addition::Builder(Subtraction::Builder(Rational(2),Opposite::Builder(Rational(2))),Opposite::Builder(Rational(1)))); + assert_parsed_expression_is("2--2*-1", Subtraction::Builder(Rational(2),Opposite::Builder(Multiplication::Builder(Rational(2),Opposite::Builder(Rational(1)))))); + assert_parsed_expression_is("-1^2", Opposite::Builder(Power::Builder(Rational(1),Rational(2)))); + assert_parsed_expression_is("2/-3/-4", Division::Builder(Division::Builder(Rational(2),Opposite::Builder(Rational(3))),Opposite::Builder(Rational(4)))); + assert_parsed_expression_is("1*2-3*4", Subtraction::Builder(Multiplication::Builder(Rational(1),Rational(2)),Multiplication::Builder(Rational(3),Rational(4)))); + assert_parsed_expression_is("-1*2", Opposite::Builder(Multiplication::Builder(Rational(1), Rational(2)))); + assert_parsed_expression_is("1!", Factorial::Builder(Rational(1))); + assert_parsed_expression_is("1+2!", Addition::Builder(Rational(1),Factorial::Builder(Rational(2)))); + assert_parsed_expression_is("1!+2", Addition::Builder(Factorial::Builder(Rational(1)),Rational(2))); + assert_parsed_expression_is("1!+2!", Addition::Builder(Factorial::Builder(Rational(1)),Factorial::Builder(Rational(2)))); + assert_parsed_expression_is("1*2!", Multiplication::Builder(Rational(1),Factorial::Builder(Rational(2)))); + assert_parsed_expression_is("1!*2", Multiplication::Builder(Factorial::Builder(Rational(1)),Rational(2))); + assert_parsed_expression_is("1!*2!", Multiplication::Builder(Factorial::Builder(Rational(1)),Factorial::Builder(Rational(2)))); + assert_parsed_expression_is("1-2!", Subtraction::Builder(Rational(1),Factorial::Builder(Rational(2)))); + assert_parsed_expression_is("1!-2", Subtraction::Builder(Factorial::Builder(Rational(1)),Rational(2))); + assert_parsed_expression_is("1!-2!", Subtraction::Builder(Factorial::Builder(Rational(1)),Factorial::Builder(Rational(2)))); + assert_parsed_expression_is("1/2!", Division::Builder(Rational(1),Factorial::Builder(Rational(2)))); + assert_parsed_expression_is("1!/2", Division::Builder(Factorial::Builder(Rational(1)),Rational(2))); + assert_parsed_expression_is("1!/2!", Division::Builder(Factorial::Builder(Rational(1)),Factorial::Builder(Rational(2)))); + assert_parsed_expression_is("1^2!", Power::Builder(Rational(1),Factorial::Builder(Rational(2)))); + assert_parsed_expression_is("1!^2", Power::Builder(Factorial::Builder(Rational(1)),Rational(2))); + assert_parsed_expression_is("1!^2!", Power::Builder(Factorial::Builder(Rational(1)),Factorial::Builder(Rational(2)))); + assert_parsed_expression_is("(1)!", Factorial::Builder(Parenthesis::Builder(Rational(1)))); assert_raises_parsing_error("1+"); assert_raises_parsing_error(")"); assert_raises_parsing_error(")("); @@ -202,7 +202,7 @@ QUIZ_CASE(poincare_parser_parse) { } Matrix BuildMatrix(int rows, int columns, Expression entries[]) { - Matrix m; + Matrix m = Matrix::Builder(); int position = 0; for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { @@ -259,7 +259,7 @@ QUIZ_CASE(poincare_parser_symbols_and_functions) { assert_parsed_expression_is("ab12AB_(1)", Function("ab12AB_", 7, Rational(1))); assert_parsed_expression_is("f(g(x))", Function("f", 1, Function("g", 1, Symbol("x",1)))); assert_parsed_expression_is("f(g(1))", Function("f", 1, Function("g", 1, Rational(1)))); - assert_parsed_expression_is("f((1))", Function("f", 1, Parenthesis(Rational(1)))); + assert_parsed_expression_is("f((1))", Function("f", 1, Parenthesis::Builder(Rational(1)))); assert_raises_parsing_error("f(1,2)"); assert_raises_parsing_error("f(f)"); assert_raises_parsing_error("abcdefgh(1)"); @@ -333,12 +333,13 @@ QUIZ_CASE(poincare_parser_symbols_and_functions) { } QUIZ_CASE(poincare_parser_parse_store) { - assert_parsed_expression_is("1>a", Store(Rational(1),Symbol("a",1))); - assert_parsed_expression_is("1>e", Store(Rational(1),Symbol("e",1))); - assert_parsed_expression_is("1>f(x)", Store(Rational(1),Function("f",1,Symbol("x",1)))); - assert_parsed_expression_is("x>f(x)", Store(Symbol("x",1),Function("f",1,Symbol("x",1)))); - assert_parsed_expression_is("n>f(x)", Store(Symbol("n",1),Function("f",1,Symbol("x",1)))); - assert_parsed_expression_is("[[x]]>f(x)", Store(Matrix(Symbol('x')), Function("f", 1, Symbol('x')))); + assert_parsed_expression_is("1>a", Store::Builder(Rational(1),Symbol("a",1))); + assert_parsed_expression_is("1>e", Store::Builder(Rational(1),Symbol("e",1))); + assert_parsed_expression_is("1>f(x)", Store::Builder(Rational(1),Function("f",1,Symbol("x",1)))); + assert_parsed_expression_is("x>f(x)", Store::Builder(Symbol("x",1),Function("f",1,Symbol("x",1)))); + assert_parsed_expression_is("n>f(x)", Store::Builder(Symbol("n",1),Function("f",1,Symbol("x",1)))); + Expression m0[] = {Symbol('x')}; + assert_parsed_expression_is("[[x]]>f(x)", Store::Builder(BuildMatrix(1,1,m0), Function("f", 1, Symbol('x')))); assert_raises_parsing_error("a>b>c"); assert_raises_parsing_error("1>2"); assert_raises_parsing_error("1>"); @@ -368,27 +369,27 @@ QUIZ_CASE(poincare_parser_parse_store) { QUIZ_CASE(poincare_parser_implicit_multiplication) { assert_raises_parsing_error(".1.2"); assert_raises_parsing_error("1 2"); - assert_parsed_expression_is("1x", Multiplication(Rational(1),Symbol("x", 1))); - assert_parsed_expression_is("1ans", Multiplication(Rational(1),Symbol("ans", 3))); + assert_parsed_expression_is("1x", Multiplication::Builder(Rational(1),Symbol("x", 1))); + assert_parsed_expression_is("1ans", Multiplication::Builder(Rational(1),Symbol("ans", 3))); assert_parsed_expression_is("x1", Symbol("x1", 2)); - assert_parsed_expression_is("1x+2", Addition(Multiplication(Rational(1),Symbol("x", 1)),Rational(2))); - assert_parsed_expression_is("1P", Multiplication(Rational(1),Constant(Ion::Charset::SmallPi))); - assert_parsed_expression_is("1x-2", Subtraction(Multiplication(Rational(1),Symbol("x", 1)),Rational(2))); - assert_parsed_expression_is("-1x", Opposite(Multiplication(Rational(1),Symbol("x", 1)))); - assert_parsed_expression_is("2*1x", Multiplication(Rational(2),Multiplication(Rational(1),Symbol("x", 1)))); - assert_parsed_expression_is("2^1x", Multiplication(Power(Rational(2),Rational(1)),Symbol("x", 1))); - assert_parsed_expression_is("1x^2", Multiplication(Rational(1),Power(Symbol("x", 1),Rational(2)))); - assert_parsed_expression_is("2/1x", Division(Rational(2),Multiplication(Rational(1),Symbol("x", 1)))); - assert_parsed_expression_is("1x/2", Division(Multiplication(Rational(1),Symbol("x", 1)),Rational(2))); - assert_parsed_expression_is("(1)2", Multiplication(Parenthesis(Rational(1)),Rational(2))); - assert_parsed_expression_is("1(2)", Multiplication(Rational(1),Parenthesis(Rational(2)))); - assert_parsed_expression_is("sin(1)2", Multiplication(Sine::Builder(Rational(1)),Rational(2))); - assert_parsed_expression_is("1cos(2)", Multiplication(Rational(1),Cosine::Builder(Rational(2)))); - assert_parsed_expression_is("1!2", Multiplication(Factorial(Rational(1)),Rational(2))); - assert_parsed_expression_is("2X^(3)", Multiplication(Rational(2),Power(Constant(Ion::Charset::Exponential),Parenthesis(Rational(3))))); + assert_parsed_expression_is("1x+2", Addition::Builder(Multiplication::Builder(Rational(1),Symbol("x", 1)),Rational(2))); + assert_parsed_expression_is("1P", Multiplication::Builder(Rational(1),Constant(Ion::Charset::SmallPi))); + assert_parsed_expression_is("1x-2", Subtraction::Builder(Multiplication::Builder(Rational(1),Symbol("x", 1)),Rational(2))); + assert_parsed_expression_is("-1x", Opposite::Builder(Multiplication::Builder(Rational(1),Symbol("x", 1)))); + assert_parsed_expression_is("2*1x", Multiplication::Builder(Rational(2),Multiplication::Builder(Rational(1),Symbol("x", 1)))); + assert_parsed_expression_is("2^1x", Multiplication::Builder(Power::Builder(Rational(2),Rational(1)),Symbol("x", 1))); + assert_parsed_expression_is("1x^2", Multiplication::Builder(Rational(1),Power::Builder(Symbol("x", 1),Rational(2)))); + assert_parsed_expression_is("2/1x", Division::Builder(Rational(2),Multiplication::Builder(Rational(1),Symbol("x", 1)))); + assert_parsed_expression_is("1x/2", Division::Builder(Multiplication::Builder(Rational(1),Symbol("x", 1)),Rational(2))); + assert_parsed_expression_is("(1)2", Multiplication::Builder(Parenthesis::Builder(Rational(1)),Rational(2))); + assert_parsed_expression_is("1(2)", Multiplication::Builder(Rational(1),Parenthesis::Builder(Rational(2)))); + assert_parsed_expression_is("sin(1)2", Multiplication::Builder(Sine::Builder(Rational(1)),Rational(2))); + assert_parsed_expression_is("1cos(2)", Multiplication::Builder(Rational(1),Cosine::Builder(Rational(2)))); + assert_parsed_expression_is("1!2", Multiplication::Builder(Factorial::Builder(Rational(1)),Rational(2))); + assert_parsed_expression_is("2X^(3)", Multiplication::Builder(Rational(2),Power::Builder(Constant(Ion::Charset::Exponential),Parenthesis::Builder(Rational(3))))); Expression m1[] = {Rational(1)}; Matrix M1 = BuildMatrix(1,1,m1); Expression m2[] = {Rational(2)}; Matrix M2 = BuildMatrix(1,1,m2); - assert_parsed_expression_is("[[1]][[2]]", Multiplication(M1,M2)); + assert_parsed_expression_is("[[1]][[2]]", Multiplication::Builder(M1,M2)); } QUIZ_CASE(poincare_parser_expression_evaluation) { diff --git a/poincare/test/properties.cpp b/poincare/test/properties.cpp index 843d2369a..685aea2b1 100644 --- a/poincare/test/properties.cpp +++ b/poincare/test/properties.cpp @@ -77,15 +77,15 @@ void assert_expression_has_characteristic_range(Expression e, float range, Prefe QUIZ_CASE(poincare_characteristic_range) { assert_expression_has_characteristic_range(Cosine::Builder(Symbol(Poincare::Symbol::SpecialSymbols::UnknownX)), 360.0f); - assert_expression_has_characteristic_range(Cosine::Builder(Opposite(Symbol(Poincare::Symbol::SpecialSymbols::UnknownX))), 360.0f); + assert_expression_has_characteristic_range(Cosine::Builder(Opposite::Builder(Symbol(Poincare::Symbol::SpecialSymbols::UnknownX))), 360.0f); assert_expression_has_characteristic_range(Cosine::Builder(Symbol(Poincare::Symbol::SpecialSymbols::UnknownX)), 2.0f*M_PI, Preferences::AngleUnit::Radian); - assert_expression_has_characteristic_range(Cosine::Builder(Opposite(Symbol(Poincare::Symbol::SpecialSymbols::UnknownX))), 2.0f*M_PI, Preferences::AngleUnit::Radian); - assert_expression_has_characteristic_range(Sine::Builder(Addition(Multiplication(Rational(9),Symbol(Poincare::Symbol::SpecialSymbols::UnknownX)),Rational(10))), 40.0f); - assert_expression_has_characteristic_range(Addition(Sine::Builder(Addition(Multiplication(Rational(9),Symbol(Poincare::Symbol::SpecialSymbols::UnknownX)),Rational(10))),Cosine::Builder(Division(Symbol(Poincare::Symbol::SpecialSymbols::UnknownX),Rational(2)))), 720.0f); - assert_expression_has_characteristic_range(Addition(Sine::Builder(Addition(Multiplication(Rational(9),Symbol(Poincare::Symbol::SpecialSymbols::UnknownX)),Rational(10))),Cosine::Builder(Division(Symbol(Poincare::Symbol::SpecialSymbols::UnknownX),Rational(2)))), 4.0f*M_PI, Preferences::AngleUnit::Radian); + assert_expression_has_characteristic_range(Cosine::Builder(Opposite::Builder(Symbol(Poincare::Symbol::SpecialSymbols::UnknownX))), 2.0f*M_PI, Preferences::AngleUnit::Radian); + assert_expression_has_characteristic_range(Sine::Builder(Addition::Builder(Multiplication::Builder(Rational(9),Symbol(Poincare::Symbol::SpecialSymbols::UnknownX)),Rational(10))), 40.0f); + assert_expression_has_characteristic_range(Addition::Builder(Sine::Builder(Addition::Builder(Multiplication::Builder(Rational(9),Symbol(Poincare::Symbol::SpecialSymbols::UnknownX)),Rational(10))),Cosine::Builder(Division::Builder(Symbol(Poincare::Symbol::SpecialSymbols::UnknownX),Rational(2)))), 720.0f); + assert_expression_has_characteristic_range(Addition::Builder(Sine::Builder(Addition::Builder(Multiplication::Builder(Rational(9),Symbol(Poincare::Symbol::SpecialSymbols::UnknownX)),Rational(10))),Cosine::Builder(Division::Builder(Symbol(Poincare::Symbol::SpecialSymbols::UnknownX),Rational(2)))), 4.0f*M_PI, Preferences::AngleUnit::Radian); assert_expression_has_characteristic_range(Symbol(Poincare::Symbol::SpecialSymbols::UnknownX), NAN); - assert_expression_has_characteristic_range(Addition(Cosine::Builder(Rational(3)),Rational(2)), 0.0f); - assert_expression_has_characteristic_range(CommonLogarithm::Builder(Cosine::Builder(Multiplication(Rational(40),Symbol(Poincare::Symbol::SpecialSymbols::UnknownX)))), 9.0f); + assert_expression_has_characteristic_range(Addition::Builder(Cosine::Builder(Rational(3)),Rational(2)), 0.0f); + assert_expression_has_characteristic_range(CommonLogarithm::Builder(Cosine::Builder(Multiplication::Builder(Rational(40),Symbol(Poincare::Symbol::SpecialSymbols::UnknownX)))), 9.0f); assert_expression_has_characteristic_range(Cosine::Builder((Expression)Cosine::Builder(Symbol(Poincare::Symbol::SpecialSymbols::UnknownX))), 360.0f); assert_simplify("cos(x)>f(x)"); assert_expression_has_characteristic_range(Function("f",1,Symbol(Poincare::Symbol::SpecialSymbols::UnknownX)), 360.0f); diff --git a/poincare/test/user_variable.cpp b/poincare/test/user_variable.cpp index 7e7ba4490..eb4290428 100644 --- a/poincare/test/user_variable.cpp +++ b/poincare/test/user_variable.cpp @@ -157,9 +157,9 @@ QUIZ_CASE(poincare_user_variable_functions_with_context) { assert_simplify("x^2>f(x)"); // Approximate f(?-2) with ? = 5 const char x[] = {Symbol::SpecialSymbols::UnknownX, 0}; - assert_parsed_expression_approximates_with_value_for_symbol(Function("f", 1, Subtraction(Symbol(Symbol::SpecialSymbols::UnknownX), Rational(2))), x, 5.0, 9.0); + assert_parsed_expression_approximates_with_value_for_symbol(Function("f", 1, Subtraction::Builder(Symbol(Symbol::SpecialSymbols::UnknownX), Rational(2))), x, 5.0, 9.0); // Approximate f(?-1)+f(?+1) with ? = 3 - assert_parsed_expression_approximates_with_value_for_symbol(Addition(Function("f", 1, Subtraction(Symbol(Symbol::SpecialSymbols::UnknownX), Rational(1))), Function("f", 1, Addition(Symbol(Symbol::SpecialSymbols::UnknownX), Rational(1)))), x, 3.0, 20.0); + assert_parsed_expression_approximates_with_value_for_symbol(Addition::Builder(Function("f", 1, Subtraction::Builder(Symbol(Symbol::SpecialSymbols::UnknownX), Rational(1))), Function("f", 1, Addition::Builder(Symbol(Symbol::SpecialSymbols::UnknownX), Rational(1)))), x, 3.0, 20.0); // Clean the storage for other tests Ion::Storage::sharedStorage()->recordNamed("f.func").destroy(); diff --git a/poincare/test/vertical_offset_layout.cpp b/poincare/test/vertical_offset_layout.cpp index 77c7385f3..7379abfa7 100644 --- a/poincare/test/vertical_offset_layout.cpp +++ b/poincare/test/vertical_offset_layout.cpp @@ -7,9 +7,9 @@ using namespace Poincare; QUIZ_CASE(poincare_vertical_offset_layout_serialize) { - HorizontalLayout layout = HorizontalLayout( + HorizontalLayout layout = HorizontalLayout::Builder( CharLayout('2'), - VerticalOffsetLayout( + VerticalOffsetLayout::Builder( LayoutHelper::String("x+5", 3), VerticalOffsetLayoutNode::Type::Superscript )