src/hugo/map_defines.h
author deba
Thu, 02 Sep 2004 10:07:30 +0000
changeset 782 df2e45e09652
child 785 a9b0863c2265
permissions -rw-r--r--
--This line, and those below, will be ignored--

A hugo/sym_map_factory.h
M hugo/list_graph.h
A hugo/array_map_factory.h
A hugo/map_registry.h
M hugo/smart_graph.h
A hugo/map_defines.h
A hugo/extended_pair.h
M hugo/full_graph.h
A hugo/vector_map_factory.h
deba@782
     1
// -*- c++ -*-
deba@782
     2
#ifndef MAP_DEFINES_H
deba@782
     3
#define MAP_DEFINES_H
deba@782
     4
deba@782
     5
/** Creates the EdgeMapRegistry type an declare a mutable instance 
deba@782
     6
 *  named edge_maps.
deba@782
     7
 */
deba@782
     8
#define CREATE_EDGE_MAP_REGISTRY \
deba@782
     9
typedef MapRegistry<Graph, Edge, EdgeIt> EdgeMapRegistry; \
deba@782
    10
mutable EdgeMapRegistry edge_maps;
deba@782
    11
deba@782
    12
/** Creates the NodeMapRegistry type an declare a mutable instance 
deba@782
    13
 *  named node_maps.
deba@782
    14
 */
deba@782
    15
#define CREATE_NODE_MAP_REGISTRY \
deba@782
    16
typedef MapRegistry<Graph, Node, NodeIt> NodeMapRegistry; \
deba@782
    17
mutable NodeMapRegistry node_maps;
deba@782
    18
deba@782
    19
/** Creates both map registries.
deba@782
    20
 */
deba@782
    21
#define CREATE_MAP_REGISTRIES \
deba@782
    22
CREATE_NODE_MAP_REGISTRY \
deba@782
    23
CREATE_EDGE_MAP_REGISTRY
deba@782
    24
deba@782
    25
/** Creates a concrete factory type from a template map
deba@782
    26
 *  factory to use as node map factory.
deba@782
    27
 */
deba@782
    28
#define CREATE_NODE_MAP_FACTORY(TemplateFactory) \
deba@782
    29
typedef TemplateFactory<NodeMapRegistry> NodeMapFactory;
deba@782
    30
deba@782
    31
/** Creates a concrete factory type from a template map
deba@782
    32
 *  factory to use as edge map factory.
deba@782
    33
 */
deba@782
    34
#define CREATE_EDGE_MAP_FACTORY(TemplateFactory) \
deba@782
    35
typedef TemplateFactory<EdgeMapRegistry> EdgeMapFactory;
deba@782
    36
deba@782
    37
/** Creates both map factories.
deba@782
    38
 */
deba@782
    39
#define CREATE_MAP_FACTORIES(TemplateFactory) \
deba@782
    40
CREATE_NODE_MAP_FACTORY(TemplateFactory) \
deba@782
    41
CREATE_EDGE_MAP_FACTORY(TemplateFactory) 
deba@782
    42
deba@782
    43
/** Import a map from a concrete map factory. The import method is
deba@782
    44
 *  an overloading of the map type.
deba@782
    45
 *  The reason to use these macro is that the c++ does not support
deba@782
    46
 *  the template typedefs. If a future release of the c++ 
deba@782
    47
 *  supports this feature it should be fixed.
deba@782
    48
 */
deba@782
    49
#define IMPORT_NODE_MAP(Factory) \
deba@782
    50
template <typename V> \
deba@782
    51
class NodeMap : public Factory::template Map<V> { \
deba@782
    52
typedef typename Factory::template Map<V> MapImpl; \
deba@782
    53
public: \
deba@782
    54
NodeMap() {} \
deba@782
    55
NodeMap(const Graph& g) : MapImpl(g, g.node_maps) {} \
deba@782
    56
NodeMap(const Graph& g, const V& v) : MapImpl(g, g.node_maps, v) {} \
deba@782
    57
NodeMap(const NodeMap& copy) : MapImpl(static_cast<const MapImpl&>(copy)) {} \
deba@782
    58
template <typename CMap> NodeMap(const CMap& copy) : MapImpl(copy) {} \
deba@782
    59
NodeMap& operator=(const NodeMap& copy) { \
deba@782
    60
  MapImpl::operator=(static_cast<const MapImpl&>(copy));\
deba@782
    61
  return *this; \
deba@782
    62
} \
deba@782
    63
template <typename CMap> NodeMap& operator=(const CMap& copy) { \
deba@782
    64
  MapImpl::operator=(copy);\
deba@782
    65
  return *this; \
deba@782
    66
} \
deba@782
    67
};
deba@782
    68
