src/work/deba/node_map_registry.h
changeset 378 c3f93631cd24
parent 340 a2ce3c4780b7
equal deleted inserted replaced
2:4fcb286aff83 -1:000000000000
     1 #ifndef NODE_MAP_REGISTRY_H
       
     2 #define NODE_MAP_REGISTRY_H
       
     3 
       
     4 #include <vector>
       
     5 
       
     6 template <typename G, typename K>
       
     7 class NodeMapRegistry;
       
     8 
       
     9 #include "node_map_base.h"
       
    10 
       
    11 template <typename G, typename K>
       
    12 class NodeMapRegistry {
       
    13 public:
       
    14 	typedef G Graph;
       
    15 	typedef K Node;
       
    16 	
       
    17 	typedef NodeMapBase<Graph, Node> MapBase;
       
    18 	friend class MapBase;
       
    19 
       
    20 protected:
       
    21 	
       
    22 	Graph* graph;
       
    23 
       
    24 	typedef std::vector<MapBase*> Container; 
       
    25 	
       
    26 	Container container;
       
    27 
       
    28 public:
       
    29 
       
    30 	NodeMapRegistry(Graph g) : graph(&g) {}
       
    31 
       
    32 	void add(MapBase& map_base) {
       
    33 		if (map_base.graph) {
       
    34 			map_base.graph->node_maps.erase(map_base);
       
    35 		}
       
    36 		container.push_back(&map_base);
       
    37 		map_base.graph = graph;
       
    38 		map_base.graph_index = container.size()-1;
       
    39 	} 
       
    40 	
       
    41 	void erase(MapBase& map_base) {
       
    42 		container.back()->graph_index = map_base.graph_index; 
       
    43 		container[map_base.graph_index] = container.back();
       
    44 		container.pop_back();
       
    45 		map_base.graph = 0;
       
    46 	}
       
    47 
       
    48 	
       
    49 	void add(Node& node) {
       
    50 		typename Container::iterator it;
       
    51 		for (it = container.begin(); it != container.end(); ++it) {
       
    52 			(*it)->add(node);
       
    53 		}
       
    54 	}
       
    55 	
       
    56 	void erase(Node& node) {
       
    57 		typename Container::iterator it;
       
    58 		for (it = container.begin(); it != container.end(); ++it) {
       
    59 			(*it)->erase(node);
       
    60 		}
       
    61 	}
       
    62 
       
    63 };
       
    64 
       
    65 #endif