diff --git a/apps/calculation/calculation.cpp b/apps/calculation/calculation.cpp index c18ff004e..9078ac7c8 100644 --- a/apps/calculation/calculation.cpp +++ b/apps/calculation/calculation.cpp @@ -4,13 +4,28 @@ namespace Calculation { Calculation::Calculation() : - m_text(""), m_expression(nullptr), m_layout(nullptr), - m_evaluation(Float(0.0f)) + m_evaluation(0.0f) { } +Calculation & Calculation::operator= (const Calculation & other) { + strlcpy(m_text, other.m_text, sizeof(m_text)); + if (m_expression != nullptr) { + delete m_expression; + } + m_expression = Expression::parse(m_text); + if (m_layout != nullptr) { + delete m_layout; + } + if (m_expression) { + m_layout = m_expression->createLayout(); + } + m_evaluation = other.m_evaluation; + return *this; +} + void Calculation::setContent(const char * c, Context * context) { strlcpy(m_text, c, sizeof(m_text)); if (m_expression != nullptr) { @@ -45,8 +60,15 @@ ExpressionLayout * Calculation::layout() { return m_layout; } -Float * Calculation::evaluation() { - return &m_evaluation; +float Calculation::evaluation() { + return m_evaluation; +} + +bool Calculation::isEmpty() { + if (m_expression == nullptr) { + return true; + } + return false; } } diff --git a/apps/calculation/calculation.h b/apps/calculation/calculation.h index f7baa3eca..63be1a615 100644 --- a/apps/calculation/calculation.h +++ b/apps/calculation/calculation.h @@ -8,18 +8,20 @@ namespace Calculation { class Calculation { public: Calculation(); - ~Calculation(); // Delete expression and layout, if needed + ~Calculation(); // Delete expression and layout, if needed + Calculation & operator= (const Calculation & other); const char * text(); Expression * expression(); ExpressionLayout * layout(); - Float * evaluation(); + float evaluation(); void setContent(const char * c, Context * context); + bool isEmpty(); private: constexpr static int k_bodyLength = 255; char m_text[k_bodyLength]; Expression * m_expression; ExpressionLayout * m_layout; - Float m_evaluation; + float m_evaluation; }; } diff --git a/apps/calculation/calculation_store.cpp b/apps/calculation/calculation_store.cpp index 143e7a047..b93b0e203 100644 --- a/apps/calculation/calculation_store.cpp +++ b/apps/calculation/calculation_store.cpp @@ -4,46 +4,47 @@ namespace Calculation { CalculationStore::CalculationStore() : - m_numberOfCalculations(0), - m_startIndex(0) + m_start(m_calculations) { } -Calculation * CalculationStore::calculationAtIndex(int i) { - assert(i>=0 && i= k_maxNumberOfCalculations) { - for (int k = 0; k < k_maxNumberOfCalculations; k++) { - m_calculations[k] = m_calculations[k+1]; - } - m_numberOfCalculations--; +Calculation * CalculationStore::push(Calculation * c) { + Calculation * result = m_start; + *m_start++ = *c; + if (m_start >= m_calculations + k_maxNumberOfCalculations) { + m_start = m_calculations; } - Calculation addedCalculation = Calculation(); - m_calculations[m_numberOfCalculations] = addedCalculation; - Calculation * result = &m_calculations[m_numberOfCalculations]; - m_numberOfCalculations++; return result; } -void CalculationStore::removeCalculation(Calculation * c) { - int i = 0; - while (&m_calculations[i] != c && i < m_numberOfCalculations) { - i++; - } - assert(i>=0 && i= m_calculations + k_maxNumberOfCalculations) { + currentCalc = m_calculations; + } + if (!currentCalc->isEmpty()) { + j++; + } + currentCalc++; } + return currentCalc-1; } int CalculationStore::numberOfCalculations() { - return m_numberOfCalculations; + Calculation * currentCalc= m_calculations; + int numberOfCalculations = 0; + while (currentCalc < m_calculations + k_maxNumberOfCalculations) { + if (!currentCalc++->isEmpty()) { + numberOfCalculations++; + } + } + return numberOfCalculations; +} + +void CalculationStore::deleteCalculationAtIndex(int i) { + *calculationAtIndex(i) = Calculation(); } } diff --git a/apps/calculation/calculation_store.h b/apps/calculation/calculation_store.h index 3f0dcd1c3..c15e5a1ff 100644 --- a/apps/calculation/calculation_store.h +++ b/apps/calculation/calculation_store.h @@ -9,13 +9,12 @@ class CalculationStore { public: CalculationStore(); Calculation * calculationAtIndex(int i); - Calculation * addEmptyCalculation(); - void removeCalculation(Calculation * c); + Calculation * push(Calculation * c); + void deleteCalculationAtIndex(int i); int numberOfCalculations(); private: - static constexpr int k_maxNumberOfCalculations = 10; - int m_numberOfCalculations; - int m_startIndex; + static constexpr int k_maxNumberOfCalculations = 5; + Calculation * m_start; Calculation m_calculations[k_maxNumberOfCalculations]; }; diff --git a/apps/calculation/edit_expression_controller.cpp b/apps/calculation/edit_expression_controller.cpp index 59987ff45..16885213f 100644 --- a/apps/calculation/edit_expression_controller.cpp +++ b/apps/calculation/edit_expression_controller.cpp @@ -68,9 +68,10 @@ bool EditExpressionController::handleEvent(Ion::Events::Event event) { switch (event) { case Ion::Events::Event::ENTER: { - Calculation * calculation = m_calculationStore->addEmptyCalculation(); + Calculation calculation = Calculation(); App * calculationApp = (App *)app(); - calculation->setContent(textBody(), calculationApp->globalContext()); + calculation.setContent(textBody(), calculationApp->globalContext()); + m_calculationStore->push(&calculation); m_historyController->reload(); m_contentView.textField()->setTextBuffer(""); return true; diff --git a/apps/calculation/history_view_cell.cpp b/apps/calculation/history_view_cell.cpp index fa27eaaf1..94e4c57f7 100644 --- a/apps/calculation/history_view_cell.cpp +++ b/apps/calculation/history_view_cell.cpp @@ -34,7 +34,7 @@ void HistoryViewCell::layoutSubviews() { void HistoryViewCell::setCalculation(Calculation * calculation) { m_calculation = calculation; char buffer[7]; - m_calculation->evaluation()->convertFloatToText(buffer, 14, 7); + Float(m_calculation->evaluation()).convertFloatToText(buffer, 14, 7); m_result.setText(buffer); }