deba@337: #ifndef NODE_MAP_REGISTRY_H deba@337: #define NODE_MAP_REGISTRY_H deba@337: deba@337: #include deba@337: deba@340: #include "node_map_base.h" deba@340: deba@337: template deba@337: class NodeMapRegistry { deba@337: public: deba@337: typedef G Graph; deba@337: typedef E Node deba@337: deba@337: typedef NodeMapBase NodeMapBase; deba@337: deba@337: protected: deba@337: typedef std::vector Container; deba@337: deba@337: Container container; deba@337: deba@337: void add(NodeMapBase& map_base) { deba@337: if (map_base.graph) { deba@337: map_base.graph->node_maps.erase(map_base); deba@337: } deba@337: container.push_back(&map_base); deba@337: map_base.graph = this; deba@337: map_base.graph_index = container.size()-1; deba@337: } deba@337: deba@337: void erase(NodeMapBase& map_base) { deba@337: if (map_base.graph != this) return; deba@337: container.back()->graph_index = map_base.graph_index; deba@337: container[map_base.graph_index] = container.back(); deba@337: container.pop_back(); deba@337: map_base.graph = 0; deba@337: } deba@337: deba@340: void add(Node& node) { deba@337: typename Container::iterator it; deba@337: for (it = container.begin(); it != container.end(); ++it) { deba@337: (*it)->add(node); deba@337: } deba@337: } deba@337: deba@340: void erase(Node& node) { deba@337: typename Container::iterator it; deba@337: for (it = container.begin(); it != container.end(); ++it) { deba@337: (*it)->erase(node); deba@337: } deba@337: } deba@337: deba@337: friend class NodeMapBase; deba@337: }; deba@337: deba@337: #endif