@@ -21,27 +21,33 @@ class Graph {
2121
2222 public:
2323 Sym name () const { return name_; }
24- size_t pre () const { return pre_ ; }
25- size_t post () const { return post_ ; }
26- size_t rp () const { return rp_ ; }
24+ template < size_t mode> size_t pre () const { return order_[mode]. pre ; }
25+ template < size_t mode> size_t post () const { return order_[mode]. post ; }
26+ template < size_t mode> size_t rp () const { return order_[mode]. rp ; }
2727
2828 void link (Node* succ) {
2929 this ->succs_ .emplace (succ);
3030 succ->preds_ .emplace (this );
3131 }
32- const auto & preds () const { return preds_; }
33- const auto & succs () const { return succs_; }
32+
33+ template <size_t mode = 0 > const auto & preds () const { return mode == 0 ? preds_ : succs_; }
34+ template <size_t mode = 0 > const auto & succs () const { return mode == 0 ? succs_ : preds_; }
3435
3536 friend std::ostream& operator <<(std::ostream&, const Node&);
3637
3738 private:
38- std::pair<size_t , size_t > number (size_t , size_t );
39+ template < size_t mode> std::pair<size_t , size_t > number (size_t , size_t );
3940
4041 Sym name_;
4142 NodeSet preds_, succs_;
42- size_t pre_ = Not_Visited;
43- size_t post_ = Not_Visited;
44- size_t rp_ = Not_Visited;
43+
44+ struct Order {
45+ size_t pre = Not_Visited;
46+ size_t post = Not_Visited;
47+ size_t rp = Not_Visited;
48+ };
49+
50+ Order order_[2 ];
4551
4652 friend class Graph ;
4753 };
@@ -65,13 +71,12 @@ class Graph {
6571 fe::Driver& driver () { return driver_; }
6672 Sym name () const { return name_; }
6773 const auto & nodes () const { return nodes_; }
68- const auto & rpo () const { return rpo_; }
74+ template < size_t mode> const auto & rpo () const { return rpo_[mode] ; }
6975 // /@}
7076
7177 void set_name (Sym name) { name_ = name; }
7278 Node* node (Sym name);
7379 void critical_edge_elimination ();
74-
7580 void number ();
7681
7782 friend std::ostream& operator <<(std::ostream&, const Graph&);
@@ -88,12 +93,14 @@ class Graph {
8893 }
8994
9095private:
96+ template <size_t mode> void number_ ();
97+
9198 fe::Driver& driver_;
9299 Sym name_;
93100 Node* entry_ = nullptr ;
94101 Node* exit_ = nullptr ;
95102 fe::SymMap<Node*> nodes_;
96- std::vector<Node*> rpo_;
103+ std::vector<Node*> rpo_[ 2 ] ;
97104};
98105
99106} // namespace graphtool
0 commit comments