diff --git a/expression_node.h b/expression_node.h index 65aa43e16..12aaea11a 100644 --- a/expression_node.h +++ b/expression_node.h @@ -9,18 +9,6 @@ public: TreePool::sharedPool()->registerNode(this); } - // TODO: operator new and delte - // this behavior is the same for every TreeNode - // Find a way to define it on the TreeNode - - void * operator new(size_t count) { - return TreePool::sharedPool()->alloc(count); - } - - void operator delete(void * ptr) { - TreePool::sharedPool()->dealloc(ptr); - } - virtual float approximate() = 0; int numberOfOperands() { return numberOfChildren(); } ExpressionNode * operand(int i) { return static_cast(childAtIndex(i)); } diff --git a/tree_node.cpp b/tree_node.cpp index edc4beee7..d2ae1e070 100644 --- a/tree_node.cpp +++ b/tree_node.cpp @@ -20,8 +20,6 @@ void TreeNode::release() { } } printf("Delete %d(%p)\n", m_identifier, this); - int identifier = m_identifier; - delete this; - TreePool::sharedPool()->freeIdentifier(identifier); + TreePool::sharedPool()->discardTreeNode(this); } } diff --git a/tree_pool.h b/tree_pool.h index aeb44f5b2..4f70c8ac6 100644 --- a/tree_pool.h +++ b/tree_pool.h @@ -3,6 +3,7 @@ #include #include "tree_node.h" +#include class TreePool { public: @@ -33,18 +34,27 @@ public: void dealloc(void * ptr); // Node - template - TreeNode * createTreeNode() { - // TODO - // Find a new identifier - // Find a memory location for node + template + T * createTreeNode() { + int nodeIdentifier = generateIdentifier(); + if (nodeIdentifier == -1) { + return nullptr; // TODO return static node "failedAllocation" + } + void * ptr = alloc(sizeof(T)); + // TODO handle allocation problem! + TreeNode * node = new(ptr) T(); + node->rename(nodeIdentifier); + registerNode(node); + return reinterpret_cast(node); } + void discardTreeNode(TreeNode * node) { - // TODO - // Reclaim node's identifier - // Then call the destructor on node - // then dealloc node's memory + int nodeIdentifier = node->identifier(); + node->~TreeNode(); + dealloc(static_cast(node)); + freeIdentifier(nodeIdentifier); } + TreeNode * node(int identifier) const; TreeNode * first() const { return reinterpret_cast(const_cast(m_buffer)); } TreeNode * last() const { return reinterpret_cast(const_cast(m_cursor)); } diff --git a/tree_reference.h b/tree_reference.h index 0a5a277b4..fa794fc2d 100644 --- a/tree_reference.h +++ b/tree_reference.h @@ -62,7 +62,7 @@ public: protected: TreeReference() { - TreeNode * node = new T(); + TreeNode * node = TreePool::sharedPool()->createTreeNode(); m_identifier = node->identifier(); printf("Creating TreeRef of new node %d\n", m_identifier); }