deba@378: #ifndef MAP_REGISTRY_H deba@378: #define MAP_REGISTRY_H deba@378: deba@378: #include deba@378: deba@378: deba@378: namespace hugo { deba@378: template deba@378: class MapRegistry; deba@378: } deba@378: deba@378: #include "map_base.h" deba@378: deba@378: namespace hugo { deba@378: deba@378: template deba@378: class MapRegistry { deba@378: public: deba@378: typedef G Graph; deba@378: typedef K Key; deba@378: typedef KIt KeyIt; deba@378: deba@378: typedef MapBase Map; deba@378: friend class Base; deba@378: deba@378: protected: deba@378: deba@378: typedef std::vector Container; deba@378: Container container; deba@378: deba@378: Graph* graph; deba@378: deba@378: deba@378: public: deba@378: deba@378: MapRegistry(Graph& g) : container(0), graph(&g) {} deba@378: deba@378: ~MapRegistry() { deba@378: typename Container::iterator it; deba@378: for (it = container.begin(); it != container.end(); ++it) { deba@378: (*it)->destroy(*graph); deba@378: (*it)->registry = 0; deba@378: } deba@378: } deba@378: deba@378: private: deba@378: MapRegistry(const MapRegistry& ) {} deba@378: MapRegistry& operator=(const MapRegistry& ) {} deba@378: deba@378: public: deba@378: deba@378: void add(Map& map) { deba@378: if (map.registry) { deba@378: map.registry->erase(map); deba@378: } deba@378: container.push_back(&map); deba@378: map.registry = this; deba@378: map.registry_index = container.size()-1; deba@378: map.init(*graph); deba@378: } deba@378: deba@378: void erase(Map& map_base) { deba@378: map_base.destroy(*graph); deba@378: container.back()->registry_index = map_base.registry_index; deba@378: container[map_base.registry_index] = container.back(); deba@378: container.pop_back(); deba@378: map_base.registry = 0; deba@378: } deba@378: deba@378: deba@378: void add(Key& key) { deba@378: typename Container::iterator it; deba@378: for (it = container.begin(); it != container.end(); ++it) { deba@378: (*it)->add(key); deba@378: } deba@378: } deba@378: deba@378: void erase(Key& key) { deba@378: typename Container::iterator it; deba@378: for (it = container.begin(); it != container.end(); ++it) { deba@378: (*it)->erase(key); deba@378: } deba@378: } deba@378: deba@378: Graph& getGraph() { deba@378: return *graph; deba@378: } deba@378: deba@378: deba@378: }; deba@378: deba@378: } deba@378: deba@378: #endif