deba@782: // -*- c++ -*- deba@782: #ifndef MAP_DEFINES_H deba@782: #define MAP_DEFINES_H deba@782: deba@822: ///\ingroup graphmaps alpar@785: ///\file alpar@785: ///\brief Defines to help creating graph maps. alpar@785: alpar@785: /// \addtogroup graphmapfactory alpar@785: /// @{ alpar@785: deba@782: /** Creates the EdgeMapRegistry type an declare a mutable instance deba@782: * named edge_maps. deba@782: */ deba@782: #define CREATE_EDGE_MAP_REGISTRY \ deba@782: typedef MapRegistry EdgeMapRegistry; \ deba@782: mutable EdgeMapRegistry edge_maps; deba@782: deba@782: /** Creates the NodeMapRegistry type an declare a mutable instance deba@782: * named node_maps. deba@782: */ deba@782: #define CREATE_NODE_MAP_REGISTRY \ deba@782: typedef MapRegistry NodeMapRegistry; \ deba@782: mutable NodeMapRegistry node_maps; deba@782: deba@782: /** Creates both map registries. deba@782: */ deba@782: #define CREATE_MAP_REGISTRIES \ deba@782: CREATE_NODE_MAP_REGISTRY \ deba@782: CREATE_EDGE_MAP_REGISTRY deba@782: deba@822: /** Creates a map from a template map. The import method is deba@782: * an overloading of the map type. deba@782: * The reason to use these macro is that the c++ does not support deba@782: * the template typedefs. If a future release of the c++ deba@782: * supports this feature it should be fixed. deba@782: */ deba@822: #define CREATE_NODE_MAP(DynMap) \ deba@822: template \ deba@822: class NodeMap : public DynMap { \ deba@822: typedef DynMap MapImpl; \ deba@782: public: \ deba@782: NodeMap() {} \ deba@822: NodeMap(const typename MapImpl::Graph& g) \ deba@822: : MapImpl(g, g.node_maps) {} \ deba@822: NodeMap(const typename MapImpl::Graph& g, const Value& v) \ deba@822: : MapImpl(g, g.node_maps, v) {} \ deba@782: NodeMap(const NodeMap& copy) : MapImpl(static_cast(copy)) {} \ deba@782: template NodeMap(const CMap& copy) : MapImpl(copy) {} \ deba@782: NodeMap& operator=(const NodeMap& copy) { \ deba@782: MapImpl::operator=(static_cast(copy));\ deba@782: return *this; \ deba@782: } \ deba@782: template NodeMap& operator=(const CMap& copy) { \ deba@782: MapImpl::operator=(copy);\ deba@782: return *this; \ deba@782: } \ deba@782: }; deba@782: deba@822: /** Creates a map from a template map. The import method is deba@782: * an overloading of the map type. deba@782: * The reason to use these macro is that the c++ does not support deba@782: * the template typedefs. If a future release of the c++ deba@782: * supports this feature it should be fixed. deba@782: */ deba@822: #define CREATE_EDGE_MAP(DynMap) \ deba@822: template \ deba@822: class EdgeMap : public DynMap { \ deba@822: typedef DynMap MapImpl; \ deba@782: public: \ deba@782: EdgeMap() {} \ deba@822: EdgeMap(const typename MapImpl::Graph& g) \ deba@822: : MapImpl(g, g.edge_maps) {} \ deba@822: EdgeMap(const typename MapImpl::Graph& g, const Value& v) \ deba@822: : MapImpl(g, g.edge_maps, v) {} \ deba@782: EdgeMap(const EdgeMap& copy) : MapImpl(static_cast(copy)) {} \ deba@782: template EdgeMap(const CMap& copy) : MapImpl(copy) {} \ deba@782: EdgeMap& operator=(const EdgeMap& copy) { \ deba@782: MapImpl::operator=(static_cast(copy));\ deba@782: return *this; \ deba@782: } \ deba@782: template EdgeMap& operator=(const CMap& copy) { \ deba@782: MapImpl::operator=(copy);\ deba@782: return *this; \ deba@782: } \ deba@782: }; deba@782: deba@822: /** This macro creates both maps. deba@782: */ deba@822: #define CREATE_MAPS(DynMap) \ deba@822: CREATE_NODE_MAP(DynMap) \ deba@822: CREATE_EDGE_MAP(DynMap) deba@782: deba@782: /** This macro creates MapRegistry for Symmetric Edge Maps. deba@782: */ deba@782: #define CREATE_SYM_EDGE_MAP_REGISTRY \ deba@782: typedef SymEdgeIt SymEdgeIt; \ deba@782: typedef MapRegistry SymEdgeMapRegistry; \ deba@782: mutable EdgeMapRegistry sym_edge_maps; deba@782: deba@782: deba@822: /** Creates a map from a template map. The import method is deba@782: * an overloading of the map type. deba@782: * The reason to use these macro is that the c++ does not support deba@782: * the template typedefs. If a future release of the c++ deba@782: * supports this feature it should be fixed. deba@782: */ deba@822: #define CREATE_SYM_EDGE_MAP(DynMap) \ deba@822: template \ deba@822: class SymEdgeMap : public SymMap { \ deba@822: typedef SymMap MapImpl; \ deba@822: public: \ deba@822: \ deba@822: SymEdgeMap() {} \ deba@822: \ deba@822: SymEdgeMap(const typename MapImpl::Graph& g) \ deba@822: : MapImpl(g, g.sym_edge_maps) {} \ deba@822: \ deba@822: SymEdgeMap(const typename MapImpl::Graph& g, const Value& v) \ deba@822: : MapImpl(g, g.sym_edge_maps, v) {} \ deba@822: \ deba@822: SymEdgeMap(const SymEdgeMap& copy) \ deba@822: : MapImpl(static_cast(copy)) {} \ deba@822: \ deba@822: template SymEdgeMap(const CMap& copy) : MapImpl(copy) {} \ deba@822: SymEdgeMap& operator=(const SymEdgeMap& copy) { \ deba@822: MapImpl::operator=(static_cast(copy));\ deba@822: return *this; \ deba@822: } \ deba@822: \ deba@822: template SymEdgeMap& operator=(const CMap& copy) { \ deba@822: MapImpl::operator=(copy);\ deba@822: return *this; \ deba@822: } \ deba@782: }; deba@782: deba@782: deba@822: /** This is a macro to import an node map into a graph class. deba@822: */ deba@822: #define IMPORT_NODE_MAP(From, from, To, to) \ deba@822: template \ deba@822: class NodeMap \ deba@822: : public From::template NodeMap { \ deba@822: typedef typename From::template NodeMap MapImpl; \ deba@822: public: \ deba@822: NodeMap() : MapImpl() {} \ deba@782: \ deba@822: NodeMap(const To& to) \ deba@822: : MapImpl(static_cast(from)) { } \ deba@782: \ deba@822: NodeMap(const To& to, const Value& value) \ deba@822: : MapImpl(static_cast(from), value) { } \ deba@782: \ deba@822: NodeMap(const NodeMap& copy) \ deba@822: : MapImpl(static_cast(copy)) {} \ deba@782: \ deba@822: template \ deba@822: NodeMap(const CMap& copy) \ deba@822: : MapImpl(copy) {} \ deba@782: \ deba@822: NodeMap& operator=(const NodeMap& copy) { \ deba@822: MapImpl::operator=(static_cast(copy)); \ deba@822: return *this; \ deba@822: } \ deba@782: \ deba@822: template \ deba@822: NodeMap& operator=(const CMap& copy) { \ deba@822: MapImpl::operator=(copy); \ deba@822: return *this; \ deba@822: } \ deba@822: }; deba@782: deba@822: /** This is a macro to import an edge map into a graph class. deba@822: */ deba@822: #define IMPORT_EDGE_MAP(From, from, To, to) \ deba@822: template \ deba@822: class EdgeMap \ deba@822: : public From::template EdgeMap { \ deba@822: typedef typename From::template EdgeMap MapImpl; \ deba@822: public: \ deba@822: EdgeMap() : MapImpl() {} \ deba@782: \ deba@822: EdgeMap(const To& to) \ deba@822: : MapImpl(static_cast(from)) { } \ deba@782: \ deba@822: EdgeMap(const To& to, const Value& value) \ deba@822: : MapImpl(static_cast(from), value) { } \ deba@782: \ deba@822: EdgeMap(const EdgeMap& copy) \ deba@822: : MapImpl(static_cast(copy)) {} \ deba@782: \ deba@822: template \ deba@822: EdgeMap(const CMap& copy) \ deba@822: : MapImpl(copy) {} \ deba@782: \ deba@822: EdgeMap& operator=(const EdgeMap& copy) { \ deba@822: MapImpl::operator=(static_cast(copy)); \ deba@822: return *this; \ deba@822: } \ deba@782: \ deba@822: template \ deba@822: EdgeMap& operator=(const CMap& copy) { \ deba@822: MapImpl::operator=(copy); \ deba@822: return *this; \ deba@822: } \ deba@822: }; deba@782: deba@822: deba@822: /** This is a macro to keep the node and edge maps for a graph class. deba@822: */ deba@822: #define KEEP_MAPS(From, To) \ deba@822: IMPORT_EDGE_MAP(From, graph, To, graph) \ deba@822: IMPORT_NODE_MAP(From, graph, To, graph) alpar@785: alpar@785: /// @} alpar@785: deba@782: #endif