#ifndef TREE_REFERENCE_H #define TREE_REFERENCE_H #include "tree_pool.h" #include template class TreeReference { public: TreeReference(const TreeReference & tr) { int trNodeIdentifier = tr.m_identifier; printf("TreeReference copy of %d\n", trNodeIdentifier); TreeNode * nodeCopy = TreePool::sharedPool()->deepCopy(TreePool::sharedPool()->node(trNodeIdentifier)); m_identifier = nodeCopy->identifier(); } ~TreeReference() { printf("TreeRef destroy of %d\n", m_identifier); assert(node()); assert(node()->identifier() == m_identifier); node()->release(); } operator TreeReference() const { // TODO: make sure this is kosher // static_assert(sizeof(ExpressionReference) == sizeof(ExpressionReference), "All ExpressionReference are supposed to have the same size"); return *(reinterpret_cast *>(this)); } int numberOfChildren() const { return node()->numberOfChildren(); } TreeReference childAtIndex(int i) const { return TreeReference(node()->childAtIndex(i)); } void addChild(TreeReference t) { TreeNode * deepCopy = TreePool::sharedPool()->deepCopy(t.node()); TreePool::sharedPool()->move( deepCopy, node()->next() ); } void removeChild(TreeReference t) { TreePool::sharedPool()->move( t.node(), TreePool::sharedPool()->last() ); t.node()->release(); } T * node() const { // TODO: Here, assert that the node type is indeed T return static_cast(TreePool::sharedPool()->node(m_identifier)); } int identifier() const { return m_identifier; } protected: TreeReference() { TreeNode * node = TreePool::sharedPool()->createTreeNode(); m_identifier = node->identifier(); printf("Creating TreeRef of new node %d\n", m_identifier); } private: TreeReference(TreeNode * node) : m_identifier(node->identifier()) { printf("Creating TreeRef of existing node %d\n", m_identifier); node->retain(); } int m_identifier; }; #endif