diff --git a/apps/calculation/app.cpp b/apps/calculation/app.cpp index 48a60cb8d..51b521e66 100644 --- a/apps/calculation/app.cpp +++ b/apps/calculation/app.cpp @@ -91,14 +91,13 @@ bool App::textInputIsCorrect(const char * text) { /* Here, we check that the expression entered by the user can be printed with * less than k_printedExpressionLength characters. Otherwise, we prevent the * user from adding this expression to the calculation store. */ - Expression * exp = Expression::parse(text); - if (exp == nullptr) { + Expression exp = Expression::parse(text); + if (!exp.isDefined()) { return false; } - Expression::ReplaceSymbolWithExpression(&exp, Symbol::SpecialSymbols::Ans, static_cast(snapshot())->calculationStore()->ansExpression(localContext())); + exp = exp.replaceSymbolWithExpression(Symbol::SpecialSymbols::Ans, static_cast(snapshot())->calculationStore()->ansExpression(localContext())); char buffer[Calculation::k_printedExpressionSize]; int length = PoincareHelpers::Serialize(exp, buffer, sizeof(buffer)); - delete exp; /* if the buffer is totally full, it is VERY likely that writeTextInBuffer * escaped before printing utterly the expression. */ if (length >= Calculation::k_printedExpressionSize-1) { diff --git a/apps/calculation/calculation.cpp b/apps/calculation/calculation.cpp index 02da02862..2b9cf58ed 100644 --- a/apps/calculation/calculation.cpp +++ b/apps/calculation/calculation.cpp @@ -39,10 +39,9 @@ void Calculation::reset() { tidy(); } -void Calculation::setContent(const char * c, Context * context, Expression * ansExpression) { +void Calculation::setContent(const char * c, Context * context, Expression ansExpression) { reset(); - m_input = Expression::parse(c); - Expression::ReplaceSymbolWithExpression(&m_input, Symbol::SpecialSymbols::Ans, ansExpression); + m_input = Expression::parse(c).replaceSymbolWithExpression(Symbol::SpecialSymbols::Ans, ansExpression); /* We do not store directly the text enter by the user because we do not want * to keep Ans symbol in the calculation store. */ PoincareHelpers::Serialize(m_input, m_inputText, sizeof(m_inputText)); @@ -143,7 +142,7 @@ void Calculation::tidy() { m_equalSign = EqualSign::Unknown; } -Expression * Calculation::exactOutput(Context * context) { +Expression Calculation::exactOutput(Context * context) { if (!m_exactOutput.isDefined()) { /* Because the angle unit might have changed, we do not simplify again. We * thereby avoid turning cos(Pi/4) into sqrt(2)/2 and displaying @@ -161,7 +160,7 @@ LayoutRef Calculation::createExactOutputLayout(Context * context) { return PoincareHelpers::CreateLayout(exactOutput(context)); } -Expression * Calculation::approximateOutput(Context * context) { +Expression Calculation::approximateOutput(Context * context) { if (!m_approximateOutput.isDefined()) { /* To ensure that the expression 'm_output' is a matrix or a complex, we * call 'evaluate'. */ diff --git a/apps/calculation/calculation_store.cpp b/apps/calculation/calculation_store.cpp index 0eb708bff..37698613d 100644 --- a/apps/calculation/calculation_store.cpp +++ b/apps/calculation/calculation_store.cpp @@ -89,10 +89,10 @@ void CalculationStore::tidy() { } } -Expression * CalculationStore::ansExpression(Context * context) { +Expression CalculationStore::ansExpression(Context * context) { if (numberOfCalculations() == 0) { static Rational defaultExpression(0); - return &defaultExpression; + return defaultExpression; } Calculation * lastCalculation = calculationAtIndex(numberOfCalculations()-1); /* Special case: the exact output is a Store/Equal expression. @@ -100,10 +100,10 @@ Expression * CalculationStore::ansExpression(Context * context) { * To avoid turning 'ans->A' in '2->A->A' (or 2->A=A) which cannot be parsed), * ans is replaced by the approximation output in when any Store or Equal * expression appears.*/ - bool exactOuptutInvolvesStoreEqual = lastCalculation->exactOutput(context)->recursivelyMatches([](const Expression * e, Context & context) { - return e->type() == Expression::Type::Store || e->type() == Expression::Type::Equal; + bool exactOuptutInvolvesStoreEqual = lastCalculation->exactOutput(context).recursivelyMatches([](const Expression e, Context & context) { + return e.type() == ExpressionNode::Type::Store || e.type() == ExpressionNode::Type::Equal; }, *context); - if (lastCalculation->input()->isApproximate(*context) || exactOuptutInvolvesStoreEqual) { + if (lastCalculation->input().isApproximate(*context) || exactOuptutInvolvesStoreEqual) { return lastCalculation->approximateOutput(context); } return lastCalculation->exactOutput(context); diff --git a/apps/calculation/calculation_store.h b/apps/calculation/calculation_store.h index 158f1681a..58f6ebc5c 100644 --- a/apps/calculation/calculation_store.h +++ b/apps/calculation/calculation_store.h @@ -14,7 +14,7 @@ public: void deleteAll(); int numberOfCalculations(); void tidy(); - Poincare::Expression * ansExpression(Poincare::Context * context); + Poincare::Expression ansExpression(Poincare::Context * context); static constexpr int k_maxNumberOfCalculations = 10; private: int m_startIndex;