deba@261: #ifndef MAPPEDGRAPH_H
deba@261: #define MAPPEDGRAPH_H
deba@261: 
deba@261: #include <vector>
deba@261: 
deba@261: template <typename GB, typename K>
deba@261: class MapBase;
deba@261: 
deba@261: template <typename GB>
deba@261: class MappedGraph : public GB {
deba@261: public:
deba@261: 	typedef GB GraphBase;
deba@261: 	
deba@261: 	typedef MapBase<GB, typename GB::Edge> EdgeMapBase;
deba@261: 	typedef MapBase<GB, typename GB::Node> NodeMapBase;
deba@261: 
deba@261: protected:
deba@261: 	typedef std::vector<EdgeMapBase*> EdgeMaps; 
deba@261: 	typedef std::vector<NodeMapBase*> NodeMaps;
deba@261: 	
deba@261: 	EdgeMaps edge_maps;
deba@261: 	NodeMaps node_maps;
deba@261: 	
deba@261: 	void add(EdgeMapBase& map_base) {
deba@261: 		if (map_base.graph) {
deba@261: 			map_base.graph->erase(map_base);
deba@261: 		}
deba@261: 		edge_maps.push_back(&map_base);
deba@261: 		map_base.graph_index = map_base.size()-1;
deba@261: 	} 
deba@261: 	
deba@261: 	void erase(EdgeMapBase& map_base) {
deba@261: 		if (map_base.graph != this) return;
deba@261: 		edge_maps.back()->graph_index = map_base.graph_index; 
deba@261: 		edge_maps[map_base.graph_index] = edge_maps.back();
deba@261: 		edge_maps.pop_back();
deba@261: 		map_base.graph = 0;
deba@261: 	}
deba@261: 	
deba@261: 	void addEdge(typename GB::Edge& edge) {
deba@261: 		typename EdgeMaps::iterator it;
deba@261: 		for (it = edge_maps.begin(); it != edge_maps.end(); ++it) {
deba@261: 			(*it)->add(edge);
deba@261: 		}
deba@261: 	}
deba@261: 	
deba@261: 	void eraseEdge(typename GB::Edge& edge) {
deba@261: 		typename EdgeMaps::iterator it;
deba@261: 		for (it = edge_maps.begin(); it != edge_maps.end(); ++it) {
deba@261: 			(*it)->erase(edge);
deba@261: 		}
deba@261: 	}
deba@261: 
deba@261: 	void add(NodeMapBase& map_base) {
deba@261: 		if (map_base.graph) {
deba@261: 			map_base.graph->erase(map_base);
deba@261: 		}
deba@261: 		node_maps.push_back(&map_base);
deba@261: 		map_base.graph_index = node_maps.size()-1;
deba@261: 	} 
deba@261: 	
deba@261: 	void erase(NodeMapBase& map_base) {
deba@261: 		if (map_base.graph != this) return;
deba@261: 		node_maps.back()->graph_index = map_base.graph_index; 
deba@261: 		node_maps[map_base.graph_index] = node_maps.back();
deba@261: 		node_maps.pop_back();
deba@261: 		map_base.graph = 0;
deba@261: 	}
deba@261: 
deba@261: 	void addNode(typename GB::Node& node) {
deba@261: 		typename NodeMaps::iterator it;
deba@261: 		for (it = node_maps.begin(); it != node_maps.end(); ++it) {
deba@261: 			(*it)->add(node);
deba@261: 		}
deba@261: 	}
deba@261: 	
deba@261: 	void eraseNode(typename GB::Node& node) {
deba@261: 		typename NodeMaps::iterator it;
deba@261: 		for (it = node_maps.begin(); it != node_maps.end(); ++it) {
deba@261: 			(*it)->erase(node);
deba@261: 		}
deba@261: 	}
deba@261: 	
deba@261: 	friend class EdgeMapBase;
deba@261: 	friend class NodeMapBase;
deba@261: };
deba@261: 
deba@261: #endif