if you have a nuclear power plant and wanna compute small magic squares, then let's do it
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 Graph;
176 typedef DefaultMap<Graph, Node, NodeIt, _Value> Parent;
178 NodeMap(const Graph& _g)
180 NodeMap(const Graph& _g, const _Value& _v)
184 template <typename _Value>
185 class EdgeMap : public DefaultMap<Graph, Edge, EdgeIt, _Value> {
187 typedef DefaultMappableGraphExtender Graph;
188 typedef DefaultMap<Graph, Edge, EdgeIt, _Value> Parent;
190 EdgeMap(const Graph& _g)
192 EdgeMap(const Graph& _g, const _Value& _v)
198 template <typename _Base>
199 class MappableUndirGraphExtender :
200 public DefaultMappableGraphExtender<_Base> {
203 typedef MappableUndirGraphExtender Graph;
204 typedef DefaultMappableGraphExtender<_Base> Parent;
206 typedef typename Parent::UndirEdge UndirEdge;
207 typedef typename Parent::UndirEdgeIt UndirEdgeIt;
209 template <typename _Value>
211 public DefaultMap<Graph, UndirEdge, UndirEdgeIt, _Value> {
213 typedef MappableUndirGraphExtender Graph;
214 typedef DefaultMap<Graph, UndirEdge, UndirEdgeIt, _Value> Parent;
216 UndirEdgeMap(const Graph& _g)
218 UndirEdgeMap(const Graph& _g, const _Value& _v)