+#ifndef __TREE_H__
+#define __TREE_H__
+#include "mymemory.h"
#include <set>
#include <map>
+#include <cstddef>
#include "threads.h"
-typedef thread_id_t tree_t;
-#define TREE_T_NONE -1
+class ModelAction;
/*
* An n-ary tree
*/
class TreeNode {
public:
- TreeNode(TreeNode *par);
+ TreeNode(TreeNode *par = NULL, ModelAction *act = NULL);
~TreeNode();
- bool hasBeenExplored(tree_t id) { return children.find(id) != children.end(); }
- TreeNode *exploreChild(tree_t id);
- tree_t getNextBacktrack();
+ bool hasBeenExplored(thread_id_t id) { return children.find(id_to_int(id)) != children.end(); }
+ TreeNode * explore_child(ModelAction *act);
+ thread_id_t getNextBacktrack();
/* Return 1 if already in backtrack, 0 otherwise */
- int setBacktrack(tree_t id);
- TreeNode *getRoot();
+ int setBacktrack(thread_id_t id);
+ TreeNode * getRoot();
static int getTotalNodes() { return TreeNode::totalNodes; }
+
+ bool is_enabled(Thread *t);
+ MEMALLOC
private:
TreeNode *parent;
- std::map<tree_t, class TreeNode *> children;
- std::set<tree_t> backtrack;
+ std::map<int, class TreeNode *, std::less< int >, MyAlloc< std::pair< const int, class TreeNode * > > > children;
+ std::set<int, std::less< int >, MyAlloc< int > > backtrack;
static int totalNodes;
+ int num_threads;
};
+
+#endif /* __TREE_H__ */