From 86c5d29cb01f0bc12905b2bc2578bf7a034f2624 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Thu, 2 Nov 2017 13:24:02 +0100 Subject: [PATCH] [poincare] Add a shortcut constructor in Hierarchy Change-Id: I2b0de8ab43ae6a0503814a48a20991b4c92572ea --- poincare/include/poincare/dynamic_hierarchy.h | 2 ++ poincare/include/poincare/hierarchy.h | 2 ++ poincare/include/poincare/static_hierarchy.h | 1 + poincare/src/hierarchy.cpp | 7 +++++++ poincare/src/static_hierarchy.cpp | 6 ++++++ 5 files changed, 18 insertions(+) diff --git a/poincare/include/poincare/dynamic_hierarchy.h b/poincare/include/poincare/dynamic_hierarchy.h index c91775887..7eb646333 100644 --- a/poincare/include/poincare/dynamic_hierarchy.h +++ b/poincare/include/poincare/dynamic_hierarchy.h @@ -10,6 +10,8 @@ class DynamicHierarchy : public Hierarchy { public: DynamicHierarchy(); DynamicHierarchy(const Expression * const * operands, int numberOfOperands, bool cloneOperands = true); + DynamicHierarchy(const Expression * operand1, const Expression * operand2, bool cloneOperands = true) : + DynamicHierarchy(ExpressionArray(operand1, operand2), 2, cloneOperands) {} ~DynamicHierarchy(); DynamicHierarchy(const DynamicHierarchy & other) = delete; DynamicHierarchy(DynamicHierarchy && other) = delete; diff --git a/poincare/include/poincare/hierarchy.h b/poincare/include/poincare/hierarchy.h index e3a05e370..43f6769b0 100644 --- a/poincare/include/poincare/hierarchy.h +++ b/poincare/include/poincare/hierarchy.h @@ -14,6 +14,8 @@ public: void detachOperand(const Expression * e); // Removes an operand WITHOUT deleting it void detachOperands(); // Removes all operands WITHOUT deleting them virtual const Expression * const * operands() const = 0; +protected: + static const Expression * const * ExpressionArray(const Expression * e1, const Expression * e2); private: void detachOperandAtIndex(int i); }; diff --git a/poincare/include/poincare/static_hierarchy.h b/poincare/include/poincare/static_hierarchy.h index 0fe716d34..8be7c230b 100644 --- a/poincare/include/poincare/static_hierarchy.h +++ b/poincare/include/poincare/static_hierarchy.h @@ -11,6 +11,7 @@ class StaticHierarchy : public Hierarchy { public: StaticHierarchy(); StaticHierarchy(const Expression * const * operands, bool cloneOperands = true); + StaticHierarchy(const Expression * expression1, const Expression * expression2, bool cloneOperands = true); // Specialized constructor for StaticHierarchy<2> ~StaticHierarchy(); StaticHierarchy(const StaticHierarchy & other) = delete; StaticHierarchy(StaticHierarchy && other) = delete; diff --git a/poincare/src/hierarchy.cpp b/poincare/src/hierarchy.cpp index abef20661..f8f6b1426 100644 --- a/poincare/src/hierarchy.cpp +++ b/poincare/src/hierarchy.cpp @@ -59,6 +59,13 @@ void Hierarchy::replaceOperand(const Expression * oldOperand, Expression * newOp } } +const Expression * const * Hierarchy::ExpressionArray(const Expression * e1, const Expression * e2) { + static const Expression * result[2] = {nullptr, nullptr}; + result[0] = e1; + result[1] = e2; + return result; +} + void Hierarchy::detachOperandAtIndex(int i) { Expression ** op = const_cast(operands()); // When detachOperands is called, it's very likely that said operands have been stolen diff --git a/poincare/src/static_hierarchy.cpp b/poincare/src/static_hierarchy.cpp index 48eed941f..c58c8fa4d 100644 --- a/poincare/src/static_hierarchy.cpp +++ b/poincare/src/static_hierarchy.cpp @@ -19,6 +19,12 @@ StaticHierarchy::StaticHierarchy(const Expression * const * operands, bool cl build(operands, T, cloneOperands); } +template<> +StaticHierarchy<2>::StaticHierarchy(const Expression * e1, const Expression * e2, bool cloneOperands) : + StaticHierarchy(ExpressionArray(e1, e2), cloneOperands) +{ +} + template StaticHierarchy::~StaticHierarchy() { for (int i = 0; i < T; i++) {