2 * src/lemon/default_map.h - Part of LEMON, a generic C++ optimization library
4 * Copyright (C) 2005 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
5 * (Egervary Combinatorial Optimization Research Group, EGRES).
7 * Permission to use, modify and distribute this software is granted
8 * provided that this copyright notice appears in all copies. For
9 * precise terms see the accompanying LICENSE file.
11 * This software is provided "AS IS" with no warranty of any kind,
12 * express or implied, and with no claim as to its suitability for any
17 #ifndef LEMON_DEFAULT_MAP_H
18 #define LEMON_DEFAULT_MAP_H
21 #include <lemon/bits/array_map.h>
22 #include <lemon/bits/vector_map.h>
26 ///\brief Graph maps that construct and destruct
27 ///their elements dynamically.
31 /// \addtogroup graphmaps
34 /** The ArrayMap template class is graph map structure what
35 * automatically updates the map when a key is added to or erased from
36 * the map. This map uses the VectorMap if the Value is a primitive
37 * type and the ArrayMap for the other cases.
39 * The template parameter is the MapRegistry that the maps
40 * will belong to and the Value.
45 template <typename _Graph, typename _Item, typename _Value>
46 struct DefaultMapSelector {
47 typedef ArrayMap<_Graph, _Item, _Value> Map;
51 template <typename _Graph, typename _Item>
52 struct DefaultMapSelector<_Graph, _Item, bool> {
53 typedef VectorMap<_Graph, _Item, bool> Map;
57 template <typename _Graph, typename _Item>
58 struct DefaultMapSelector<_Graph, _Item, char> {
59 typedef VectorMap<_Graph, _Item, char> Map;
62 template <typename _Graph, typename _Item>
63 struct DefaultMapSelector<_Graph, _Item, signed char> {
64 typedef VectorMap<_Graph, _Item, signed char> Map;
67 template <typename _Graph, typename _Item>
68 struct DefaultMapSelector<_Graph, _Item, unsigned char> {
69 typedef VectorMap<_Graph, _Item, unsigned char> Map;
74 template <typename _Graph, typename _Item>
75 struct DefaultMapSelector<_Graph, _Item, signed int> {
76 typedef VectorMap<_Graph, _Item, signed int> Map;
79 template <typename _Graph, typename _Item>
80 struct DefaultMapSelector<_Graph, _Item, unsigned int> {
81 typedef VectorMap<_Graph, _Item, unsigned int> Map;
86 template <typename _Graph, typename _Item>
87 struct DefaultMapSelector<_Graph, _Item, signed short> {
88 typedef VectorMap<_Graph, _Item, signed short> Map;
91 template <typename _Graph, typename _Item>
92 struct DefaultMapSelector<_Graph, _Item, unsigned short> {
93 typedef VectorMap<_Graph, _Item, unsigned short> Map;
98 template <typename _Graph, typename _Item>
99 struct DefaultMapSelector<_Graph, _Item, signed long> {
100 typedef VectorMap<_Graph, _Item, signed long> Map;
103 template <typename _Graph, typename _Item>
104 struct DefaultMapSelector<_Graph, _Item, unsigned long> {
105 typedef VectorMap<_Graph, _Item, unsigned long> Map;
108 // \todo handling long long type
112 template <typename _Graph, typename _Item>
113 struct DefaultMapSelector<_Graph, _Item, float> {
114 typedef VectorMap<_Graph, _Item, float> Map;
119 template <typename _Graph, typename _Item>
120 struct DefaultMapSelector<_Graph, _Item, double> {
121 typedef VectorMap<_Graph, _Item, double> Map;
126 template <typename _Graph, typename _Item>
127 struct DefaultMapSelector<_Graph, _Item, long double> {
128 typedef VectorMap<_Graph, _Item, long double> Map;
133 template <typename _Graph, typename _Item, typename _Ptr>
134 struct DefaultMapSelector<_Graph, _Item, _Ptr*> {
135 typedef VectorMap<_Graph, _Item, _Ptr*> Map;
145 : public DefaultMapSelector<_Graph, _Item, _Value>::Map {
147 typedef typename DefaultMapSelector<_Graph, _Item, _Value>::Map Parent;
148 typedef DefaultMap<_Graph, _Item, _Value> Map;
150 typedef typename Parent::Graph Graph;
151 typedef typename Parent::Value Value;
153 DefaultMap(const Graph& _g) : Parent(_g) {}
154 DefaultMap(const Graph& _g, const Value& _v) : Parent(_g, _v) {}
159 template <typename _Base>
160 class DefaultMappableGraphExtender : public _Base {
163 typedef DefaultMappableGraphExtender<_Base> Graph;
164 typedef _Base Parent;
166 typedef typename Parent::Node Node;
167 typedef typename Parent::NodeIt NodeIt;
169 typedef typename Parent::Edge Edge;
170 typedef typename Parent::EdgeIt EdgeIt;
173 template <typename _Value>
175 : public IterableMapExtender<DefaultMap<Graph, Node, _Value> > {
177 typedef DefaultMappableGraphExtender Graph;
178 typedef IterableMapExtender<DefaultMap<Graph, Node, _Value> > Parent;
180 NodeMap(const Graph& _g)
182 NodeMap(const Graph& _g, const _Value& _v)
186 template <typename _Value>
188 : public IterableMapExtender<DefaultMap<Graph, Edge, _Value> > {
190 typedef DefaultMappableGraphExtender Graph;
191 typedef IterableMapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
193 EdgeMap(const Graph& _g)
195 EdgeMap(const Graph& _g, const _Value& _v)
201 template <typename _Base>
202 class MappableUndirGraphExtender :
203 public DefaultMappableGraphExtender<_Base> {
206 typedef MappableUndirGraphExtender Graph;
207 typedef DefaultMappableGraphExtender<_Base> Parent;
209 typedef typename Parent::UndirEdge UndirEdge;
211 template <typename _Value>
213 : public IterableMapExtender<DefaultMap<Graph, UndirEdge, _Value> > {
215 typedef MappableUndirGraphExtender Graph;
216 typedef IterableMapExtender<
217 DefaultMap<Graph, UndirEdge, _Value> > Parent;
219 UndirEdgeMap(const Graph& _g)
221 UndirEdgeMap(const Graph& _g, const _Value& _v)