src/work/deba/map_registry.h
author marci
Thu, 29 Apr 2004 15:58:34 +0000
changeset 472 052af4060f3e
child 571 9632ea8be6ca
permissions -rw-r--r--
preflow, maxflow
deba@378
     1
#ifndef MAP_REGISTRY_H
deba@378
     2
#define MAP_REGISTRY_H
deba@378
     3
deba@378
     4
#include <vector>
deba@378
     5
deba@378
     6
deba@378
     7
namespace hugo {
deba@378
     8
	template <typename G, typename K, typename KIt>
deba@378
     9
	class MapRegistry;
deba@378
    10
}
deba@378
    11
deba@378
    12
#include "map_base.h"
deba@378
    13
deba@378
    14
namespace hugo {
deba@378
    15
deba@378
    16
	template <typename G, typename K, typename KIt>
deba@378
    17
	class MapRegistry {
deba@378
    18
	public:
deba@378
    19
		typedef G Graph;
deba@378
    20
		typedef K Key;
deba@378
    21
		typedef KIt KeyIt;
deba@378
    22
	
deba@378
    23
		typedef MapBase<Graph, Key, KIt> Map;
deba@378
    24
		friend class Base;
deba@378
    25
	
deba@378
    26
	protected:
deba@378
    27
	
deba@378
    28
		typedef std::vector<Map*> Container; 
deba@378
    29
	  Container container;
deba@378
    30
deba@378
    31
		Graph* graph;		
deba@378
    32
		
deba@378
    33
		
deba@378
    34
	public:
deba@378
    35
	
deba@378
    36
		MapRegistry(Graph& g) : container(0), graph(&g) {}
deba@378
    37
				
deba@378
    38
		~MapRegistry() {
deba@378
    39
			typename Container::iterator it;
deba@378
    40
			for (it = container.begin(); it != container.end(); ++it) {
deba@378
    41
				(*it)->destroy(*graph);
deba@378
    42
				(*it)->registry = 0;
deba@378
    43
			}
deba@378
    44
		}
deba@378
    45
	
deba@378
    46
	private:
deba@378
    47
		MapRegistry(const MapRegistry& ) {}
deba@378
    48
		MapRegistry& operator=(const MapRegistry& ) {}
deba@378
    49
	
deba@378
    50
	public:
deba@378
    51
	
deba@378
    52
		void add(Map& map) {
deba@378
    53
			if (map.registry) {
deba@378
    54
				map.registry->erase(map);
deba@378
    55
			}
deba@378
    56
			container.push_back(&map);
deba@378
    57
			map.registry = this;
deba@378
    58
			map.registry_index = container.size()-1;
deba@378
    59
			map.init(*graph);
deba@378
    60
		} 
deba@378
    61
	
deba@378
    62
		void erase(Map& map_base) {
deba@378
    63
			map_base.destroy(*graph);
deba@378
    64
			container.back()->registry_index = map_base.registry_index; 
deba@378
    65
			container[map_base.registry_index] = container.back();
deba@378
    66
			container.pop_back();
deba@378
    67
			map_base.registry = 0;
deba@378
    68
		}
deba@378
    69
	
deba@378
    70
		
deba@378
    71
		void add(Key& key) {
deba@378
    72
			typename Container::iterator it;
deba@378
    73
			for (it = container.begin(); it != container.end(); ++it) {
deba@378
    74
				(*it)->add(key);
deba@378
    75
			}
deba@378
    76
		}	
deba@378
    77
		
deba@378
    78
		void erase(Key& key) {
deba@378
    79
			typename Container::iterator it;
deba@378
    80
			for (it = container.begin(); it != container.end(); ++it) {
deba@378
    81
				(*it)->erase(key);
deba@378
    82
			}
deba@378
    83
		}
deba@378
    84
deba@378
    85
		Graph& getGraph() {
deba@378
    86
			return *graph;
deba@378
    87
		}
deba@378
    88
deba@378
    89
deba@378
    90
	};
deba@378
    91
deba@378
    92
}
deba@378
    93
deba@378
    94
#endif