1.1 --- a/src/work/deba/test_graph.h Fri Apr 16 13:26:15 2004 +0000
1.2 +++ b/src/work/deba/test_graph.h Fri Apr 16 13:42:03 2004 +0000
1.3 @@ -7,6 +7,12 @@
1.4
1.5 #include <invalid.h>
1.6
1.7 +#include "vector_map.h"
1.8 +#include "edge_map_registry.h"
1.9 +#include "node_map_registry.h"
1.10 +#include "edge_map_base.h"
1.11 +#include "node_map_base.h"
1.12 +
1.13 namespace hugo {
1.14
1.15 template <typename It>
1.16 @@ -28,53 +34,22 @@
1.17 class InEdgeIt;
1.18 class SymEdgeIt;
1.19
1.20 - template <typename T> class NodeMap;
1.21 - template <typename T> class EdgeMap;
1.22 +// template <typename T> class NodeMap;
1.23 +// template <typename T> class EdgeMap;
1.24 private:
1.25 - template <typename T> friend class NodeMap;
1.26 - template <typename T> friend class EdgeMap;
1.27 +// template <typename T> friend class NodeMap;
1.28 + // template <typename T> friend class EdgeMap;
1.29
1.30 - template <typename T>
1.31 - class NodeMap {
1.32 - const ListGraph& G;
1.33 - std::vector<T> container;
1.34 - public:
1.35 - typedef T ValueType;
1.36 - typedef Node KeyType;
1.37 - NodeMap(const ListGraph& _G) : G(_G), container(G.node_id) { }
1.38 - NodeMap(const ListGraph& _G, T a) :
1.39 - G(_G), container(G.node_id, a) { }
1.40 - void set(Node n, T a) { container[/*G.id(n)*/n.node->id]=a; }
1.41 - T get(Node n) const { return container[/*G.id(n)*/n.node->id]; }
1.42 - typename std::vector<T>::reference operator[](Node n) {
1.43 - return container[/*G.id(n)*/n.node->id]; }
1.44 - typename std::vector<T>::const_reference operator[](Node n) const {
1.45 - return container[/*G.id(n)*/n.node->id];
1.46 - }
1.47 - void update() { container.resize(G.node_id); }
1.48 - void update(T a) { container.resize(G.node_id, a); }
1.49 - };
1.50 + NodeMapRegistry<ListGraph, Node> node_maps;
1.51
1.52 template <typename T>
1.53 - class EdgeMap {
1.54 - const ListGraph& G;
1.55 - std::vector<T> container;
1.56 - public:
1.57 - typedef T ValueType;
1.58 - typedef Edge KeyType;
1.59 - EdgeMap(const ListGraph& _G) : G(_G), container(G.edge_id) { }
1.60 - EdgeMap(const ListGraph& _G, T a) :
1.61 - G(_G), container(G.edge_id, a) { }
1.62 - void set(Edge e, T a) { container[/*G.id(e)*/e.edge->id]=a; }
1.63 - T get(Edge e) const { return container[/*G.id(e)*/e.edge->id]; }
1.64 - typename std::vector<T>::reference operator[](Edge e) {
1.65 - return container[/*G.id(e)*/e.edge->id]; }
1.66 - typename std::vector<T>::const_reference operator[](Edge e) const {
1.67 - return container[/*G.id(e)*/e.edge->id];
1.68 - }
1.69 - void update() { container.resize(G.edge_id); }
1.70 - void update(T a) { container.resize(G.edge_id, a); }
1.71 - };
1.72 + class NodeMap : public VectorMap<ListGraph, Edge, T, EdgeMapBase> {};
1.73 +
1.74 + EdgeMapRegistry<ListGraph, Edge> edge_maps;
1.75 +
1.76 + template <typename T>
1.77 + class EdgeMap : public VectorMap<Graph, Node, T, NodeMapBase> {};
1.78 +
1.79
1.80 int node_id;
1.81 int edge_id;
1.82 @@ -323,18 +298,28 @@
1.83
1.84 /* adding nodes and edges */
1.85
1.86 - Node addNode() { return Node(_add_node()); }
1.87 + Node addNode() {
1.88 + Node n = _add_node();
1.89 + node_maps.add(n);
1.90 + return n;
1.91 + }
1.92 Edge addEdge(Node u, Node v) {
1.93 - return Edge(_add_edge(u.node, v.node));
1.94 + Edge e = _add_edge(u.node, v.node);
1.95 + edge_maps.add(e);
1.96 + return e;
1.97 }
1.98
1.99 void erase(Node i) {
1.100 + node_map.erase(i);
1.101 while (first<OutEdgeIt>(i).valid()) erase(first<OutEdgeIt>(i));
1.102 while (first<InEdgeIt>(i).valid()) erase(first<InEdgeIt>(i));
1.103 _delete_node(i.node);
1.104 }
1.105
1.106 - void erase(Edge e) { _delete_edge(e.edge); }
1.107 + void erase(Edge e) {
1.108 + edge_maps.erase(e);
1.109 + _delete_edge(e.edge);
1.110 + }
1.111
1.112 void clear() {
1.113 while (first<NodeIt>().valid()) erase(first<NodeIt>());