mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-19 00:37:25 +01:00
[apps] Calculation: Memoization of the equal sign type (approximate or
equal) in the model
This commit is contained in:
committed by
EmilieNumworks
parent
fa840754e8
commit
b84972da6a
@@ -15,7 +15,8 @@ Calculation::Calculation() :
|
||||
m_exactOutput(nullptr),
|
||||
m_exactOutputLayout(nullptr),
|
||||
m_approximateOutput(nullptr),
|
||||
m_approximateOutputLayout(nullptr)
|
||||
m_approximateOutputLayout(nullptr),
|
||||
m_equalSign(EqualSign::Unknown)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -142,6 +143,7 @@ void Calculation::tidy() {
|
||||
delete m_approximateOutputLayout;
|
||||
}
|
||||
m_approximateOutputLayout = nullptr;
|
||||
m_equalSign = EqualSign::Unknown;
|
||||
}
|
||||
|
||||
Expression * Calculation::exactOutput(Context * context) {
|
||||
@@ -189,7 +191,10 @@ bool Calculation::shouldDisplayApproximateOutput(Context * context) {
|
||||
return input()->isApproximate(*context);
|
||||
}
|
||||
|
||||
bool Calculation::exactAndApproximateDisplayedOutputsAreEqual(Poincare::Context * context) {
|
||||
Calculation::EqualSign Calculation::exactAndApproximateDisplayedOutputsAreEqual(Poincare::Context * context) {
|
||||
if (m_equalSign != EqualSign::Unknown) {
|
||||
return m_equalSign;
|
||||
}
|
||||
char buffer[k_printedExpressionSize];
|
||||
approximateOutput(context)->writeTextInBuffer(buffer, k_printedExpressionSize, Preferences::sharedPreferences()->numberOfSignificantDigits());
|
||||
/* Warning: we cannot use directly the m_approximateOutputText but we have to
|
||||
@@ -198,9 +203,9 @@ bool Calculation::exactAndApproximateDisplayedOutputsAreEqual(Poincare::Context
|
||||
* are not identical. (For example, 0.000025 might be displayed "0.00003"
|
||||
* which requires in an approximative equal) */
|
||||
Expression * approximateOutput = Expression::ParseAndSimplify(buffer, *context);
|
||||
bool isEqual = approximateOutput->isIdenticalTo(exactOutput(context));
|
||||
m_equalSign = approximateOutput->isIdenticalTo(exactOutput(context)) ? EqualSign::Equal : EqualSign::Approximation;
|
||||
delete approximateOutput;
|
||||
return isEqual;
|
||||
return m_equalSign;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -10,6 +10,11 @@ class CalculationStore;
|
||||
|
||||
class Calculation {
|
||||
public:
|
||||
enum class EqualSign : uint8_t {
|
||||
Unknown,
|
||||
Approximation,
|
||||
Equal
|
||||
};
|
||||
Calculation();
|
||||
~Calculation(); // Delete expression and layout, if needed
|
||||
Calculation& operator=(const Calculation& other);
|
||||
@@ -31,7 +36,7 @@ public:
|
||||
bool isEmpty();
|
||||
void tidy();
|
||||
bool shouldDisplayApproximateOutput(Poincare::Context * context);
|
||||
bool exactAndApproximateDisplayedOutputsAreEqual(Poincare::Context * context);
|
||||
EqualSign exactAndApproximateDisplayedOutputsAreEqual(Poincare::Context * context);
|
||||
constexpr static int k_printedExpressionSize = 2*::TextField::maxBufferSize();
|
||||
private:
|
||||
/* Buffers holding text expressions have to be longer than the text written
|
||||
@@ -46,6 +51,7 @@ private:
|
||||
Poincare::ExpressionLayout * m_exactOutputLayout;
|
||||
Poincare::Expression * m_approximateOutput;
|
||||
Poincare::ExpressionLayout * m_approximateOutputLayout;
|
||||
EqualSign m_equalSign;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -90,7 +90,7 @@ void HistoryViewCell::setCalculation(Calculation * calculation) {
|
||||
* outputView()->layoutSubviews() is going to fail. */
|
||||
Poincare::ExpressionLayout * outputExpressions[2] = {calculation->approximateOutputLayout(calculationApp->localContext()), calculation->shouldDisplayApproximateOutput(calculationApp->localContext()) ? nullptr : calculation->exactOutputLayout(calculationApp->localContext())};
|
||||
m_scrollableOutputView.outputView()->setExpressions(outputExpressions);
|
||||
I18n::Message equalMessage = calculation->exactAndApproximateDisplayedOutputsAreEqual(calculationApp->localContext()) ? I18n::Message::Equal : I18n::Message::AlmostEqual;
|
||||
I18n::Message equalMessage = calculation->exactAndApproximateDisplayedOutputsAreEqual(calculationApp->localContext()) == Calculation::EqualSign::Equal ? I18n::Message::Equal : I18n::Message::AlmostEqual;
|
||||
m_scrollableOutputView.outputView()->setEqualMessage(equalMessage);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user