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++) {