2 * src/lemon/default_map.h - Part of LEMON, a generic C++ optimization library
4 * Copyright (C) 2004 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/array_map.h>
22 #include <lemon/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 _ItemIt, typename _Value>
46 struct DefaultMapSelector {
47 typedef ArrayMap<_Graph, _Item, _ItemIt, _Value> Map;
51 template <typename _Graph, typename _Item, typename _ItemIt>
52 struct DefaultMapSelector<_Graph, _Item, _ItemIt, bool> {
53 typedef VectorMap<_Graph, _Item, bool> Map;
57 template <typename _Graph, typename _Item, typename _ItemIt>
58 struct DefaultMapSelector<_Graph, _Item, _ItemIt, char> {
59 typedef VectorMap<_Graph, _Item, char> Map;
62 template <typename _Graph, typename _Item, typename _ItemIt>
63 struct DefaultMapSelector<_Graph, _Item, _ItemIt, signed char> {
64 typedef VectorMap<_Graph, _Item, signed char> Map;
67 template <typename _Graph, typename _Item, typename _ItemIt>
68 struct DefaultMapSelector<_Graph, _Item, _ItemIt, unsigned char> {
69 typedef VectorMap<_Graph, _Item, unsigned char> Map;
74 template <typename _Graph, typename _Item, typename _ItemIt>
75 struct DefaultMapSelector<_Graph, _Item, _ItemIt, signed int> {
76 typedef VectorMap<_Graph, _Item, signed int> Map;
79 template <typename _Graph, typename _Item, typename _ItemIt>
80 struct DefaultMapSelector<_Graph, _Item, _ItemIt, unsigned int> {
81 typedef VectorMap<_Graph, _Item, unsigned int> Map;
86 template <typename _Graph, typename _Item, typename _ItemIt>
87 struct DefaultMapSelector<_Graph, _Item, _ItemIt, signed short> {
88 typedef VectorMap<_Graph, _Item, signed short> Map;
91 template <typename _Graph, typename _Item, typename _ItemIt>
92 struct DefaultMapSelector<_Graph, _Item, _ItemIt, unsigned short> {
93 typedef VectorMap<_Graph, _Item, unsigned short> Map;
98 template <typename _Graph, typename _Item, typename _ItemIt>
99 struct DefaultMapSelector<_Graph, _Item, _ItemIt, signed long> {
100 typedef VectorMap<_Graph, _Item, signed long> Map;
103 template <typename _Graph, typename _Item, typename _ItemIt>
104 struct DefaultMapSelector<_Graph, _Item, _ItemIt, unsigned long> {
105 typedef VectorMap<_Graph, _Item, unsigned long> Map;
108 // \todo handling long long type
112 template <typename _Graph, typename _Item, typename _ItemIt>
113 struct DefaultMapSelector<_Graph, _Item, _ItemIt, float> {
114 typedef VectorMap<_Graph, _Item, float> Map;
119 template <typename _Graph, typename _Item, typename _ItemIt>
120 struct DefaultMapSelector<_Graph, _Item, _ItemIt, double> {
121 typedef VectorMap<_Graph, _Item, double> Map;
126 template <typename _Graph, typename _Item, typename _ItemIt>
127 struct DefaultMapSelector<_Graph, _Item, _ItemIt, long double> {
128 typedef VectorMap<_Graph, _Item, long double> Map;
133 template <typename _Graph, typename _Item, typename _ItemIt, typename _Ptr>
134 struct DefaultMapSelector<_Graph, _Item, _ItemIt, _Ptr*> {
135 typedef VectorMap<_Graph, _Item, _Ptr*> Map;
140 template <typename _Graph,
144 class DefaultMap : public DefaultMapSelector<_Graph, _Item, _ItemIt, _Value>::Map {
146 typedef typename DefaultMapSelector<_Graph, _Item, _ItemIt, _Value>::Map Parent;
147 typedef DefaultMap<_Graph, _Item, _ItemIt, _Value> Map;
149 typedef typename Parent::Graph Graph;
150 typedef typename Parent::Value Value;
152 DefaultMap(const Graph& _g) : Parent(_g) {}
153 DefaultMap(const Graph& _g, const Value& _v) : Parent(_g, _v) {}
158 template <typename _Base>
159 class DefaultMappableGraphExtender : public _Base {
162 typedef DefaultMappableGraphExtender<_Base> Graph;
163 typedef _Base Parent;
165 typedef typename Parent::Node Node;
166 typedef typename Parent::NodeIt NodeIt;
168 typedef typename Parent::Edge Edge;
169 typedef typename Parent::EdgeIt EdgeIt;
172 template <typename _Value>
173 class NodeMap : public DefaultMap<Graph, Node, NodeIt, _Value> {
175 typedef DefaultMappableGraphExtender<_Base> Graph;
177 typedef typename Graph::Node Node;
178 typedef typename Graph::NodeIt NodeIt;
180 typedef DefaultMap<Graph, Node, NodeIt, _Value> Parent;
182 //typedef typename Parent::Graph Graph;
183 typedef typename Parent::Value Value;
185 NodeMap(const Graph& _g)
187 NodeMap(const Graph& _g, const Value& _v)
192 template <typename _Value>
193 class EdgeMap : public DefaultMap<Graph, Edge, EdgeIt, _Value> {
195 typedef DefaultMappableGraphExtender<_Base> Graph;
197 typedef typename Graph::Edge Edge;
198 typedef typename Graph::EdgeIt EdgeIt;
200 typedef DefaultMap<Graph, Edge, EdgeIt, _Value> Parent;
202 //typedef typename Parent::Graph Graph;
203 typedef typename Parent::Value Value;
205 EdgeMap(const Graph& _g)
207 EdgeMap(const Graph& _g, const Value& _v)