26 class EdgeIt; |
32 class EdgeIt; |
27 class OutEdgeIt; |
33 class OutEdgeIt; |
28 class InEdgeIt; |
34 class InEdgeIt; |
29 class SymEdgeIt; |
35 class SymEdgeIt; |
30 |
36 |
31 template <typename T> class NodeMap; |
37 // template <typename T> class NodeMap; |
32 template <typename T> class EdgeMap; |
38 // template <typename T> class EdgeMap; |
33 private: |
39 private: |
34 template <typename T> friend class NodeMap; |
40 // template <typename T> friend class NodeMap; |
35 template <typename T> friend class EdgeMap; |
41 // template <typename T> friend class EdgeMap; |
36 |
42 |
|
43 NodeMapRegistry<ListGraph, Node> node_maps; |
|
44 |
37 template <typename T> |
45 template <typename T> |
38 class NodeMap { |
46 class NodeMap : public VectorMap<ListGraph, Edge, T, EdgeMapBase> {}; |
39 const ListGraph& G; |
47 |
40 std::vector<T> container; |
48 EdgeMapRegistry<ListGraph, Edge> edge_maps; |
41 public: |
|
42 typedef T ValueType; |
|
43 typedef Node KeyType; |
|
44 NodeMap(const ListGraph& _G) : G(_G), container(G.node_id) { } |
|
45 NodeMap(const ListGraph& _G, T a) : |
|
46 G(_G), container(G.node_id, a) { } |
|
47 void set(Node n, T a) { container[/*G.id(n)*/n.node->id]=a; } |
|
48 T get(Node n) const { return container[/*G.id(n)*/n.node->id]; } |
|
49 typename std::vector<T>::reference operator[](Node n) { |
|
50 return container[/*G.id(n)*/n.node->id]; } |
|
51 typename std::vector<T>::const_reference operator[](Node n) const { |
|
52 return container[/*G.id(n)*/n.node->id]; |
|
53 } |
|
54 void update() { container.resize(G.node_id); } |
|
55 void update(T a) { container.resize(G.node_id, a); } |
|
56 }; |
|
57 |
49 |
58 template <typename T> |
50 template <typename T> |
59 class EdgeMap { |
51 class EdgeMap : public VectorMap<Graph, Node, T, NodeMapBase> {}; |
60 const ListGraph& G; |
52 |
61 std::vector<T> container; |
|
62 public: |
|
63 typedef T ValueType; |
|
64 typedef Edge KeyType; |
|
65 EdgeMap(const ListGraph& _G) : G(_G), container(G.edge_id) { } |
|
66 EdgeMap(const ListGraph& _G, T a) : |
|
67 G(_G), container(G.edge_id, a) { } |
|
68 void set(Edge e, T a) { container[/*G.id(e)*/e.edge->id]=a; } |
|
69 T get(Edge e) const { return container[/*G.id(e)*/e.edge->id]; } |
|
70 typename std::vector<T>::reference operator[](Edge e) { |
|
71 return container[/*G.id(e)*/e.edge->id]; } |
|
72 typename std::vector<T>::const_reference operator[](Edge e) const { |
|
73 return container[/*G.id(e)*/e.edge->id]; |
|
74 } |
|
75 void update() { container.resize(G.edge_id); } |
|
76 void update(T a) { container.resize(G.edge_id, a); } |
|
77 }; |
|
78 |
53 |
79 int node_id; |
54 int node_id; |
80 int edge_id; |
55 int edge_id; |
81 int _node_num; |
56 int _node_num; |
82 int _edge_num; |
57 int _edge_num; |
321 int id(Node v) const { return v.node->id; } |
296 int id(Node v) const { return v.node->id; } |
322 int id(Edge e) const { return e.edge->id; } |
297 int id(Edge e) const { return e.edge->id; } |
323 |
298 |
324 /* adding nodes and edges */ |
299 /* adding nodes and edges */ |
325 |
300 |
326 Node addNode() { return Node(_add_node()); } |
301 Node addNode() { |
|
302 Node n = _add_node(); |
|
303 node_maps.add(n); |
|
304 return n; |
|
305 } |
327 Edge addEdge(Node u, Node v) { |
306 Edge addEdge(Node u, Node v) { |
328 return Edge(_add_edge(u.node, v.node)); |
307 Edge e = _add_edge(u.node, v.node); |
|
308 edge_maps.add(e); |
|
309 return e; |
329 } |
310 } |
330 |
311 |
331 void erase(Node i) { |
312 void erase(Node i) { |
|
313 node_map.erase(i); |
332 while (first<OutEdgeIt>(i).valid()) erase(first<OutEdgeIt>(i)); |
314 while (first<OutEdgeIt>(i).valid()) erase(first<OutEdgeIt>(i)); |
333 while (first<InEdgeIt>(i).valid()) erase(first<InEdgeIt>(i)); |
315 while (first<InEdgeIt>(i).valid()) erase(first<InEdgeIt>(i)); |
334 _delete_node(i.node); |
316 _delete_node(i.node); |
335 } |
317 } |
336 |
318 |
337 void erase(Edge e) { _delete_edge(e.edge); } |
319 void erase(Edge e) { |
|
320 edge_maps.erase(e); |
|
321 _delete_edge(e.edge); |
|
322 } |
338 |
323 |
339 void clear() { |
324 void clear() { |
340 while (first<NodeIt>().valid()) erase(first<NodeIt>()); |
325 while (first<NodeIt>().valid()) erase(first<NodeIt>()); |
341 } |
326 } |
342 |
327 |