57e0c13f69902f071cb336d3a155a15db38f4c08
[c11tester.git] / tree.cc
1 #include "tree.h"
2 #include "action.h"
3
4 int TreeNode::totalNodes = 0;
5
6 TreeNode::TreeNode(TreeNode *par, ModelAction *act)
7 {
8         TreeNode::totalNodes++;
9         this->parent = par;
10 }
11
12 TreeNode::~TreeNode() {
13         std::map<int, class TreeNode *>::iterator it;
14
15         for (it = children.begin(); it != children.end(); it++)
16                 delete it->second;
17 }
18
19 TreeNode * TreeNode::explore_child(ModelAction *act)
20 {
21         TreeNode *n;
22         std::set<int>::iterator it;
23         thread_id_t id = act->get_tid();
24         int i = id_to_int(id);
25
26         if (!hasBeenExplored(id)) {
27                 n = new TreeNode(this, act);
28                 children[i] = n;
29         } else {
30                 n = children[i];
31         }
32         if ((it = backtrack.find(i)) != backtrack.end())
33                 backtrack.erase(it);
34
35         return n;
36 }
37
38 int TreeNode::setBacktrack(thread_id_t id)
39 {
40         int i = id_to_int(id);
41         if (backtrack.find(i) != backtrack.end())
42                 return 1;
43         backtrack.insert(i);
44         return 0;
45 }
46
47 thread_id_t TreeNode::getNextBacktrack()
48 {
49         if (backtrack.empty())
50                 return THREAD_ID_T_NONE;
51         return int_to_id(*backtrack.begin());
52 }
53
54 TreeNode * TreeNode::getRoot()
55 {
56         if (parent)
57                 return parent->getRoot();
58         return this;
59 }