tree: add class TreeNode
[c11tester.git] / tree.cc
diff --git a/tree.cc b/tree.cc
new file mode 100644 (file)
index 0000000..37dfa26
--- /dev/null
+++ b/tree.cc
@@ -0,0 +1,56 @@
+#include "tree.h"
+
+int TreeNode::totalNodes = 0;
+
+TreeNode::TreeNode(TreeNode *par)
+{
+       TreeNode::totalNodes++;
+       this->parent = par;
+}
+
+TreeNode::~TreeNode() {
+       std::map<tree_t, class TreeNode *>::iterator it;
+
+       for (it = children.begin(); it != children.end(); it++)
+               delete it->second;
+       delete &children;
+}
+
+TreeNode *TreeNode::exploreChild(tree_t id)
+{
+       TreeNode *n;
+       std::set<tree_t >::iterator it;
+
+       if (!hasBeenExplored(id)) {
+               n = new TreeNode(this);
+               children[id] = n;
+       } else {
+               n = children[id];
+       }
+       if ((it = backtrack.find(id)) != backtrack.end())
+               backtrack.erase(it);
+
+       return n;
+}
+
+int TreeNode::setBacktrack(tree_t id)
+{
+       if (backtrack.find(id) == backtrack.end())
+               return 1;
+       backtrack.insert(id);
+       return 0;
+}
+
+tree_t TreeNode::getNextBacktrack()
+{
+       if (backtrack.empty())
+               return NULL;
+       return *backtrack.begin();
+}
+
+TreeNode *TreeNode::getRoot()
+{
+       if (parent)
+               return parent->getRoot();
+       return this;
+}