deba@378: #ifndef MAP_REGISTRY_H
deba@378: #define MAP_REGISTRY_H
deba@378: 
deba@378: #include <vector>
deba@378: 
deba@378: 
deba@378: namespace hugo {
deba@378: 	template <typename G, typename K, typename KIt>
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 <typename G, typename K, typename KIt>
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<Graph, Key, KIt> Map;
deba@378: 		friend class Base;
deba@378: 	
deba@378: 	protected:
deba@378: 	
deba@378: 		typedef std::vector<Map*> 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