deba@595: #ifndef PAC_MAP_FACTORY_H
deba@595: #define PAC_MAP_FACTORY_H
deba@595: 
deba@595: #include "map_base.h"
deba@595: 
deba@595: /**
deba@595: 	Converter class to use the standard template
deba@595: 	libary's pair associative containers as a graph map.
deba@595: */
deba@595: 
alpar@921: namespace lemon {
deba@595: 	
deba@595: 	template <typename G, typename K, typename KIt, template <typename, typename> class PAC>
deba@595: 	class PacMapFactory {
deba@595: 	
deba@595: 	
deba@595: 	public:
deba@595: 		
deba@595: 		typedef G Graph;
deba@595: 		typedef K Key;
deba@595: 		typedef KIt KeyIt;
deba@595: 		
deba@595: 		template <typename V> 
deba@595: 		class Map : public MapBase<G, K, KIt> {
deba@595: 		public:
deba@595: 			typedef V Value;
deba@595: 	
deba@595: 			Map() {}
deba@595: 			
deba@595: 			Map(Graph& g, MapRegistry<G, K, KIt>& r) 
deba@595: 				: MapBase<G, K, KIt>(g, r) {
deba@595: 				init();
deba@595: 			}
deba@595: 				
deba@595: 			virtual ~Map() {
deba@595: 				destroy();
deba@595: 			}
deba@595: 	
deba@595: 	
deba@595: 			V& operator[](const K& key) {
deba@595: 				return container.find(key)->second;
deba@595: 			} 
deba@595: 		
deba@595: 			const V& operator[](const K& key) const {
deba@595: 				return container.find(key)->second;
deba@595: 			}
deba@595: 	
deba@595: 			const V& get(const K& key) const {
deba@595: 				return container.find(key)->second;
deba@595: 			} 
deba@595: 		
deba@595: 			void set(const K& key, const V& value) {
deba@595: 				container.find(key)->second = value;
deba@595: 			}
deba@595: 		
deba@595: 			void add(const K& key) {
deba@595: 				container.insert(key);
deba@595: 			}
deba@595: 		
deba@595: 			void erase(const K& key) {
deba@595: 				container.erase(key);
deba@595: 			}
deba@595: 	
deba@595: 		private:
deba@595: 			typedef PAC<K, V> Container;
deba@595: 		
deba@595: 			Container container;
deba@595: 		};
deba@595: 		
deba@595: 	};
deba@595: }
deba@595: 
deba@595: #endif