From 8c5a208b3129143f624958e7f89f0f41e8a3e350 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Thu, 7 Jun 2018 11:48:50 +0200 Subject: [PATCH] [app/reg] Model layouts are accessible through virtual method --- apps/regression/model/cubic_model.cpp | 2 +- apps/regression/model/cubic_model.h | 2 +- apps/regression/model/exponential_model.cpp | 2 +- apps/regression/model/exponential_model.h | 2 +- apps/regression/model/linear_model.cpp | 2 +- apps/regression/model/linear_model.h | 2 +- apps/regression/model/logarithmic_model.cpp | 2 +- apps/regression/model/logarithmic_model.h | 2 +- apps/regression/model/logistic_model.cpp | 2 +- apps/regression/model/logistic_model.h | 2 +- apps/regression/model/model.h | 1 + apps/regression/model/power_model.cpp | 2 +- apps/regression/model/power_model.h | 2 +- apps/regression/model/quadratic_model.cpp | 2 +- apps/regression/model/quadratic_model.h | 2 +- apps/regression/model/quartic_model.cpp | 2 +- apps/regression/model/quartic_model.h | 2 +- apps/regression/model/trigonometric_model.cpp | 2 +- apps/regression/model/trigonometric_model.h | 2 +- apps/regression/regression_controller.cpp | 34 +------------------ apps/regression/store.h | 3 ++ 21 files changed, 23 insertions(+), 51 deletions(-) diff --git a/apps/regression/model/cubic_model.cpp b/apps/regression/model/cubic_model.cpp index ea4a8f884..7d0dadb2e 100644 --- a/apps/regression/model/cubic_model.cpp +++ b/apps/regression/model/cubic_model.cpp @@ -7,7 +7,7 @@ using namespace Poincare; namespace Regression { -ExpressionLayout * CubicModel::Layout() { +ExpressionLayout * CubicModel::layout() { static ExpressionLayout * layout = nullptr; if (layout == nullptr) { const ExpressionLayout * layoutChildren[] = { diff --git a/apps/regression/model/cubic_model.h b/apps/regression/model/cubic_model.h index 62abb0329..9827d0308 100644 --- a/apps/regression/model/cubic_model.h +++ b/apps/regression/model/cubic_model.h @@ -9,7 +9,7 @@ namespace Regression { class CubicModel : public Model { public: using Model::Model; - static Poincare::ExpressionLayout * Layout(); + Poincare::ExpressionLayout * layout() override; double evaluate(double * modelCoefficients, double x) const override; double levelSet(double * modelCoefficients, double y) const override; double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override; diff --git a/apps/regression/model/exponential_model.cpp b/apps/regression/model/exponential_model.cpp index 7ffa060d8..338d2505b 100644 --- a/apps/regression/model/exponential_model.cpp +++ b/apps/regression/model/exponential_model.cpp @@ -7,7 +7,7 @@ using namespace Poincare; namespace Regression { -ExpressionLayout * ExponentialModel::Layout() { +ExpressionLayout * ExponentialModel::layout() { static ExpressionLayout * layout = nullptr; if (layout == nullptr) { const ExpressionLayout * layoutChildren[] = { diff --git a/apps/regression/model/exponential_model.h b/apps/regression/model/exponential_model.h index 385d00d9e..0c7c2b486 100644 --- a/apps/regression/model/exponential_model.h +++ b/apps/regression/model/exponential_model.h @@ -9,7 +9,7 @@ namespace Regression { class ExponentialModel : public Model { public: using Model::Model; - static Poincare::ExpressionLayout * Layout(); + Poincare::ExpressionLayout * layout() override; double evaluate(double * modelCoefficients, double x) const override; double levelSet(double * modelCoefficients, double y) const override; double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override; diff --git a/apps/regression/model/linear_model.cpp b/apps/regression/model/linear_model.cpp index 418bfbc7c..26a3e656f 100644 --- a/apps/regression/model/linear_model.cpp +++ b/apps/regression/model/linear_model.cpp @@ -7,7 +7,7 @@ using namespace Poincare; namespace Regression { -ExpressionLayout * LinearModel::Layout() { +ExpressionLayout * LinearModel::layout() { static ExpressionLayout * layout = LayoutEngine::createStringLayout("aX+b", 4, KDText::FontSize::Small); return layout; } diff --git a/apps/regression/model/linear_model.h b/apps/regression/model/linear_model.h index 87cd430a5..4ca50be68 100644 --- a/apps/regression/model/linear_model.h +++ b/apps/regression/model/linear_model.h @@ -9,7 +9,7 @@ namespace Regression { class LinearModel : public Model { public: using Model::Model; - static Poincare::ExpressionLayout * Layout(); + Poincare::ExpressionLayout * layout() override; double evaluate(double * modelCoefficients, double x) const override; double levelSet(double * modelCoefficients, double y) const override; double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override; diff --git a/apps/regression/model/logarithmic_model.cpp b/apps/regression/model/logarithmic_model.cpp index ae0905732..dcc089a81 100644 --- a/apps/regression/model/logarithmic_model.cpp +++ b/apps/regression/model/logarithmic_model.cpp @@ -7,7 +7,7 @@ using namespace Poincare; namespace Regression { -ExpressionLayout * LogarithmicModel::Layout() { +ExpressionLayout * LogarithmicModel::layout() { static ExpressionLayout * layout = LayoutEngine::createStringLayout("aln(X)+b", 8, KDText::FontSize::Small); return layout; } diff --git a/apps/regression/model/logarithmic_model.h b/apps/regression/model/logarithmic_model.h index ff47957e5..67e9e148b 100644 --- a/apps/regression/model/logarithmic_model.h +++ b/apps/regression/model/logarithmic_model.h @@ -9,7 +9,7 @@ namespace Regression { class LogarithmicModel : public Model { public: using Model::Model; - static Poincare::ExpressionLayout * Layout(); + Poincare::ExpressionLayout * layout() override; double evaluate(double * modelCoefficients, double x) const override; double levelSet(double * modelCoefficients, double y) const override; double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override; diff --git a/apps/regression/model/logistic_model.cpp b/apps/regression/model/logistic_model.cpp index 461a1ef6d..3e68e7154 100644 --- a/apps/regression/model/logistic_model.cpp +++ b/apps/regression/model/logistic_model.cpp @@ -7,7 +7,7 @@ using namespace Poincare; namespace Regression { -ExpressionLayout * LogisticModel::Layout() { +ExpressionLayout * LogisticModel::layout() { static ExpressionLayout * layout = nullptr; if (layout == nullptr) { const ExpressionLayout * layoutChildren[] = { diff --git a/apps/regression/model/logistic_model.h b/apps/regression/model/logistic_model.h index 41fdc9385..7eb10b85c 100644 --- a/apps/regression/model/logistic_model.h +++ b/apps/regression/model/logistic_model.h @@ -9,7 +9,7 @@ namespace Regression { class LogisticModel : public Model { public: using Model::Model; - static Poincare::ExpressionLayout * Layout(); + Poincare::ExpressionLayout * layout() override; double evaluate(double * modelCoefficients, double x) const override; double levelSet(double * modelCoefficients, double y) const override; double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override; diff --git a/apps/regression/model/model.h b/apps/regression/model/model.h index 7edb6bf0e..ae3657254 100644 --- a/apps/regression/model/model.h +++ b/apps/regression/model/model.h @@ -25,6 +25,7 @@ public: static constexpr int k_numberOfModels = 9; static constexpr int k_maxNumberOfCoefficients = 5; virtual ~Model() = default; + virtual Poincare::ExpressionLayout * layout() = 0; virtual double evaluate(double * modelCoefficients, double x) const = 0; virtual double levelSet(double * modelCoefficients, double y) const = 0; virtual void fit(Store * store, int series, double * modelCoefficients, Poincare::Context * context); diff --git a/apps/regression/model/power_model.cpp b/apps/regression/model/power_model.cpp index c2e7962a4..8130dcbd6 100644 --- a/apps/regression/model/power_model.cpp +++ b/apps/regression/model/power_model.cpp @@ -7,7 +7,7 @@ using namespace Poincare; namespace Regression { -ExpressionLayout * PowerModel::Layout() { +ExpressionLayout * PowerModel::layout() { static ExpressionLayout * layout = nullptr; if (layout == nullptr) { const ExpressionLayout * layoutChildren[] = { diff --git a/apps/regression/model/power_model.h b/apps/regression/model/power_model.h index aad1f57cf..df8da8fdf 100644 --- a/apps/regression/model/power_model.h +++ b/apps/regression/model/power_model.h @@ -9,7 +9,7 @@ namespace Regression { class PowerModel : public Model { public: using Model::Model; - static Poincare::ExpressionLayout * Layout(); + Poincare::ExpressionLayout * layout() override; double evaluate(double * modelCoefficients, double x) const override; double levelSet(double * modelCoefficients, double y) const override; double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override; diff --git a/apps/regression/model/quadratic_model.cpp b/apps/regression/model/quadratic_model.cpp index 7502ca258..1655a9af5 100644 --- a/apps/regression/model/quadratic_model.cpp +++ b/apps/regression/model/quadratic_model.cpp @@ -7,7 +7,7 @@ using namespace Poincare; namespace Regression { -ExpressionLayout * QuadraticModel::Layout() { +ExpressionLayout * QuadraticModel::layout() { static ExpressionLayout * layout = nullptr; if (layout == nullptr) { const ExpressionLayout * layoutChildren[] = { diff --git a/apps/regression/model/quadratic_model.h b/apps/regression/model/quadratic_model.h index 08805c819..607cb1ab1 100644 --- a/apps/regression/model/quadratic_model.h +++ b/apps/regression/model/quadratic_model.h @@ -9,7 +9,7 @@ namespace Regression { class QuadraticModel : public Model { public: using Model::Model; - static Poincare::ExpressionLayout * Layout(); + Poincare::ExpressionLayout * layout() override; double evaluate(double * modelCoefficients, double x) const override; double levelSet(double * modelCoefficients, double y) const override; double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override; diff --git a/apps/regression/model/quartic_model.cpp b/apps/regression/model/quartic_model.cpp index a2f3b0aca..4a83044e1 100644 --- a/apps/regression/model/quartic_model.cpp +++ b/apps/regression/model/quartic_model.cpp @@ -7,7 +7,7 @@ using namespace Poincare; namespace Regression { -ExpressionLayout * QuarticModel::Layout() { +ExpressionLayout * QuarticModel::layout() { static ExpressionLayout * layout = nullptr; if (layout == nullptr) { const ExpressionLayout * layoutChildren[] = { diff --git a/apps/regression/model/quartic_model.h b/apps/regression/model/quartic_model.h index 60cb06775..bca5f7188 100644 --- a/apps/regression/model/quartic_model.h +++ b/apps/regression/model/quartic_model.h @@ -9,7 +9,7 @@ namespace Regression { class QuarticModel : public Model { public: using Model::Model; - static Poincare::ExpressionLayout * Layout(); + Poincare::ExpressionLayout * layout() override; double evaluate(double * modelCoefficients, double x) const override; double levelSet(double * modelCoefficients, double y) const override; double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override; diff --git a/apps/regression/model/trigonometric_model.cpp b/apps/regression/model/trigonometric_model.cpp index d472d5db7..39aad9ca4 100644 --- a/apps/regression/model/trigonometric_model.cpp +++ b/apps/regression/model/trigonometric_model.cpp @@ -8,7 +8,7 @@ using namespace Poincare; namespace Regression { -ExpressionLayout * TrigonometricModel::Layout() { +ExpressionLayout * TrigonometricModel::layout() { static ExpressionLayout * layout = LayoutEngine::createStringLayout("asin(bX+c)", 10, KDText::FontSize::Small); return layout; } diff --git a/apps/regression/model/trigonometric_model.h b/apps/regression/model/trigonometric_model.h index 61058b187..0cd120b68 100644 --- a/apps/regression/model/trigonometric_model.h +++ b/apps/regression/model/trigonometric_model.h @@ -9,7 +9,7 @@ namespace Regression { class TrigonometricModel : public Model { public: using Model::Model; - static Poincare::ExpressionLayout * Layout(); + Poincare::ExpressionLayout * layout() override; double evaluate(double * modelCoefficients, double x) const override; double levelSet(double * modelCoefficients, double y) const override; double partialDerivate(double * modelCoefficients, int derivateCoefficientIndex, double x) const override; diff --git a/apps/regression/regression_controller.cpp b/apps/regression/regression_controller.cpp index dd4c1d865..0fedecbd8 100644 --- a/apps/regression/regression_controller.cpp +++ b/apps/regression/regression_controller.cpp @@ -79,39 +79,7 @@ void RegressionController::willDisplayCellAtLocation(HighlightCell * cell, int i I18n::Message messages[k_numberOfRows] = {I18n::Message::Linear, I18n::Message::Quadratic, I18n::Message::Cubic, I18n::Message::Quartic, I18n::Message::Logarithmic, I18n::Message::Exponential, I18n::Message::Power, I18n::Message::Trigonometric, I18n::Message::Logistic}; MessageTableCellWithExpression * castedCell = static_cast(cell); castedCell->setMessage(messages[j]); - switch ((Model::Type) j) { - // TODO virtualize ? - case Model::Type::Linear: - castedCell->setExpressionLayout(LinearModel::Layout()); - break; - case Model::Type::Quadratic: - castedCell->setExpressionLayout(QuadraticModel::Layout()); - break; - case Model::Type::Cubic: - castedCell->setExpressionLayout(CubicModel::Layout()); - break; - case Model::Type::Quartic: - castedCell->setExpressionLayout(QuarticModel::Layout()); - break; - case Model::Type::Logarithmic: - castedCell->setExpressionLayout(LogarithmicModel::Layout()); - break; - case Model::Type::Exponential: - castedCell->setExpressionLayout(ExponentialModel::Layout()); - break; - case Model::Type::Power: - castedCell->setExpressionLayout(PowerModel::Layout()); - break; - case Model::Type::Trigonometric: - castedCell->setExpressionLayout(TrigonometricModel::Layout()); - break; - case Model::Type::Logistic: - castedCell->setExpressionLayout(LogisticModel::Layout()); - break; - default: - assert(false); - break; - } + castedCell->setExpressionLayout(m_store->regressionModel((Model::Type) j)->layout()); } } diff --git a/apps/regression/store.h b/apps/regression/store.h index 7a755bcf8..425f7a378 100644 --- a/apps/regression/store.h +++ b/apps/regression/store.h @@ -35,6 +35,9 @@ public: /* Return the closest dot to given dot, on the right if direction > 0, * on the left otherwise */ int nextDot(int series, int direction, int dot); + Model * regressionModel(Model::Type type) { + return m_regressionModels[(int) type]; + } // Window void setDefault() override;