LEMUR Packages: ompl_lemur or_lemur pr_bgl prpy_lemur
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends Groups Pages
overlay_manager.h
Go to the documentation of this file.
1 
10 namespace pr_bgl
11 {
12 
33 template <class GCore, class GOver, class OverVertexMap, class OverEdgeMap>
35 {
36 public:
37 
38  GCore & gcore;
39  GOver & gover;
40  OverVertexMap over_vertex_map;
41  OverEdgeMap over_edge_map;
42  bool is_applied;
43 
45  GCore & gcore,
46  GOver & gover,
47  OverVertexMap over_vertex_map,
48  OverEdgeMap over_edge_map):
49  gcore(gcore),
50  gover(gover),
51  over_vertex_map(over_vertex_map),
52  over_edge_map(over_edge_map),
53  is_applied(false)
54  {
55  }
56 
57  // keep track of order of vertices and edges that have been applied
58  std::vector<typename boost::graph_traits<GOver>::vertex_descriptor> applied_vertices;
59  std::vector<typename boost::graph_traits<GOver>::edge_descriptor> applied_edges;
60 
61  void apply()
62  {
63  assert(is_applied == false);
64  // copy non-anchor VERTICES first
65  typename boost::graph_traits<GOver>::vertex_iterator vi, vi_end;
66  for (boost::tie(vi,vi_end)=vertices(gover); vi!=vi_end; ++vi)
67  {
68  // skip anchor vertices (they're already added, no need to copy anything either)
69  if (get(over_vertex_map, *vi) != boost::graph_traits<GCore>::null_vertex())
70  continue;
71  // ok, need to add this vertex to core graph!
72  typename boost::graph_traits<GCore>::vertex_descriptor vcore = add_vertex(gcore);
73  put(over_vertex_map, *vi, vcore);
74  applied_vertices.push_back(*vi);
75  // copy data?
76  }
77  // next, copy all edges
78  typename boost::graph_traits<GOver>::edge_iterator ei, ei_end;
79  for (boost::tie(ei,ei_end)=edges(gover); ei!=ei_end; ++ei)
80  {
81  // ok, need to add this edge to core graph!
82  typename boost::graph_traits<GCore>::edge_descriptor ecore
83  = add_edge(get(over_vertex_map, source(*ei,gover)),
84  get(over_vertex_map, target(*ei,gover)), gcore).first;
85  put(over_edge_map, *ei, ecore);
86  applied_edges.push_back(*ei);
87  // copy data?
88  }
89  is_applied = true;
90  }
91 
92  void unapply()
93  {
94  assert(is_applied == true);
95  // remove edges in reverse order
96  while (applied_edges.size())
97  {
98  typename boost::graph_traits<GOver>::edge_descriptor eover = applied_edges.back();
99  applied_edges.pop_back();
100  // TODO: copy data back?
101  typename boost::graph_traits<GCore>::edge_descriptor ecore = get(over_edge_map, eover);
102  remove_edge(ecore, gcore);
103  }
104  // remove vertices in reverse order
105  while (applied_vertices.size())
106  {
107  typename boost::graph_traits<GOver>::vertex_descriptor vover = applied_vertices.back();
108  applied_vertices.pop_back();
109  // TODO: copy data back?
110  typename boost::graph_traits<GCore>::vertex_descriptor vcore = get(over_vertex_map, vover);
111  remove_vertex(vcore, gcore);
112  // reset vertex pointer so over vertex is known to be a non-anchor vertex
113  put(over_vertex_map, vover, boost::graph_traits<GCore>::null_vertex());
114  }
115  is_applied = false;
116  }
117 };
118 
119 } // namespace pr_bgl
Class which maintains an overlay graph.
Definition: overlay_manager.h:34