COIN-OR::LEMON - Graph Library

source: lemon-0.x/src/work/deba/map_defines.h @ 703:32f280a5ed7d

Last change on this file since 703:32f280a5ed7d was 703:32f280a5ed7d, checked in by Balazs Dezso, 20 years ago
File size: 3.4 KB
RevLine 
[676]1// -*- c++ -*-
[674]2#ifndef MAP_DEFINES_H
3#define MAP_DEFINES_H
4
[701]5/** Creates the EdgeMapRegistry type an declare a mutable instance
6 *  named edge_maps.
7 */
[674]8#define CREATE_EDGE_MAP_REGISTRY \
9typedef MapRegistry<Graph, Edge, EdgeIt> EdgeMapRegistry; \
[701]10mutable EdgeMapRegistry edge_maps;
[674]11
[701]12/** Creates the NodeMapRegistry type an declare a mutable instance
13 *  named node_maps.
14 */
[674]15#define CREATE_NODE_MAP_REGISTRY \
16typedef MapRegistry<Graph, Node, NodeIt> NodeMapRegistry; \
[701]17mutable NodeMapRegistry node_maps;
[674]18
[701]19/** Creates both map registries.
20 */
[674]21#define CREATE_MAP_REGISTRIES \
22CREATE_NODE_MAP_REGISTRY \
23CREATE_EDGE_MAP_REGISTRY
24
[701]25/** Creates a map a concrete factory type from a template map
26 *  factory to use as node map factory.
27 */
[674]28#define CREATE_NODE_MAP_FACTORY(TemplateFactory) \
29typedef TemplateFactory<NodeMapRegistry> NodeMapFactory;
30
[701]31/** Creates a map a concrete factory type from a template map
32 *  factory to use as edge map factory.
33 */
[674]34#define CREATE_EDGE_MAP_FACTORY(TemplateFactory) \
35typedef TemplateFactory<EdgeMapRegistry> EdgeMapFactory;
36
[701]37/** Creates both map factories.
38 */
[674]39#define CREATE_MAP_FACTORIES(TemplateFactory) \
40CREATE_NODE_MAP_FACTORY(TemplateFactory) \
41CREATE_EDGE_MAP_FACTORY(TemplateFactory)
42
[701]43/** Import a map from a concrete map factory. The import method is
44 *  an overloading of the map type.
45 *  The reason to use these macro is that the c++ does not support
46 *  the template typedefs. If a future release of the c++
47 *  supports this feature it should be fixed.
48 */
[674]49#define IMPORT_NODE_MAP(Factory) \
50template <typename V> \
51class NodeMap : public Factory::Map<V> { \
52public: \
53NodeMap() {} \
[701]54NodeMap(const Graph& g) : Factory::Map<V>(&g, &(g.node_maps)) {} \
55NodeMap(const Graph& g, const V& v) : Factory::Map<V>(g, g.node_maps, v) {} \
[703]56NodeMap(const NodeMap& copy) \
57  : Factory::Map<V>(static_cast<const Factory::Map<V>&>(copy)) {} \
[701]58template <typename CMap> NodeMap(const CMap& copy) : Factory::Map<V>(copy) {} \
59NodeMap& operator=(const NodeMap& copy) { \
[703]60  this->Factory::Map<V>::operator=(static_cast<Factory::Map<V>&>(copy)); \
[701]61  return *this; \
62} \
63template <typename CMap>NodeMap& operator=(const CMap& copy) { \
64  this->Factory::Map<V>::operator=<CMap>(copy); \
65  return *this; \
66} \
[674]67};
68
[701]69/** Import a map from a concrete map factory. The import method is
70 *  an overloading of the map type.
71 *  The reason to use these macro is that the c++ does not support
72 *  the template typedefs. If a future release of the c++
73 *  supports this feature it should be fixed.
74 */
[674]75#define IMPORT_EDGE_MAP(Factory) \
76template <typename V> \
77class EdgeMap : public Factory::Map<V> { \
78public: \
79EdgeMap() {} \
[701]80EdgeMap(const Graph& g) : Factory::Map<V>(g, g.edge_maps) {} \
81EdgeMap(const Graph& g, const V& v) : Factory::Map<V>(g, g.node_maps, v) {} \
[703]82EdgeMap(const EdgeMap& copy) \
83  : Factory::Map<V>(static_cast<Factory::Map<V>&>(copy)) {} \
[701]84template <typename CMap> EdgeMap(const CMap& copy) : Factory::Map<V>(copy) {} \
85EdgeMap& operator=(const EdgeMap& copy) { \
[703]86  this->Factory::Map<V>::operator=(static_cast<Factory::Map<V>&>(copy)); \
[701]87  return *this; \
88} \
89template <typename CMap>EdgeMap& operator=(const CMap& copy) { \
90  this->Factory::Map<V>::operator=<CMap>(copy); \
91  return *this; \
92} \
[674]93};
94
[701]95/** This macro creates both map factories and imports both maps.
96 */
[674]97#define CREATE_MAPS(TemplateFactory) \
98CREATE_MAP_FACTORIES(TemplateFactory) \
99IMPORT_NODE_MAP(NodeMapFactory) \
100IMPORT_EDGE_MAP(EdgeMapFactory)
101
102#endif
Note: See TracBrowser for help on using the repository browser.