LEMUR Packages: ompl_lemur or_lemur pr_bgl prpy_lemur
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends Groups Pages
edge_indexed_graph.h
Go to the documentation of this file.
1 
9 namespace pr_bgl
10 {
11 
19 template <class Graph, class EdgeIndexMap>
21 {
22 public:
23  typedef typename boost::graph_traits<Graph>::vertex_descriptor vertex_descriptor;
24  typedef typename boost::graph_traits<Graph>::edge_descriptor edge_descriptor;
25  typedef typename boost::graph_traits<Graph>::adjacency_iterator adjacency_iterator;
26  typedef typename boost::graph_traits<Graph>::out_edge_iterator out_edge_iterator;
27  typedef typename boost::graph_traits<Graph>::in_edge_iterator in_edge_iterator;
28  typedef typename boost::graph_traits<Graph>::vertex_iterator vertex_iterator;
29  typedef typename boost::graph_traits<Graph>::directed_category directed_category;
30  typedef typename boost::graph_traits<Graph>::edge_parallel_category edge_parallel_category;
31  typedef typename boost::graph_traits<Graph>::traversal_category traversal_category;
32  typedef typename boost::graph_traits<Graph>::vertices_size_type vertices_size_type;
33  typedef typename boost::graph_traits<Graph>::edges_size_type edges_size_type;
34  typedef typename boost::graph_traits<Graph>::degree_size_type degree_size_type;
35  typedef typename std::vector<edge_descriptor>::const_iterator edge_iterator;
37 
38  Graph & m_g;
39  EdgeIndexMap edge_index_map;
40  std::vector<edge_descriptor> edge_vector;
41  EdgeVectorMap edge_vector_map;
42 
43  edge_indexed_graph(Graph & g, EdgeIndexMap edge_index_map):
44  m_g(g),
45  edge_index_map(edge_index_map),
46  edge_vector_map(edge_vector)
47  {
48  BOOST_ASSERT(num_edges(g) == 0);
49  }
50 
51  static vertex_descriptor null_vertex()
52  {
53  return boost::graph_traits<Graph>::null_vertex();
54  }
55 };
56 
57 template <class Graph, class EdgeIndexMap>
58 inline typename boost::graph_traits<Graph>::vertices_size_type
59 num_vertices(const edge_indexed_graph<Graph,EdgeIndexMap> & g)
60 {
61  return num_vertices(g.m_g);
62 }
63 
64 template <class Graph, class EdgeIndexMap>
65 inline typename boost::graph_traits<Graph>::edges_size_type
66 num_edges(const edge_indexed_graph<Graph,EdgeIndexMap> & g)
67 {
68  return g.edge_vector.size();
69 }
70 
71 template <class Graph, class EdgeIndexMap>
72 inline typename boost::graph_traits<Graph>::vertex_descriptor
73 vertex(typename boost::graph_traits<Graph>::vertices_size_type n, const edge_indexed_graph<Graph,EdgeIndexMap> & g)
74 {
75  return vertex(n, g.m_g);
76 }
77 
78 template <class Graph, class EdgeIndexMap>
79 inline std::pair<typename boost::graph_traits<Graph>::vertex_iterator, typename boost::graph_traits<Graph>::vertex_iterator>
80 vertices(const edge_indexed_graph<Graph,EdgeIndexMap> & g)
81 {
82  return vertices(g.m_g);
83 }
84 
85 template <class Graph, class EdgeIndexMap>
86 inline std::pair<typename edge_indexed_graph<Graph,EdgeIndexMap>::edge_iterator, typename edge_indexed_graph<Graph,EdgeIndexMap>::edge_iterator>
87 edges(const edge_indexed_graph<Graph,EdgeIndexMap> & g)
88 {
89  return std::make_pair(g.edge_vector.begin(), g.edge_vector.end());
90 }
91 
92 template <class Graph, class EdgeIndexMap>
93 inline typename boost::graph_traits<Graph>::vertex_descriptor
94 source(typename boost::graph_traits<Graph>::edge_descriptor e, const edge_indexed_graph<Graph,EdgeIndexMap> & g)
95 {
96  return source(e, g.m_g);
97 }
98 
99 template <class Graph, class EdgeIndexMap>
100 inline typename boost::graph_traits<Graph>::vertex_descriptor
101 target(typename boost::graph_traits<Graph>::edge_descriptor e, const edge_indexed_graph<Graph,EdgeIndexMap> & g)
102 {
103  return target(e, g.m_g);
104 }
105 
106 template <class Graph, class EdgeIndexMap>
107 inline typename boost::graph_traits<Graph>::vertex_descriptor
108 add_vertex(edge_indexed_graph<Graph,EdgeIndexMap> & g)
109 {
110  return add_vertex(g.m_g);
111 }
112 
113 template <class Graph, class EdgeIndexMap>
114 inline std::pair<typename boost::graph_traits<Graph>::edge_descriptor, bool>
115 add_edge(
116  typename boost::graph_traits<Graph>::vertex_descriptor u,
117  typename boost::graph_traits<Graph>::vertex_descriptor v,
118  edge_indexed_graph<Graph,EdgeIndexMap> & g)
119 {
120  std::pair<typename boost::graph_traits<Graph>::edge_descriptor, bool>
121  res = add_edge(u, v, g.m_g);
122  if (res.second)
123  {
124  put(g.edge_index_map, res.first, g.edge_vector.size());
125  g.edge_vector.push_back(res.first);
126  }
127  return res;
128 }
129 
130 template <class Graph, class EdgeIndexMap>
131 inline void
132 remove_vertex(
133  typename boost::graph_traits<Graph>::vertex_descriptor u,
134  edge_indexed_graph<Graph,EdgeIndexMap> & g)
135 {
136  remove_vertex(u, g.m_g);
137 }
138 
139 template <class Graph, class EdgeIndexMap>
140 inline void
141 remove_edge(
142  typename boost::graph_traits<Graph>::edge_descriptor e,
143  edge_indexed_graph<Graph,EdgeIndexMap> & g)
144 {
145  // ensure that we're removing edges in reverse order
146  // (we may be able to loosen this requirement a bit!)
147  BOOST_ASSERT(get(g.edge_index_map, e) == (g.edge_count-1));
148  // assume that external edge index map will get cleaned up for us
149  // leave edge_vector_map alone
150  // (indices bigger than num_edges()-1
151  // will just map to bogus edge descriptors)
152  g.edge_vector.pop_back();
153  remove_edge(e, g.m_g);
154 }
155 
156 } // namespace pr_bgl
Graph wrapper which maintains an edge index.
Definition: edge_indexed_graph.h:20