deba@782
    69
/** Import a map from a concrete map factory. The import method is
deba@782
    70
 *  an overloading of the map type.
deba@782
    71
 *  The reason to use these macro is that the c++ does not support
deba@782
    72
 *  the template typedefs. If a future release of the c++ 
deba@782
    73
 *  supports this feature it should be fixed.
deba@782
    74
 */
deba@782
    75
#define IMPORT_EDGE_MAP(Factory) \
deba@782
    76
template <typename V> \
deba@782
    77
class EdgeMap : public Factory::template Map<V> { \
deba@782
    78
typedef typename Factory::template Map<V> MapImpl; \
deba@782
    79
public: \
deba@782
    80
EdgeMap() {} \
deba@782
    81
EdgeMap(const Graph& g) : MapImpl(g, g.edge_maps) {} \
deba@782
    82
EdgeMap(const Graph& g, const V& v) : MapImpl(g, g.edge_maps, v) {} \
deba@782
    83
EdgeMap(const EdgeMap& copy) : MapImpl(static_cast<const MapImpl&>(copy)) {} \
deba@782
    84
template <typename CMap> EdgeMap(const CMap& copy) : MapImpl(copy) {} \
deba@782
    85
EdgeMap& operator=(const EdgeMap& copy) { \
deba@782
    86
  MapImpl::operator=(static_cast<const MapImpl&>(copy));\
deba@782
    87
  return *this; \
deba@782
    88
} \
deba@782
    89
template <typename CMap> EdgeMap& operator=(const CMap& copy) { \
deba@782
    90
  MapImpl::operator=(copy);\
deba@782
    91
  return *this; \
deba@782
    92
} \
deba@782
    93
};
deba@782
    94
deba@782
    95
/** This macro creates both map factories and imports both maps.
deba@782
    96
 */
deba@782
    97
#define CREATE_MAPS(TemplateFactory) \
deba@782
    98
CREATE_MAP_FACTORIES(TemplateFactory) \
deba@782
    99
IMPORT_NODE_MAP(NodeMapFactory) \
deba@782
   100
IMPORT_EDGE_MAP(EdgeMapFactory)
deba@782
   101
deba@782
   102
/** This macro creates MapRegistry for Symmetric Edge Maps.
deba@782
   103
 */
deba@782
   104
#define CREATE_SYM_EDGE_MAP_REGISTRY \
deba@782
   105
typedef SymEdgeIt<Graph, Edge, EdgeIt> SymEdgeIt; \
deba@782
   106
typedef MapRegistry<Graph, Edge, SymEdgeIt> SymEdgeMapRegistry; \
deba@782
   107
mutable EdgeMapRegistry sym_edge_maps;
deba@782
   108
deba@782
   109
/** Creates a concrete factory type from a template map
deba@782
   110
 *  factory to use as edge map factory.
deba@782
   111
 */
deba@782
   112
#define CREATE_SYM_EDGE_MAP_FACTORY(TemplateFactory) \
deba@782
   113
typedef SymMapFactory<SymEdgeMapRegistry, TemplateFactory > \
deba@782
   114
SymEdgeMapFactory;
deba@782
   115
deba@782
   116
/** Import a map from a concrete map factory. The import method is
deba@782
   117
 *  an overloading of the map type.
deba@782
   118
 *  The reason to use these macro is that the c++ does not support
deba@782
   119
 *  the template typedefs. If a future release of the c++ 
deba@782
   120
 *  supports this feature it should be fixed.
deba@782
   121
 */
deba@782
   122
#define IMPORT_SYM_EDGE_MAP(Factory) \
deba@782
   123
template <typename V> \
deba@782
   124
