From 3fcca45498f89feee55e697adfe059d6fd34fcd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Tue, 21 Aug 2018 10:41:41 +0200 Subject: [PATCH] [poincare] Complete Matrix class to prepare for parsing --- poincare/include/poincare/matrix.h | 10 +++++++--- poincare/src/matrix.cpp | 19 ++++++++++++++++--- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/poincare/include/poincare/matrix.h b/poincare/include/poincare/matrix.h index a067e9dec..2c108afc6 100644 --- a/poincare/include/poincare/matrix.h +++ b/poincare/include/poincare/matrix.h @@ -68,9 +68,12 @@ class Matrix : public Expression { template friend class MatrixComplexNode; friend class GlobalContext; public: + static Matrix EmptyMatrix() { + return Matrix(TreePool::sharedPool()->createTreeNode()); + } + Matrix() : Expression() {} Matrix(const MatrixNode * node) : Expression(node) {} - Matrix() : Expression(TreePool::sharedPool()->createTreeNode()) {} - Matrix(Expression e) : Matrix() { + Matrix(Expression e) : Matrix(TreePool::sharedPool()->createTreeNode()) { addChildAtIndexInPlace(e, 0, 0); setDimensions(1,1); } @@ -80,8 +83,9 @@ public: int numberOfColumns() const { return node()->numberOfColumns(); } void addChildAtIndexInPlace(TreeByValue t, int index, int currentNumberOfChildren) { Expression::addChildAtIndexInPlace(t, index, currentNumberOfChildren); + setDimensions(1, currentNumberOfChildren + 1); } - + void addChildrenAsRowInPlace(TreeByValue t, int i); Expression matrixChild(int i, int j) { return childAtIndex(i*numberOfColumns()+j); } /* Operation on matrix */ diff --git a/poincare/src/matrix.cpp b/poincare/src/matrix.cpp index 7b01d6baa..a99031021 100644 --- a/poincare/src/matrix.cpp +++ b/poincare/src/matrix.cpp @@ -97,13 +97,26 @@ Evaluation MatrixNode::templatedApproximate(Context& context, Preferences::An // MATRIX void Matrix::setDimensions(int rows, int columns) { - if (node()->type() != ExpressionNode::Type::AllocationFailure) { - assert(rows * columns == node()->numberOfChildren()); - } setNumberOfRows(rows); setNumberOfColumns(columns); } +void Matrix::addChildrenAsRowInPlace(TreeByValue t, int i) { + if (t.isAllocationFailure()) { + replaceWithAllocationFailureInPlace(numberOfChildren()); + return; + } + int previousNumberOfColumns = numberOfColumns(); + if (previousNumberOfColumns > 0) { + assert(t.numberOfChildren() == numberOfColumns()); + } + int previousNumberOfRows = numberOfRows(); + for (int i = 0; i < t.numberOfChildren(); i++) { + addChildAtIndexInPlace(t.childAtIndex(i), numberOfChildren(), numberOfChildren()); + } + setDimensions(previousNumberOfRows + 1, previousNumberOfColumns == 0 ? t.numberOfChildren() : previousNumberOfColumns); +} + int Matrix::rank(Context & context, Preferences::AngleUnit angleUnit) { Matrix m = rowCanonize(context, angleUnit); int rank = m.numberOfRows();