Expression simplification

This commit is contained in:
Léa Saviot
2018-06-29 20:07:27 +02:00
parent 370a10710c
commit 3135fff759
8 changed files with 21 additions and 15 deletions

View File

@@ -44,10 +44,10 @@ public:
}
int numberOfChildren() const override { return m_numberOfChildren; }
void incrementNumberOfChildren() override { m_numberOfChildren++; }
void decrementNumberOfChildren() override {
void incrementNumberOfChildren(int increment = 1) override { m_numberOfChildren+= increment; }
void decrementNumberOfChildren(int decrement = 1) override {
assert(m_numberOfChildren > 0);
m_numberOfChildren--;
m_numberOfChildren-= decrement;
}
void eraseNumberOfChildren() override {
m_numberOfChildren = 0;

View File

@@ -8,7 +8,8 @@ public:
enum class Type : uint8_t {
AllocationFailure = 0,
Float = 1,
Addition
Addition,
SimplificationRoot
};
// Expression

View File

@@ -17,10 +17,10 @@ public:
}
int numberOfChildren() const override { return m_numberOfChildren; }
void incrementNumberOfChildren() override { m_numberOfChildren++; }
void decrementNumberOfChildren() override {
void incrementNumberOfChildren(int increment = 1) override { m_numberOfChildren+= increment; }
void decrementNumberOfChildren(int decrement = 1) override {
assert(m_numberOfChildren > 0);
m_numberOfChildren--;
m_numberOfChildren-= decrement;
}
void eraseNumberOfChildren() override {
m_numberOfChildren = 0;

1
refs.h
View File

@@ -1,6 +1,7 @@
#include "addition_node.h"
#include "allocation_failed_expression_node.h"
#include "float_node.h"
#include "simplification_root_node.h"
#include "char_layout_node.h"
#include "horizontal_layout_node.h"

View File

@@ -232,7 +232,7 @@ void testSimplify() {
FloatRef(2.0f));
assert_expression_approximates_to(a, 3);
SimplificationRootRef b(a);
a.deepReduce();
assert_expression_approximates_to(a, 3);
@@ -277,7 +277,8 @@ int main() {
runTest(testPoolExpressionAllocationFail);
runTest(testPoolExpressionAllocationFail2);
runTest(testPoolExpressionAllocationFailOnImbricatedAdditions);
//runTest(testStealOperand);
runTest(testStealOperand);
runTest(testSimplify);
printf("\n*******************\nEnd of tests\n*******************\n\n");
return 0;
}

View File

@@ -51,8 +51,8 @@ public:
TreeNode * parentTree() const;
TreeNode * editableRootTree();
virtual int numberOfChildren() const = 0;
virtual void incrementNumberOfChildren() {} //TODO Put an assert false
virtual void decrementNumberOfChildren() {} //TODO Put an assert false //TODO what if somebody i stealing a unary tree's only child ?
virtual void incrementNumberOfChildren(int increment = 1) {} //TODO Put an assert false
virtual void decrementNumberOfChildren(int decrement = 1) {} //TODO Put an assert false //TODO what if somebody i stealing a unary tree's only child ?
virtual void eraseNumberOfChildren() {} //TODO Put an assert false //TODO what if somebody i stealing a unary tree's only child ?
int numberOfDescendants(bool includeSelf) const;
TreeNode * childTreeAtIndex(int i) const;

View File

@@ -141,7 +141,7 @@ private:
// Pool memory
void * alloc(size_t size);
void dealloc(TreeNode * ptr);
static inline bool insert(char * destination, char * source, size_t length);
bool insert(char * destination, char * source, size_t length);
void moveNodes(TreeNode * source, TreeNode * destination, size_t moveLength);
// Identifiers

View File

@@ -61,8 +61,8 @@ public:
bool isAllocationFailure() const { return node()->isAllocationFailure(); }
int nodeRetainCount() const { return node()->retainCount(); }
void incrementNumberOfChildren() { return node()->incrementNumberOfChildren(); }
void decrementNumberOfChildren() { return node()->decrementNumberOfChildren(); }
void incrementNumberOfChildren(int increment = 1) { return node()->incrementNumberOfChildren(increment); }
void decrementNumberOfChildren(int decrement = 1) { return node()->decrementNumberOfChildren(decrement); }
operator TreeReference<TreeNode>() const {
return TreeReference<TreeNode>(this->node());
@@ -209,11 +209,14 @@ public:
void mergeChildren(TreeReference<T> t) {
// Steal operands
TreePool::sharedPool()->moveChildren(t.node(), node()->lastDescendant());
int numberOfNewChildren = t.numberOfChildren();
TreePool::sharedPool()->moveChildren(t.node(), node()->lastDescendant()->next());
t.node()->eraseNumberOfChildren();
// If t is a child, remove it
if (node()->hasChild(t.node())) {
removeChild(t);
}
node()->incrementNumberOfChildren(numberOfNewChildren);
}
protected: