mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-03-28 18:20:14 +01:00
Expression simplification
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -8,7 +8,8 @@ public:
|
||||
enum class Type : uint8_t {
|
||||
AllocationFailure = 0,
|
||||
Float = 1,
|
||||
Addition
|
||||
Addition,
|
||||
SimplificationRoot
|
||||
};
|
||||
|
||||
// Expression
|
||||
|
||||
@@ -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
1
refs.h
@@ -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"
|
||||
|
||||
5
test.cpp
5
test.cpp
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user