diff --git a/apps/calculation/edit_expression_controller.cpp b/apps/calculation/edit_expression_controller.cpp index cee7730ed..d4edfe778 100644 --- a/apps/calculation/edit_expression_controller.cpp +++ b/apps/calculation/edit_expression_controller.cpp @@ -17,15 +17,8 @@ int EditExpressionController::ContentView::numberOfSubviews() const { } View * EditExpressionController::ContentView::subviewAtIndex(int index) { - switch (index) { - case 0: - return m_mainView; - case 1: - return &m_textField; - default: - assert(false); - return nullptr; - } + View * views[2] = {m_mainView, &m_textField}; + return views[index]; } void EditExpressionController::ContentView::layoutSubviews() { diff --git a/apps/calculation/history_view_cell.cpp b/apps/calculation/history_view_cell.cpp index 59a049332..6282961cc 100644 --- a/apps/calculation/history_view_cell.cpp +++ b/apps/calculation/history_view_cell.cpp @@ -25,15 +25,8 @@ int HistoryViewCell::numberOfSubviews() const { } View * HistoryViewCell::subviewAtIndex(int index) { - switch (index) { - case 0: - return &m_inputView; - case 1: - return &m_outputView; - default: - assert(false); - return nullptr; - } + View * views[2] = {&m_inputView, &m_outputView}; + return views[index]; } void HistoryViewCell::layoutSubviews() { diff --git a/apps/graph/graph/initialisation_parameter_controller.cpp b/apps/graph/graph/initialisation_parameter_controller.cpp index 598428156..395d8045d 100644 --- a/apps/graph/graph/initialisation_parameter_controller.cpp +++ b/apps/graph/graph/initialisation_parameter_controller.cpp @@ -27,27 +27,9 @@ void InitialisationParameterController::didBecomeFirstResponder() { bool InitialisationParameterController::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::OK) { - switch (m_selectableTableView.selectedRow()) { - case 0: - // TODO: if mode == degree, xmin = -600, xmax = 600 - m_graphRange->setTrigonometric(); - break; - case 1: - { - m_graphRange->roundAbscissa(); - break; - } - case 2: - { - m_graphRange->normalize(); - break; - } - case 3: - m_graphRange->setDefault(); - break; - default: - return false; - } + RangeMethodPointer rangeMethods[k_totalNumberOfCells] = {&InteractiveCurveViewRange::setTrigonometric, + &InteractiveCurveViewRange::roundAbscissa, &InteractiveCurveViewRange::normalize, &InteractiveCurveViewRange::setDefault}; + (m_graphRange->*rangeMethods[m_selectableTableView.selectedRow()])(); StackViewController * stack = (StackViewController *)parentResponder(); stack->pop(); return true; diff --git a/apps/graph/values/interval.h b/apps/graph/values/interval.h index 69476714a..515c9ef87 100644 --- a/apps/graph/values/interval.h +++ b/apps/graph/values/interval.h @@ -30,6 +30,9 @@ private: bool m_needCompute; }; +typedef void (Interval::*SetterPointer)(float); +typedef float (Interval::*GetterPointer)(); + } #endif diff --git a/apps/graph/values/interval_parameter_controller.cpp b/apps/graph/values/interval_parameter_controller.cpp index e47633c66..2152e8ba4 100644 --- a/apps/graph/values/interval_parameter_controller.cpp +++ b/apps/graph/values/interval_parameter_controller.cpp @@ -22,33 +22,13 @@ Graph::Interval * IntervalParameterController::interval() { } float IntervalParameterController::parameterAtIndex(int index) { - switch (index) { - case 0: - return m_interval->start(); - case 1: - return m_interval->end(); - case 2: - return m_interval->step(); - default: - assert(false); - return 0.0f; - } + GetterPointer getters[k_totalNumberOfCell] = {&Interval::start, &Interval::end, &Interval::step}; + return (m_interval->*getters[index])(); } void IntervalParameterController::setParameterAtIndex(int parameterIndex, float f) { - switch(parameterIndex) { - case 0: - m_interval->setStart(f); - break; - case 1: - m_interval->setEnd(f); - break; - case 2: - m_interval->setStep(f); - break; - default: - assert(false); - } + SetterPointer setters[k_totalNumberOfCell] = {&Interval::setStart, &Interval::setEnd, &Interval::setStep}; + (m_interval->*setters[parameterIndex])(f); } int IntervalParameterController::numberOfRows() { diff --git a/apps/interactive_curve_view_controller.cpp b/apps/interactive_curve_view_controller.cpp index 0c5cbcf0c..8f3cbccbf 100644 --- a/apps/interactive_curve_view_controller.cpp +++ b/apps/interactive_curve_view_controller.cpp @@ -136,17 +136,8 @@ int InteractiveCurveViewController::numberOfButtons() const { } Button * InteractiveCurveViewController::buttonAtIndex(int index) { - switch (index) { - case 0: - return &m_rangeButton; - case 1: - return &m_zoomButton; - case 2: - return &m_defaultInitialisationButton; - default: - assert(false); - } - return nullptr; + Button * buttons[3] = {&m_rangeButton, &m_zoomButton, &m_defaultInitialisationButton}; + return buttons[index]; } Responder * InteractiveCurveViewController::defaultController() { diff --git a/apps/interactive_curve_view_range.h b/apps/interactive_curve_view_range.h index 146b741b3..19957f01f 100644 --- a/apps/interactive_curve_view_range.h +++ b/apps/interactive_curve_view_range.h @@ -54,4 +54,8 @@ protected: InteractiveCurveViewRangeDelegate * m_delegate; }; +typedef void (InteractiveCurveViewRange::*ParameterSetterPointer)(float); +typedef float (InteractiveCurveViewRange::*ParameterGetterPointer)(); +typedef void (InteractiveCurveViewRange::*RangeMethodPointer)(); + #endif diff --git a/apps/range_parameter_controller.cpp b/apps/range_parameter_controller.cpp index a4e8a4e31..6ebb964ee 100644 --- a/apps/range_parameter_controller.cpp +++ b/apps/range_parameter_controller.cpp @@ -71,39 +71,18 @@ bool RangeParameterController::handleEvent(Ion::Events::Event event) { return false; } -float RangeParameterController::parameterAtIndex(int index) { - switch (index) { - case 0: - return m_interactiveRange->xMin(); - case 1: - return m_interactiveRange->xMax(); - case 3: - return m_interactiveRange->yMin(); - case 4: - return m_interactiveRange->yMax(); - default: - assert(false); - return 0.0f; - } +float RangeParameterController::parameterAtIndex(int parameterIndex) { + ParameterGetterPointer getters[k_numberOfTextCell] = {&InteractiveCurveViewRange::xMin, + &InteractiveCurveViewRange::xMax, &InteractiveCurveViewRange::yMin, &InteractiveCurveViewRange::yMax}; + int index = parameterIndex > 2 ? parameterIndex - 1 : parameterIndex; + return (m_interactiveRange->*getters[index])(); } void RangeParameterController::setParameterAtIndex(int parameterIndex, float f) { - switch(parameterIndex) { - case 0: - m_interactiveRange->setXMin(f); - break; - case 1: - m_interactiveRange->setXMax(f); - break; - case 3: - m_interactiveRange->setYMin(f); - break; - case 4: - m_interactiveRange->setYMax(f); - break; - default: - assert(false); - } + ParameterSetterPointer setters[k_numberOfTextCell] = {&InteractiveCurveViewRange::setXMin, + &InteractiveCurveViewRange::setXMax, &InteractiveCurveViewRange::setYMin, &InteractiveCurveViewRange::setYMax}; + int index = parameterIndex > 2 ? parameterIndex - 1 : parameterIndex; + (m_interactiveRange->*setters[index])(f); } int RangeParameterController::numberOfRows() { diff --git a/apps/regression/calculation_controller.cpp b/apps/regression/calculation_controller.cpp index 54c058e69..ded0566e1 100644 --- a/apps/regression/calculation_controller.cpp +++ b/apps/regression/calculation_controller.cpp @@ -116,32 +116,10 @@ void CalculationController::willDisplayCellAtLocation(TableViewCell * cell, int return; } if (i == 1 && j > 0 && j < 6) { - float calculation1 = 0.0f; - float calculation2 = 0.0f; - switch (j) { - case 1: - calculation1 = m_store->meanOfColumn(0); - calculation2 = m_store->meanOfColumn(1); - break; - case 2: - calculation1 = m_store->sumOfColumn(0); - calculation2 = m_store->sumOfColumn(1); - break; - case 3: - calculation1 = m_store->squaredValueSumOfColumn(0); - calculation2 = m_store->squaredValueSumOfColumn(1); - break; - case 4: - calculation1 = m_store->standardDeviationOfColumn(0); - calculation2 = m_store->standardDeviationOfColumn(1); - break; - case 5: - calculation1 = m_store->varianceOfColumn(0); - calculation2 = m_store->varianceOfColumn(1); - break; - default: - break; - } + ArgCalculPointer calculationMethods[(k_totalNumberOfRows-1)/2] = {&Store::meanOfColumn, &Store::sumOfColumn, + &Store::squaredValueSumOfColumn, &Store::standardDeviationOfColumn, &Store::varianceOfColumn}; + float calculation1 = (m_store->*calculationMethods[j-1])(0); + float calculation2 = (m_store->*calculationMethods[j-1])(1); EvenOddDoubleBufferTextCell * myCell = (EvenOddDoubleBufferTextCell *)cell; char buffer[Constant::FloatBufferSizeInScientificMode]; Float(calculation1).convertFloatToText(buffer, Constant::FloatBufferSizeInScientificMode, Constant::NumberOfDigitsInMantissaInScientificMode); @@ -151,26 +129,9 @@ void CalculationController::willDisplayCellAtLocation(TableViewCell * cell, int return; } if (i == 1 && j > 5) { - float calculation = 0.0f; - switch (j) { - case 6: - calculation = m_store->numberOfPairs(); - break; - case 7: - calculation = m_store->covariance(); - break; - case 8: - calculation = m_store->columnProductSum(); - break; - case 9: - calculation = m_store->correlationCoefficient(); - break; - case 10: - calculation = m_store->squaredCorrelationCoefficient(); - break; - default: - break; - } + CalculPointer calculationMethods[(k_totalNumberOfRows-1)/2] = {&Store::numberOfPairs, &Store::covariance, + &Store::columnProductSum, &Store::correlationCoefficient, &Store::squaredCorrelationCoefficient}; + float calculation = (m_store->*calculationMethods[j-6])(); EvenOddBufferTextCell * myCell = (EvenOddBufferTextCell *)cell; char buffer[Constant::FloatBufferSizeInScientificMode]; Float(calculation).convertFloatToText(buffer, Constant::FloatBufferSizeInScientificMode, Constant::NumberOfDigitsInMantissaInScientificMode); diff --git a/apps/regression/initialisation_parameter_controller.cpp b/apps/regression/initialisation_parameter_controller.cpp index 8b976e054..dc5a3d9a9 100644 --- a/apps/regression/initialisation_parameter_controller.cpp +++ b/apps/regression/initialisation_parameter_controller.cpp @@ -27,23 +27,8 @@ void InitialisationParameterController::didBecomeFirstResponder() { bool InitialisationParameterController::handleEvent(Ion::Events::Event event) { if (event == Ion::Events::OK) { - switch (m_selectableTableView.selectedRow()) { - case 0: - { - m_store->roundAbscissa(); - break; - } - case 1: - { - m_store->normalize(); - break; - } - case 2: - m_store->setDefault(); - break; - default: - return false; - } + RangeMethodPointer rangeMethods[k_totalNumberOfCells] = {&InteractiveCurveViewRange::roundAbscissa, &InteractiveCurveViewRange::normalize, &InteractiveCurveViewRange::setDefault}; + (m_store->*rangeMethods[m_selectableTableView.selectedRow()])(); StackViewController * stack = (StackViewController *)parentResponder(); stack->pop(); return true; diff --git a/apps/regression/store.cpp b/apps/regression/store.cpp index 5b44331b5..39c159f0b 100644 --- a/apps/regression/store.cpp +++ b/apps/regression/store.cpp @@ -158,6 +158,10 @@ void Store::setDefault() { /* Calculations */ +float Store::numberOfPairs() { + return m_numberOfPairs; +} + float Store::maxValueOfColumn(int i) { float max = -FLT_MAX; for (int k = 0; k < m_numberOfPairs; k++) { diff --git a/apps/regression/store.h b/apps/regression/store.h index 8f2556807..b663e7c0b 100644 --- a/apps/regression/store.h +++ b/apps/regression/store.h @@ -23,6 +23,7 @@ public: void setDefault() override; // Calculation + float numberOfPairs(); float squaredValueSumOfColumn(int i); float columnProductSum(); float meanOfColumn(int i); @@ -40,6 +41,10 @@ private: float minValueOfColumn(int i); }; +typedef float (Store::*ArgCalculPointer)(int); +typedef float (Store::*CalculPointer)(); +typedef void (Store::*RangeMethodPointer)(); + } #endif diff --git a/apps/statistics/box_controller.cpp b/apps/statistics/box_controller.cpp index a9394ea50..b0d1e2c54 100644 --- a/apps/statistics/box_controller.cpp +++ b/apps/statistics/box_controller.cpp @@ -63,28 +63,10 @@ Responder * BoxController::tabController() const { void BoxController::reloadBannerView() { const char * calculationName[5] = {"Minimum", "Premier quartile", "Mediane", "Troisieme quartile", "Maximum"}; m_boxBannerView.setLegendAtIndex((char *)calculationName[(int)m_view.selectedQuantile()], 0); - char buffer[Constant::FloatBufferSizeInScientificMode]; - float calculation = 0.0f; - switch(m_view.selectedQuantile()) { - case BoxView::Quantile::Min: - calculation = m_store->minValue(); - break; - case BoxView::Quantile::FirstQuartile: - calculation = m_store->firstQuartile(); - break; - case BoxView::Quantile::Median: - calculation = m_store->median(); - break; - case BoxView::Quantile::ThirdQuartile: - calculation = m_store->thirdQuartile(); - break; - case BoxView::Quantile::Max: - calculation = m_store->maxValue(); - break; - default: - break; - } + CalculPointer calculationMethods[5] = {&Store::minValue, &Store::firstQuartile, &Store::median, &Store::thirdQuartile, + &Store::maxValue}; + float calculation = (m_store->*calculationMethods[(int)m_view.selectedQuantile()])(); Float(calculation).convertFloatToText(buffer, Constant::FloatBufferSizeInScientificMode, Constant::NumberOfDigitsInMantissaInScientificMode); m_boxBannerView.setLegendAtIndex(buffer, 1); m_boxBannerView.layoutSubviews(); diff --git a/apps/statistics/box_view.cpp b/apps/statistics/box_view.cpp index 04fab2363..f772df799 100644 --- a/apps/statistics/box_view.cpp +++ b/apps/statistics/box_view.cpp @@ -13,26 +13,9 @@ BoxView::BoxView(Store * store, View * bannerView) : } void BoxView::reloadSelection() { - float calculation = 0.0f; - switch(m_selectedQuantile) { - case BoxView::Quantile::Min: - calculation = m_store->minValue(); - break; - case BoxView::Quantile::FirstQuartile: - calculation = m_store->firstQuartile(); - break; - case BoxView::Quantile::Median: - calculation = m_store->median(); - break; - case BoxView::Quantile::ThirdQuartile: - calculation = m_store->thirdQuartile(); - break; - case BoxView::Quantile::Max: - calculation = m_store->maxValue(); - break; - default: - break; - } + CalculPointer calculationMethods[5] = {&Store::minValue, &Store::firstQuartile, &Store::median, &Store::thirdQuartile, + &Store::maxValue}; + float calculation = (m_store->*calculationMethods[(int)m_selectedQuantile])(); float pixelUpperBound = floatToPixel(Axis::Vertical, 0.2f)+1; float pixelLowerBound = floatToPixel(Axis::Vertical, 0.8)-1; float selectedValueInPixels = floatToPixel(Axis::Horizontal, calculation); diff --git a/apps/statistics/calculation_controller.cpp b/apps/statistics/calculation_controller.cpp index 31857c8cd..72e07d902 100644 --- a/apps/statistics/calculation_controller.cpp +++ b/apps/statistics/calculation_controller.cpp @@ -76,50 +76,10 @@ void CalculationController::willDisplayCellAtLocation(TableViewCell * cell, int EvenOddPointerTextCell * myCell = (EvenOddPointerTextCell *)cell; myCell->setText(titles[j]); } else { - float calculation = 0.0f; - switch (j) { - case 0: - calculation = m_store->sumOfColumn(1); - break; - case 1: - calculation = m_store->minValue(); - break; - case 2: - calculation = m_store->maxValue(); - break; - case 3: - calculation = m_store->range(); - break; - case 4: - calculation = m_store->mean(); - break; - case 5: - calculation = m_store->standardDeviation(); - break; - case 6: - calculation = m_store->variance(); - break; - case 7: - calculation = m_store->firstQuartile(); - break; - case 8: - calculation = m_store->thirdQuartile(); - break; - case 9: - calculation = m_store->median(); - break; - case 10: - calculation = m_store->quartileRange(); - break; - case 11: - calculation = m_store->sum(); - break; - case 12: - calculation = m_store->squaredValueSum(); - break; - default: - break; - } + CalculPointer calculationMethods[k_totalNumberOfRows] = {&Store::sumOfOccurrences, &Store::minValue, + &Store::maxValue, &Store::range, &Store::mean, &Store::standardDeviation, &Store::variance, &Store::firstQuartile, + &Store::thirdQuartile, &Store::median, &Store::quartileRange, &Store::sum, &Store::squaredValueSum}; + float calculation = (m_store->*calculationMethods[j])(); EvenOddBufferTextCell * myCell = (EvenOddBufferTextCell *)cell; char buffer[Constant::FloatBufferSizeInScientificMode]; Float(calculation).convertFloatToText(buffer, Constant::FloatBufferSizeInScientificMode, Constant::NumberOfDigitsInMantissaInScientificMode); diff --git a/apps/statistics/store.cpp b/apps/statistics/store.cpp index a6f2d734c..1ffe6d5cf 100644 --- a/apps/statistics/store.cpp +++ b/apps/statistics/store.cpp @@ -88,6 +88,10 @@ bool Store::scrollToSelectedBarIndex(int index) { /* Calculation */ +float Store::sumOfOccurrences() { + return sumOfColumn(1); +} + float Store::maxValue() { float max = -FLT_MAX; for (int k = 0; k < m_numberOfPairs; k++) { diff --git a/apps/statistics/store.h b/apps/statistics/store.h index dd48b93c9..28e851f3a 100644 --- a/apps/statistics/store.h +++ b/apps/statistics/store.h @@ -24,6 +24,7 @@ public: bool scrollToSelectedBarIndex(int index); // Calculation + float sumOfOccurrences(); float maxValue(); float minValue(); float range(); @@ -46,6 +47,8 @@ private: float m_firstDrawnBarAbscissa; }; +typedef float (Store::*CalculPointer)(); + } #endif diff --git a/apps/variable_box_controller.cpp b/apps/variable_box_controller.cpp index 5c364cd68..85b2e47b0 100644 --- a/apps/variable_box_controller.cpp +++ b/apps/variable_box_controller.cpp @@ -186,17 +186,8 @@ const Expression * VariableBoxController::ContentViewController::expressionForIn } VariableBoxController::ContentViewController::Page VariableBoxController::ContentViewController::pageAtIndex(int index) { - switch (index) { - case 0: - return Page::Scalar; - case 1: - return Page::List; - case 2: - return Page::Matrix; - default: - assert(false); - return Page::RootMenu; - } + Page pages[3] = {Page::Scalar, Page::List, Page::Matrix}; + return pages[index]; } void VariableBoxController::ContentViewController::putLabelAtIndexInBuffer(int index, char * buffer) { @@ -218,17 +209,8 @@ void VariableBoxController::ContentViewController::putLabelAtIndexInBuffer(int i const char * VariableBoxController::ContentViewController::nodeLabelAtIndex(int index) { assert(m_currentPage == Page::RootMenu); - switch (index) { - case 0: - return "Nombre"; - case 1: - return "Liste"; - case 2: - return "Matrice"; - default: - assert(false); - return nullptr; - } + const char * labels[3] = {"Nombre", "Liste", "Matrice"}; + return labels[index]; } void VariableBoxController::ContentViewController::setTextFieldCaller(TextField * textField) {