deba@261: #ifndef MAPPEDGRAPH_H deba@261: #define MAPPEDGRAPH_H deba@261: deba@261: #include deba@261: deba@261: template deba@261: class MapBase; deba@261: deba@261: template deba@261: class MappedGraph : public GB { deba@261: public: deba@261: typedef GB GraphBase; deba@261: deba@261: typedef MapBase EdgeMapBase; deba@261: typedef MapBase NodeMapBase; deba@261: deba@261: protected: deba@261: typedef std::vector EdgeMaps; deba@261: typedef std::vector 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