Changeset 822:88226d9fe821 in lemon-0.x for src/hugo
- Timestamp:
- 09/08/04 14:06:45 (20 years ago)
- Branch:
- default
- Phase:
- public
- Convert:
- svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@1118
- Location:
- src/hugo
- Files:
-
- 5 added
- 3 deleted
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
src/hugo/full_graph.h
r813 r822 14 14 15 15 #include <hugo/map_registry.h> 16 #include <hugo/default_map_factory.h> 16 #include <hugo/default_map.h> 17 18 #include <hugo/map_defines.h> 17 19 18 20 namespace hugo { … … 48 50 class InEdgeIt; 49 51 52 53 /// Creating map registries. 50 54 CREATE_MAP_REGISTRIES; 51 CREATE_MAPS(DefaultMapFactory); 55 /// Creating node and edge maps. 56 CREATE_MAPS(DefaultMap); 52 57 53 58 public: -
src/hugo/list_graph.h
r813 r822 14 14 15 15 #include <hugo/map_registry.h> 16 #include <hugo/default_map _factory.h>17 18 #include <hugo/sym_map _factory.h>16 #include <hugo/default_map.h> 17 18 #include <hugo/sym_map.h> 19 19 20 20 #include <hugo/map_defines.h> … … 80 80 class InEdgeIt; 81 81 82 /// Creating map registries. 82 83 CREATE_MAP_REGISTRIES; 83 CREATE_MAPS(DefaultMapFactory); 84 /// Creating node and edge maps. 85 CREATE_MAPS(DefaultMap); 84 86 85 87 public: … … 444 446 typedef SymListGraph Graph; 445 447 446 KEEP_NODE_MAP(ListGraph); 447 KEEP_EDGE_MAP(ListGraph); 448 448 /// Importing maps from the base class ListGraph. 449 KEEP_MAPS(ListGraph, SymListGraph); 450 451 /// Creating symmetric map registry. 449 452 CREATE_SYM_EDGE_MAP_REGISTRY; 450 CREATE_SYM_EDGE_MAP_FACTORY(DefaultMapFactory);451 IMPORT_SYM_EDGE_MAP(SymEdgeMapFactory);453 /// Creating symmetric edge map. 454 CREATE_SYM_EDGE_MAP(DefaultMap); 452 455 453 456 SymListGraph() : ListGraph() { } … … 530 533 class InEdgeIt; 531 534 532 CREATE_MAP_REGISTRIES; 533 CREATE_MAPS(DefaultMapFactory); 535 /// Creating node map registry. 536 CREATE_NODE_MAP_REGISTRY; 537 /// Creating node maps. 538 CREATE_NODE_MAP(DefaultMap); 539 540 /// Creating empty map structure for edges. 541 template <typename Value> 542 class EdgeMap { 543 public: 544 EdgeMap() {} 545 EdgeMap(const Graph&) {} 546 EdgeMap(const Graph&, const Value&) {} 547 548 EdgeMap(const EdgeMap&) {} 549 template <typename CMap> EdgeMap(const CMap&) {} 550 551 EdgeMap& operator=(const EdgeMap&) {} 552 template <typename CMap> EdgeMap& operator=(const CMap&) {} 553 554 class ConstIterator { 555 public: 556 bool operator==(const ConstIterator&) {return true;} 557 bool operator!=(const ConstIterator&) {return false;} 558 }; 559 560 typedef ConstIterator Iterator; 561 562 Iterator begin() { return Iterator();} 563 Iterator end() { return Iterator();} 564 565 ConstIterator begin() const { return ConstIterator();} 566 ConstIterator end() const { return ConstIterator();} 567 568 }; 534 569 535 570 public: … … 849 884 850 885 886 /// Creating edge map registry. 851 887 CREATE_EDGE_MAP_REGISTRY; 852 CREATE_EDGE_MAP_FACTORY(DefaultMapFactory); 853 IMPORT_EDGE_MAP(EdgeMapFactory); 888 /// Creating edge maps. 889 CREATE_EDGE_MAP(DefaultMap); 890 891 /// Importing node maps from the NodeGraphType. 892 IMPORT_NODE_MAP(NodeGraphType, graph.G, EdgeSet, graph); 854 893 855 894 … … 1091 1130 InEdgeIt &operator++() { n=G->edges[n].next_in; return *this; } 1092 1131 }; 1093 1094 1095 template <typename V> class NodeMap 1096 : public NodeGraphType::template NodeMap<V> 1097 { 1098 //This is a must, the constructors need it. 1099 typedef typename NodeGraphType::template NodeMap<V> MapImpl; 1100 typedef V Value; 1101 public: 1102 NodeMap() : MapImpl() {} 1103 1104 NodeMap(const EdgeSet& graph) 1105 : MapImpl(graph.G) { } 1106 1107 NodeMap(const EdgeSet& graph, const Value& value) 1108 : MapImpl(graph.G, value) { } 1109 1110 NodeMap(const NodeMap& copy) 1111 : MapImpl(static_cast<const MapImpl&>(copy)) {} 1112 1113 template<typename CMap> 1114 NodeMap(const CMap& copy) 1115 : MapImpl(copy) { } 1116 1117 NodeMap& operator=(const NodeMap& copy) { 1118 MapImpl::operator=(static_cast<const MapImpl&>(copy)); 1119 return *this; 1120 } 1121 1122 template <typename CMap> 1123 NodeMap& operator=(const CMap& copy) { 1124 MapImpl::operator=(copy); 1125 return *this; 1126 } 1127 1128 }; 1132 1129 1133 }; 1130 1134 -
src/hugo/map_defines.h
r785 r822 3 3 #define MAP_DEFINES_H 4 4 5 ///\ingroup graphmap factory5 ///\ingroup graphmaps 6 6 ///\file 7 7 ///\brief Defines to help creating graph maps. … … 30 30 CREATE_EDGE_MAP_REGISTRY 31 31 32 /** Creates a concrete factory type from a template map 33 * factory to use as node map factory. 34 */ 35 #define CREATE_NODE_MAP_FACTORY(TemplateFactory) \ 36 typedef TemplateFactory<NodeMapRegistry> NodeMapFactory; 37 38 /** Creates a concrete factory type from a template map 39 * factory to use as edge map factory. 40 */ 41 #define CREATE_EDGE_MAP_FACTORY(TemplateFactory) \ 42 typedef TemplateFactory<EdgeMapRegistry> EdgeMapFactory; 43 44 /** Creates both map factories. 45 */ 46 #define CREATE_MAP_FACTORIES(TemplateFactory) \ 47 CREATE_NODE_MAP_FACTORY(TemplateFactory) \ 48 CREATE_EDGE_MAP_FACTORY(TemplateFactory) 49 50 /** Import a map from a concrete map factory. The import method is 32 /** Creates a map from a template map. The import method is 51 33 * an overloading of the map type. 52 34 * The reason to use these macro is that the c++ does not support … … 54 36 * supports this feature it should be fixed. 55 37 */ 56 #define IMPORT_NODE_MAP(Factory) \57 template <typename V > \58 class NodeMap : public Factory::template Map<V> { \59 typedef typename Factory::template Map<V> MapImpl; \38 #define CREATE_NODE_MAP(DynMap) \ 39 template <typename Value> \ 40 class NodeMap : public DynMap<NodeMapRegistry, Value> { \ 41 typedef DynMap<NodeMapRegistry, Value> MapImpl; \ 60 42 public: \ 61 43 NodeMap() {} \ 62 NodeMap(const Graph& g) : MapImpl(g, g.node_maps) {} \ 63 NodeMap(const Graph& g, const V& v) : MapImpl(g, g.node_maps, v) {} \ 44 NodeMap(const typename MapImpl::Graph& g) \ 45 : MapImpl(g, g.node_maps) {} \ 46 NodeMap(const typename MapImpl::Graph& g, const Value& v) \ 47 : MapImpl(g, g.node_maps, v) {} \ 64 48 NodeMap(const NodeMap& copy) : MapImpl(static_cast<const MapImpl&>(copy)) {} \ 65 49 template <typename CMap> NodeMap(const CMap& copy) : MapImpl(copy) {} \ … … 74 58 }; 75 59 76 /** Import a map from a concrete map factory. The import method is60 /** Creates a map from a template map. The import method is 77 61 * an overloading of the map type. 78 62 * The reason to use these macro is that the c++ does not support … … 80 64 * supports this feature it should be fixed. 81 65 */ 82 #define IMPORT_EDGE_MAP(Factory) \83 template <typename V > \84 class EdgeMap : public Factory::template Map<V> { \85 typedef typename Factory::template Map<V> MapImpl; \66 #define CREATE_EDGE_MAP(DynMap) \ 67 template <typename Value> \ 68 class EdgeMap : public DynMap<EdgeMapRegistry, Value> { \ 69 typedef DynMap<EdgeMapRegistry, Value> MapImpl; \ 86 70 public: \ 87 71 EdgeMap() {} \ 88 EdgeMap(const Graph& g) : MapImpl(g, g.edge_maps) {} \ 89 EdgeMap(const Graph& g, const V& v) : MapImpl(g, g.edge_maps, v) {} \ 72 EdgeMap(const typename MapImpl::Graph& g) \ 73 : MapImpl(g, g.edge_maps) {} \ 74 EdgeMap(const typename MapImpl::Graph& g, const Value& v) \ 75 : MapImpl(g, g.edge_maps, v) {} \ 90 76 EdgeMap(const EdgeMap& copy) : MapImpl(static_cast<const MapImpl&>(copy)) {} \ 91 77 template <typename CMap> EdgeMap(const CMap& copy) : MapImpl(copy) {} \ … … 100 86 }; 101 87 102 /** This macro creates both map factories and imports both maps. 103 */ 104 #define CREATE_MAPS(TemplateFactory) \ 105 CREATE_MAP_FACTORIES(TemplateFactory) \ 106 IMPORT_NODE_MAP(NodeMapFactory) \ 107 IMPORT_EDGE_MAP(EdgeMapFactory) 88 /** This macro creates both maps. 89 */ 90 #define CREATE_MAPS(DynMap) \ 91 CREATE_NODE_MAP(DynMap) \ 92 CREATE_EDGE_MAP(DynMap) 108 93 109 94 /** This macro creates MapRegistry for Symmetric Edge Maps. … … 114 99 mutable EdgeMapRegistry sym_edge_maps; 115 100 116 /** Creates a concrete factory type from a template map 117 * factory to use as edge map factory. 118 */ 119 #define CREATE_SYM_EDGE_MAP_FACTORY(TemplateFactory) \ 120 typedef SymMapFactory<SymEdgeMapRegistry, TemplateFactory > \ 121 SymEdgeMapFactory; 122 123 /** Import a map from a concrete map factory. The import method is 101 102 /** Creates a map from a template map. The import method is 124 103 * an overloading of the map type. 125 104 * The reason to use these macro is that the c++ does not support … … 127 106 * supports this feature it should be fixed. 128 107 */ 129 #define IMPORT_SYM_EDGE_MAP(Factory) \ 130 template <typename V> \ 131 class SymEdgeMap : public Factory::template Map<V> { \ 132 typedef typename Factory::template Map<V> MapImpl; \ 133 public: \ 134 SymEdgeMap() {} \ 135 SymEdgeMap(const Graph& g) : MapImpl(g, g.sym_edge_maps) {} \ 136 SymEdgeMap(const Graph& g, const V& v) : MapImpl(g, g.sym_edge_maps, v) {} \ 137 SymEdgeMap(const SymEdgeMap& copy) \ 138 : MapImpl(static_cast<const MapImpl&>(copy)) {} \ 139 template <typename CMap> SymEdgeMap(const CMap& copy) : MapImpl(copy) {} \ 140 SymEdgeMap& operator=(const SymEdgeMap& copy) { \ 141 MapImpl::operator=(static_cast<const MapImpl&>(copy));\ 142 return *this; \ 143 } \ 144 template <typename CMap> SymEdgeMap& operator=(const CMap& copy) { \ 145 MapImpl::operator=(copy);\ 146 return *this; \ 147 } \ 148 }; 149 150 151 #define KEEP_NODE_MAP(GraphBase) \ 152 template <typename V> class NodeMap \ 153 : public GraphBase::template NodeMap<V> \ 154 { \ 155 typedef typename GraphBase::template NodeMap<V> MapImpl; \ 156 typedef V Value; \ 157 public: \ 158 NodeMap() : MapImpl() {} \ 159 \ 160 NodeMap(const Graph& graph) \ 161 : MapImpl(static_cast<const GraphBase&>(graph)) { } \ 162 \ 163 NodeMap(const Graph& graph, const Value& value) \ 164 : MapImpl(static_cast<const GraphBase&>(graph), value) { } \ 165 \ 166 NodeMap(const NodeMap& copy) \ 167 : MapImpl(static_cast<const MapImpl&>(copy)) {} \ 168 \ 169 template<typename CMap> \ 170 NodeMap(const CMap& copy) \ 171 : MapImpl(copy) {} \ 172 \ 173 NodeMap& operator=(const NodeMap& copy) { \ 174 MapImpl::operator=(static_cast<const MapImpl&>(copy)); \ 175 return *this; \ 176 } \ 177 \ 178 template <typename CMap> \ 179 NodeMap& operator=(const CMap& copy) { \ 180 MapImpl::operator=(copy); \ 181 return *this; \ 182 } \ 183 }; 184 185 #define KEEP_EDGE_MAP(GraphBase) \ 186 template <typename V> class EdgeMap \ 187 : public GraphBase::template EdgeMap<V> \ 188 { \ 189 typedef typename GraphBase::template EdgeMap<V> MapImpl; \ 190 typedef V Value; \ 191 public: \ 192 EdgeMap() : MapImpl() {} \ 193 \ 194 EdgeMap(const Graph& graph) \ 195 : MapImpl(static_cast<const GraphBase&>(graph)) { } \ 196 \ 197 EdgeMap(const Graph& graph, const Value& value) \ 198 : MapImpl(static_cast<const GraphBase&>(graph), value) { } \ 199 \ 200 EdgeMap(const EdgeMap& copy) \ 201 : MapImpl(static_cast<const MapImpl&>(copy)) {} \ 202 \ 203 template<typename CMap> \ 204 EdgeMap(const CMap& copy) \ 205 : MapImpl(copy) {} \ 206 \ 207 EdgeMap& operator=(const EdgeMap& copy) { \ 208 MapImpl::operator=(static_cast<const MapImpl&>(copy)); \ 209 return *this; \ 210 } \ 211 \ 212 template <typename CMap> \ 213 EdgeMap& operator=(const CMap& copy) { \ 214 MapImpl::operator=(copy); \ 215 return *this; \ 216 } \ 217 }; 218 108 #define CREATE_SYM_EDGE_MAP(DynMap) \ 109 template <typename Value> \ 110 class SymEdgeMap : public SymMap<DynMap, SymEdgeMapRegistry, Value> { \ 111 typedef SymMap<DynMap, SymEdgeMapRegistry, Value> MapImpl; \ 112 public: \ 113 \ 114 SymEdgeMap() {} \ 115 \ 116 SymEdgeMap(const typename MapImpl::Graph& g) \ 117 : MapImpl(g, g.sym_edge_maps) {} \ 118 \ 119 SymEdgeMap(const typename MapImpl::Graph& g, const Value& v) \ 120 : MapImpl(g, g.sym_edge_maps, v) {} \ 121 \ 122 SymEdgeMap(const SymEdgeMap& copy) \ 123 : MapImpl(static_cast<const MapImpl&>(copy)) {} \ 124 \ 125 template <typename CMap> SymEdgeMap(const CMap& copy) : MapImpl(copy) {} \ 126 SymEdgeMap& operator=(const SymEdgeMap& copy) { \ 127 MapImpl::operator=(static_cast<const MapImpl&>(copy));\ 128 return *this; \ 129 } \ 130 \ 131 template <typename CMap> SymEdgeMap& operator=(const CMap& copy) { \ 132 MapImpl::operator=(copy);\ 133 return *this; \ 134 } \ 135 }; 136 137 138 /** This is a macro to import an node map into a graph class. 139 */ 140 #define IMPORT_NODE_MAP(From, from, To, to) \ 141 template <typename Value> \ 142 class NodeMap \ 143 : public From::template NodeMap<Value> { \ 144 typedef typename From::template NodeMap<Value> MapImpl; \ 145 public: \ 146 NodeMap() : MapImpl() {} \ 147 \ 148 NodeMap(const To& to) \ 149 : MapImpl(static_cast<const From&>(from)) { } \ 150 \ 151 NodeMap(const To& to, const Value& value) \ 152 : MapImpl(static_cast<const From&>(from), value) { } \ 153 \ 154 NodeMap(const NodeMap& copy) \ 155 : MapImpl(static_cast<const MapImpl&>(copy)) {} \ 156 \ 157 template<typename CMap> \ 158 NodeMap(const CMap& copy) \ 159 : MapImpl(copy) {} \ 160 \ 161 NodeMap& operator=(const NodeMap& copy) { \ 162 MapImpl::operator=(static_cast<const MapImpl&>(copy)); \ 163 return *this; \ 164 } \ 165 \ 166 template <typename CMap> \ 167 NodeMap& operator=(const CMap& copy) { \ 168 MapImpl::operator=(copy); \ 169 return *this; \ 170 } \ 171 }; 172 173 /** This is a macro to import an edge map into a graph class. 174 */ 175 #define IMPORT_EDGE_MAP(From, from, To, to) \ 176 template <typename Value> \ 177 class EdgeMap \ 178 : public From::template EdgeMap<Value> { \ 179 typedef typename From::template EdgeMap<Value> MapImpl; \ 180 public: \ 181 EdgeMap() : MapImpl() {} \ 182 \ 183 EdgeMap(const To& to) \ 184 : MapImpl(static_cast<const From&>(from)) { } \ 185 \ 186 EdgeMap(const To& to, const Value& value) \ 187 : MapImpl(static_cast<const From&>(from), value) { } \ 188 \ 189 EdgeMap(const EdgeMap& copy) \ 190 : MapImpl(static_cast<const MapImpl&>(copy)) {} \ 191 \ 192 template<typename CMap> \ 193 EdgeMap(const CMap& copy) \ 194 : MapImpl(copy) {} \ 195 \ 196 EdgeMap& operator=(const EdgeMap& copy) { \ 197 MapImpl::operator=(static_cast<const MapImpl&>(copy)); \ 198 return *this; \ 199 } \ 200 \ 201 template <typename CMap> \ 202 EdgeMap& operator=(const CMap& copy) { \ 203 MapImpl::operator=(copy); \ 204 return *this; \ 205 } \ 206 }; 207 208 209 /** This is a macro to keep the node and edge maps for a graph class. 210 */ 211 #define KEEP_MAPS(From, To) \ 212 IMPORT_EDGE_MAP(From, graph, To, graph) \ 213 IMPORT_NODE_MAP(From, graph, To, graph) 219 214 220 215 /// @} -
src/hugo/map_registry.h
r786 r822 29 29 typedef KIt KeyIt; 30 30 31 32 33 31 /** 34 32 * MapBase is the base class of the registered maps. -
src/hugo/smart_graph.h
r813 r822 13 13 #include <hugo/invalid.h> 14 14 15 #include <hugo/default_map_factory.h> 16 #include <hugo/sym_map_factory.h> 15 #include <hugo/default_map.h> 16 #include <hugo/sym_map.h> 17 17 18 #include <hugo/map_registry.h> 18 19 … … 73 74 class InEdgeIt; 74 75 76 /// Creating map registries. 75 77 CREATE_MAP_REGISTRIES; 76 CREATE_MAPS(DefaultMapFactory); 78 /// Creating node and edge maps. 79 CREATE_MAPS(DefaultMap); 77 80 78 81 public: … … 315 318 typedef SymSmartGraph Graph; 316 319 317 KEEP_NODE_MAP(SmartGraph); 318 KEEP_EDGE_MAP(SmartGraph); 319 320 /// Importing maps from the base class ListGraph. 321 KEEP_MAPS(SmartGraph, SymSmartGraph); 322 323 /// Creating symmetric map registry. 320 324 CREATE_SYM_EDGE_MAP_REGISTRY; 321 CREATE_SYM_EDGE_MAP_FACTORY(DefaultMapFactory); 322 IMPORT_SYM_EDGE_MAP(SymEdgeMapFactory); 325 /// Creating symmetric edge map. 326 CREATE_SYM_EDGE_MAP(DefaultMap); 327 323 328 324 329 SymSmartGraph() : SmartGraph() { }
Note: See TracChangeset
for help on using the changeset viewer.