# HG changeset patch # User deba # Date 1080592464 0 # Node ID 796101caedb73f74a83563416e73c901d1609c0f # Parent fb27d1c7036e5e5aab116b027ca3a72cdd330d23 diff -r fb27d1c7036e -r 796101caedb7 src/work/deba/mapbase.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/work/deba/mapbase.h Mon Mar 29 20:34:24 2004 +0000 @@ -0,0 +1,31 @@ +#ifndef MAPBASE_H +#define MAPBASE_H + +template +class MapBase { +public: + typedef GB GraphBase; + typedef MappedGraph Graph; + + typedef K KeyType; + + + MapBase() : graph(0) {} + MapBase(Graph& g) : graph(&g) {graph.add(*this);} + + virtual ~MapBase() {graph.erase(*this);} + +protected: + + Graph* graph; + + int graph_index; + + + virtual void add(const KeyType&) = 0; + virtual void erase(const KeyType&) = 0; + + friend class Graph; +}; + +#endif diff -r fb27d1c7036e -r 796101caedb7 src/work/deba/mappedgraph.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/work/deba/mappedgraph.h Mon Mar 29 20:34:24 2004 +0000 @@ -0,0 +1,88 @@ +#ifndef MAPPEDGRAPH_H +#define MAPPEDGRAPH_H + +#include + +template +class MapBase; + +template +class MappedGraph : public GB { +public: + typedef GB GraphBase; + + typedef MapBase EdgeMapBase; + typedef MapBase NodeMapBase; + +protected: + typedef std::vector EdgeMaps; + typedef std::vector NodeMaps; + + EdgeMaps edge_maps; + NodeMaps node_maps; + + void add(EdgeMapBase& map_base) { + if (map_base.graph) { + map_base.graph->erase(map_base); + } + edge_maps.push_back(&map_base); + map_base.graph_index = map_base.size()-1; + } + + void erase(EdgeMapBase& map_base) { + if (map_base.graph != this) return; + edge_maps.back()->graph_index = map_base.graph_index; + edge_maps[map_base.graph_index] = edge_maps.back(); + edge_maps.pop_back(); + map_base.graph = 0; + } + + void addEdge(typename GB::Edge& edge) { + typename EdgeMaps::iterator it; + for (it = edge_maps.begin(); it != edge_maps.end(); ++it) { + (*it)->add(edge); + } + } + + void eraseEdge(typename GB::Edge& edge) { + typename EdgeMaps::iterator it; + for (it = edge_maps.begin(); it != edge_maps.end(); ++it) { + (*it)->erase(edge); + } + } + + void add(NodeMapBase& map_base) { + if (map_base.graph) { + map_base.graph->erase(map_base); + } + node_maps.push_back(&map_base); + map_base.graph_index = node_maps.size()-1; + } + + void erase(NodeMapBase& map_base) { + if (map_base.graph != this) return; + node_maps.back()->graph_index = map_base.graph_index; + node_maps[map_base.graph_index] = node_maps.back(); + node_maps.pop_back(); + map_base.graph = 0; + } + + void addNode(typename GB::Node& node) { + typename NodeMaps::iterator it; + for (it = node_maps.begin(); it != node_maps.end(); ++it) { + (*it)->add(node); + } + } + + void eraseNode(typename GB::Node& node) { + typename NodeMaps::iterator it; + for (it = node_maps.begin(); it != node_maps.end(); ++it) { + (*it)->erase(node); + } + } + + friend class EdgeMapBase; + friend class NodeMapBase; +}; + +#endif diff -r fb27d1c7036e -r 796101caedb7 src/work/deba/slowgraph.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/work/deba/slowgraph.h Mon Mar 29 20:34:24 2004 +0000 @@ -0,0 +1,17 @@ +#ifndef SLOWGRAPH_H +#define SLOWGRAPH_H + +class SlowGraphBase { +private: + typedef vector EdgeVector; + typedef vector NodeVector; + + NodeVector in_nodes, out_nodes; + +public: + typedef Edge +}; + +typedef MappedGraph SlowGraph; + +#endif \ No newline at end of file