00001 #ifndef GRAPH_HELPER_H_INCLUDED_ 00002 #define GRAPH_HELPER_H_INCLUDED_ 00003 00004 #include<set> 00005 #include<utility> 00006 #include<list> 00007 00008 #include "rose.h" 00009 00010 #include "boost/graph/adjacency_list.hpp" 00011 #include "boost/graph/breadth_first_search.hpp" 00012 00013 #include "segment_graph.h" // needed for vertex_descriptor 00014 00015 namespace risc { 00016 00017 namespace sg { 00018 00019 class LeafNodeVisitor: public boost::default_bfs_visitor { 00020 00021 public: 00022 00023 LeafNodeVisitor(std::set<Graph::vertex_descriptor>& leaf_nodes): 00024 leaf_nodes_(leaf_nodes) 00025 { } 00026 00027 LeafNodeVisitor(const LeafNodeVisitor &other): 00028 leaf_nodes_(other.leaf_nodes_) 00029 { } 00030 00031 00032 void discover_vertex(const Graph::vertex_descriptor vertex, 00033 const Graph &graph) 00034 { 00035 if(boost::out_degree(vertex, graph) == 0) { 00036 leaf_nodes_.insert(vertex); 00037 } 00038 } 00039 00040 std::set<Graph::vertex_descriptor>& leaf_nodes_; 00041 }; 00042 00043 00044 class BreakStmtVisitor: public boost::default_bfs_visitor { 00045 00046 public: 00047 00048 BreakStmtVisitor(std::set<Graph::vertex_descriptor>& segment_with_break): 00049 segment_with_break_(segment_with_break) 00050 { } 00051 00052 BreakStmtVisitor(const BreakStmtVisitor &other): 00053 segment_with_break_(other.segment_with_break_) 00054 { } 00055 00056 00057 void discover_vertex(const Graph::vertex_descriptor vertex, 00058 const Graph &graph) 00059 { 00060 for(std::vector<SgNode*>::const_iterator 00061 iter = graph[vertex].expressions_.begin(); 00062 iter != graph[vertex].expressions_.end(); 00063 iter++) { 00064 00065 if(isSgBreakStmt(*iter)) { 00066 segment_with_break_.insert(vertex); 00067 return; 00068 } 00069 } 00070 } 00071 00072 std::set<Graph::vertex_descriptor>& segment_with_break_; 00073 }; 00074 00075 00076 class ContinueStmtVisitor: public boost::default_bfs_visitor { 00077 00078 public: 00079 00080 ContinueStmtVisitor(std::set<Graph::vertex_descriptor>& segment_with_break): 00081 segment_with_break_(segment_with_break) 00082 { } 00083 00084 ContinueStmtVisitor(const ContinueStmtVisitor &other): 00085 segment_with_break_(other.segment_with_break_) 00086 { } 00087 00088 00089 void discover_vertex(const Graph::vertex_descriptor vertex, 00090 const Graph &graph) 00091 { 00092 for(std::vector<SgNode*>::const_iterator 00093 iter = graph[vertex].expressions_.begin(); 00094 iter != graph[vertex].expressions_.end(); 00095 iter++) { 00096 00097 if(isSgContinueStmt(*iter)) { 00098 segment_with_break_.insert(vertex); 00099 return; 00100 } 00101 } 00102 } 00103 00104 std::set<Graph::vertex_descriptor>& segment_with_break_; 00105 }; 00106 00112 std::list<int> 00113 get_all_reachable_segments(SegmentGraph &segment_graph, int starting_id); 00114 00115 } // end of namespace sg 00116 00117 } // end of namespace risc 00118 00119 #endif /* GRAPH_HELPER_H_INCLUDED_ */ 00120 00121 /* ex: set softtabstop=2 tabstop=2 shiftwidth=2 expandtab: */