class SymEdgeMap : public Factory::template Map<V> { \
deba@782
   125
typedef typename Factory::template Map<V> MapImpl; \
deba@782
   126
public: \
deba@782
   127
SymEdgeMap() {} \
deba@782
   128
SymEdgeMap(const Graph& g) : MapImpl(g, g.sym_edge_maps) {} \
deba@782
   129
SymEdgeMap(const Graph& g, const V& v) : MapImpl(g, g.sym_edge_maps, v) {} \
deba@782
   130
SymEdgeMap(const SymEdgeMap& copy) \
deba@782
   131
  : MapImpl(static_cast<const MapImpl&>(copy)) {} \
deba@782
   132
template <typename CMap> SymEdgeMap(const CMap& copy) : MapImpl(copy) {} \
deba@782
   133
SymEdgeMap& operator=(const SymEdgeMap& copy) { \
deba@782
   134
  MapImpl::operator=(static_cast<const MapImpl&>(copy));\
deba@782
   135
  return *this; \
deba@782
   136
} \
deba@782
   137
template <typename CMap> SymEdgeMap& operator=(const CMap& copy) { \
deba@782
   138
  MapImpl::operator=(copy);\
deba@782
   139
  return *this; \
deba@782
   140
} \
deba@782
   141
};
deba@782
   142
deba@782
   143
deba@782
   144
#define KEEP_NODE_MAP(GraphBase) \
deba@782
   145
    template <typename V> class NodeMap \
deba@782
   146
      : public GraphBase::template NodeMap<V> \
deba@782
   147
    { \
deba@782
   148
      typedef typename GraphBase::template NodeMap<V> MapImpl; \
deba@782
   149
      typedef V Value; \
deba@782
   150
    public: \
deba@782
   151
      NodeMap() : MapImpl() {} \
deba@782
   152
\
deba@782
   153
      NodeMap(const Graph& graph) \
deba@782
   154
	: MapImpl(static_cast<const GraphBase&>(graph)) { } \
deba@782
   155
\
deba@782
   156
      NodeMap(const Graph& graph, const Value& value) \
deba@782
   157
	: MapImpl(static_cast<const GraphBase&>(graph), value) { } \
deba@782
   158
\
deba@782
   159
      NodeMap(const NodeMap& copy) \
deba@782
   160
	: MapImpl(static_cast<const MapImpl&>(copy)) {} \
deba@782
   161
\
deba@782
   162
      template<typename CMap> \
deba@782
   163
      NodeMap(const CMap& copy) \
deba@782
   164
	: MapImpl(copy) {} \
deba@782
   165
\
deba@782
   166
      NodeMap& operator=(const NodeMap& copy) { \
deba@782
   167
	MapImpl::operator=(static_cast<const MapImpl&>(copy)); \
deba@782
   168
	return *this; \
deba@782
   169
      } \
deba@782
   170
\
deba@782
   171
      template <typename CMap> \
deba@782
   172
      NodeMap& operator=(const CMap& copy) { \
deba@782
   173
	MapImpl::operator=(copy); \
deba@782
   174
	return *this; \
deba@782
   175
      } \
deba@782
   176
    };
deba@782
   177
deba@782
   178
#define KEEP_EDGE_MAP(GraphBase) \
deba@782
   179
    template <typename V> class EdgeMap \
deba@782
   180
      : public GraphBase::template EdgeMap<V> \
deba@782
   181
    { \
deba@782
   182
      typedef typename GraphBase::template EdgeMap<V> MapImpl; \
deba@782
   183
      typedef V Value; \
deba@782
   184
    public: \
deba@782
   185
      EdgeMap() : MapImpl() {} \
deba@782
   186
\
deba@782
   187
      EdgeMap(const Graph& graph) \
deba@782
   188
	: MapImpl(static_cast<const GraphBase&>(graph)) { } \
deba@782
   189
\
deba@782
   190
      EdgeMap(const Graph& graph, const Value& value) \
deba@782
   191
	: MapImpl(static_cast<const GraphBase&>(graph), value) { } \
deba@782
   192
\
deba@782
   193
      EdgeMap(const EdgeMap& copy) \
deba@782
   194
	: MapImpl(static_cast<const MapImpl&>(copy)) {} \
deba@782
   195
\
deba@782
   196
      template<typename CMap> \
deba@782
   197
      EdgeMap(const CMap& copy) \
deba@782
   198
	: MapImpl(copy) {} \
deba@782
   199
\
deba@782
   200
      EdgeMap& operator=(const EdgeMap& copy) { \
deba@782
   201
	MapImpl::operator=(static_cast<const MapImpl&>(copy)); \
deba@782
   202
	return *this; \
deba@782
   203
      } \
deba@782
   204
\
deba@782
   205
      template <typename CMap> \
deba@782
   206
      EdgeMap& operator=(const CMap& copy) { \
deba@782
   207
	MapImpl::operator=(copy); \
deba@782
   208
	return *this; \
deba@782
   209
      } \
deba@782
   210
    };
deba@782
   211
deba@782
   212
#endif