lemongraph 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +8 -0
  3. data/LICENSE +674 -0
  4. data/README.md +6 -0
  5. data/ext/lemon-1.3.1/AUTHORS +26 -0
  6. data/ext/lemon-1.3.1/CMakeLists.txt +371 -0
  7. data/ext/lemon-1.3.1/INSTALL +167 -0
  8. data/ext/lemon-1.3.1/LICENSE +32 -0
  9. data/ext/lemon-1.3.1/NEWS +337 -0
  10. data/ext/lemon-1.3.1/README +50 -0
  11. data/ext/lemon-1.3.1/cmake/FindCOIN.cmake +110 -0
  12. data/ext/lemon-1.3.1/cmake/FindGLPK.cmake +55 -0
  13. data/ext/lemon-1.3.1/cmake/FindGhostscript.cmake +10 -0
  14. data/ext/lemon-1.3.1/cmake/FindILOG.cmake +102 -0
  15. data/ext/lemon-1.3.1/cmake/FindSOPLEX.cmake +23 -0
  16. data/ext/lemon-1.3.1/cmake/LEMONConfig.cmake.in +13 -0
  17. data/ext/lemon-1.3.1/cmake/nsis/lemon.ico +0 -0
  18. data/ext/lemon-1.3.1/cmake/nsis/uninstall.ico +0 -0
  19. data/ext/lemon-1.3.1/cmake/version.cmake +1 -0
  20. data/ext/lemon-1.3.1/cmake/version.cmake.in +1 -0
  21. data/ext/lemon-1.3.1/contrib/CMakeLists.txt +19 -0
  22. data/ext/lemon-1.3.1/lemon/CMakeLists.txt +91 -0
  23. data/ext/lemon-1.3.1/lemon/adaptors.h +3638 -0
  24. data/ext/lemon-1.3.1/lemon/arg_parser.cc +474 -0
  25. data/ext/lemon-1.3.1/lemon/arg_parser.h +440 -0
  26. data/ext/lemon-1.3.1/lemon/assert.h +214 -0
  27. data/ext/lemon-1.3.1/lemon/base.cc +37 -0
  28. data/ext/lemon-1.3.1/lemon/bellman_ford.h +1116 -0
  29. data/ext/lemon-1.3.1/lemon/bfs.h +1754 -0
  30. data/ext/lemon-1.3.1/lemon/bin_heap.h +347 -0
  31. data/ext/lemon-1.3.1/lemon/binomial_heap.h +445 -0
  32. data/ext/lemon-1.3.1/lemon/bits/alteration_notifier.h +472 -0
  33. data/ext/lemon-1.3.1/lemon/bits/array_map.h +351 -0
  34. data/ext/lemon-1.3.1/lemon/bits/bezier.h +174 -0
  35. data/ext/lemon-1.3.1/lemon/bits/default_map.h +182 -0
  36. data/ext/lemon-1.3.1/lemon/bits/edge_set_extender.h +627 -0
  37. data/ext/lemon-1.3.1/lemon/bits/enable_if.h +131 -0
  38. data/ext/lemon-1.3.1/lemon/bits/graph_adaptor_extender.h +401 -0
  39. data/ext/lemon-1.3.1/lemon/bits/graph_extender.h +1332 -0
  40. data/ext/lemon-1.3.1/lemon/bits/lock.h +65 -0
  41. data/ext/lemon-1.3.1/lemon/bits/map_extender.h +332 -0
  42. data/ext/lemon-1.3.1/lemon/bits/path_dump.h +177 -0
  43. data/ext/lemon-1.3.1/lemon/bits/solver_bits.h +194 -0
  44. data/ext/lemon-1.3.1/lemon/bits/traits.h +388 -0
  45. data/ext/lemon-1.3.1/lemon/bits/variant.h +494 -0
  46. data/ext/lemon-1.3.1/lemon/bits/vector_map.h +244 -0
  47. data/ext/lemon-1.3.1/lemon/bits/windows.cc +166 -0
  48. data/ext/lemon-1.3.1/lemon/bits/windows.h +44 -0
  49. data/ext/lemon-1.3.1/lemon/bucket_heap.h +594 -0
  50. data/ext/lemon-1.3.1/lemon/capacity_scaling.h +1014 -0
  51. data/ext/lemon-1.3.1/lemon/cbc.cc +460 -0
  52. data/ext/lemon-1.3.1/lemon/cbc.h +129 -0
  53. data/ext/lemon-1.3.1/lemon/christofides_tsp.h +254 -0
  54. data/ext/lemon-1.3.1/lemon/circulation.h +807 -0
  55. data/ext/lemon-1.3.1/lemon/clp.cc +464 -0
  56. data/ext/lemon-1.3.1/lemon/clp.h +164 -0
  57. data/ext/lemon-1.3.1/lemon/color.cc +44 -0
  58. data/ext/lemon-1.3.1/lemon/color.h +204 -0
  59. data/ext/lemon-1.3.1/lemon/concept_check.h +77 -0
  60. data/ext/lemon-1.3.1/lemon/concepts/bpgraph.h +1029 -0
  61. data/ext/lemon-1.3.1/lemon/concepts/digraph.h +491 -0
  62. data/ext/lemon-1.3.1/lemon/concepts/graph.h +788 -0
  63. data/ext/lemon-1.3.1/lemon/concepts/graph_components.h +2134 -0
  64. data/ext/lemon-1.3.1/lemon/concepts/heap.h +324 -0
  65. data/ext/lemon-1.3.1/lemon/concepts/maps.h +223 -0
  66. data/ext/lemon-1.3.1/lemon/concepts/path.h +312 -0
  67. data/ext/lemon-1.3.1/lemon/config.h.in +22 -0
  68. data/ext/lemon-1.3.1/lemon/connectivity.h +1688 -0
  69. data/ext/lemon-1.3.1/lemon/core.h +2506 -0
  70. data/ext/lemon-1.3.1/lemon/cost_scaling.h +1607 -0
  71. data/ext/lemon-1.3.1/lemon/counter.h +249 -0
  72. data/ext/lemon-1.3.1/lemon/cplex.cc +994 -0
  73. data/ext/lemon-1.3.1/lemon/cplex.h +292 -0
  74. data/ext/lemon-1.3.1/lemon/cycle_canceling.h +1230 -0
  75. data/ext/lemon-1.3.1/lemon/dfs.h +1637 -0
  76. data/ext/lemon-1.3.1/lemon/dheap.h +352 -0
  77. data/ext/lemon-1.3.1/lemon/dijkstra.h +1303 -0
  78. data/ext/lemon-1.3.1/lemon/dim2.h +726 -0
  79. data/ext/lemon-1.3.1/lemon/dimacs.h +448 -0
  80. data/ext/lemon-1.3.1/lemon/edge_set.h +1420 -0
  81. data/ext/lemon-1.3.1/lemon/edmonds_karp.h +556 -0
  82. data/ext/lemon-1.3.1/lemon/elevator.h +982 -0
  83. data/ext/lemon-1.3.1/lemon/error.h +276 -0
  84. data/ext/lemon-1.3.1/lemon/euler.h +287 -0
  85. data/ext/lemon-1.3.1/lemon/fib_heap.h +475 -0
  86. data/ext/lemon-1.3.1/lemon/fractional_matching.h +2139 -0
  87. data/ext/lemon-1.3.1/lemon/full_graph.h +1082 -0
  88. data/ext/lemon-1.3.1/lemon/glpk.cc +1012 -0
  89. data/ext/lemon-1.3.1/lemon/glpk.h +263 -0
  90. data/ext/lemon-1.3.1/lemon/gomory_hu.h +568 -0
  91. data/ext/lemon-1.3.1/lemon/graph_to_eps.h +1186 -0
  92. data/ext/lemon-1.3.1/lemon/greedy_tsp.h +251 -0
  93. data/ext/lemon-1.3.1/lemon/grid_graph.h +699 -0
  94. data/ext/lemon-1.3.1/lemon/grosso_locatelli_pullan_mc.h +840 -0
  95. data/ext/lemon-1.3.1/lemon/hao_orlin.h +1015 -0
  96. data/ext/lemon-1.3.1/lemon/hartmann_orlin_mmc.h +654 -0
  97. data/ext/lemon-1.3.1/lemon/howard_mmc.h +651 -0
  98. data/ext/lemon-1.3.1/lemon/hypercube_graph.h +459 -0
  99. data/ext/lemon-1.3.1/lemon/insertion_tsp.h +533 -0
  100. data/ext/lemon-1.3.1/lemon/karp_mmc.h +590 -0
  101. data/ext/lemon-1.3.1/lemon/kruskal.h +324 -0
  102. data/ext/lemon-1.3.1/lemon/lemon.pc.in +10 -0
  103. data/ext/lemon-1.3.1/lemon/lgf_reader.h +3854 -0
  104. data/ext/lemon-1.3.1/lemon/lgf_writer.h +2687 -0
  105. data/ext/lemon-1.3.1/lemon/list_graph.h +2510 -0
  106. data/ext/lemon-1.3.1/lemon/lp.h +95 -0
  107. data/ext/lemon-1.3.1/lemon/lp_base.cc +30 -0
  108. data/ext/lemon-1.3.1/lemon/lp_base.h +2147 -0
  109. data/ext/lemon-1.3.1/lemon/lp_skeleton.cc +143 -0
  110. data/ext/lemon-1.3.1/lemon/lp_skeleton.h +234 -0
  111. data/ext/lemon-1.3.1/lemon/maps.h +4057 -0
  112. data/ext/lemon-1.3.1/lemon/matching.h +3505 -0
  113. data/ext/lemon-1.3.1/lemon/math.h +77 -0
  114. data/ext/lemon-1.3.1/lemon/max_cardinality_search.h +794 -0
  115. data/ext/lemon-1.3.1/lemon/min_cost_arborescence.h +808 -0
  116. data/ext/lemon-1.3.1/lemon/nagamochi_ibaraki.h +702 -0
  117. data/ext/lemon-1.3.1/lemon/nauty_reader.h +113 -0
  118. data/ext/lemon-1.3.1/lemon/nearest_neighbor_tsp.h +238 -0
  119. data/ext/lemon-1.3.1/lemon/network_simplex.h +1659 -0
  120. data/ext/lemon-1.3.1/lemon/opt2_tsp.h +367 -0
  121. data/ext/lemon-1.3.1/lemon/pairing_heap.h +474 -0
  122. data/ext/lemon-1.3.1/lemon/path.h +1164 -0
  123. data/ext/lemon-1.3.1/lemon/planarity.h +2754 -0
  124. data/ext/lemon-1.3.1/lemon/preflow.h +985 -0
  125. data/ext/lemon-1.3.1/lemon/quad_heap.h +343 -0
  126. data/ext/lemon-1.3.1/lemon/radix_heap.h +438 -0
  127. data/ext/lemon-1.3.1/lemon/radix_sort.h +487 -0
  128. data/ext/lemon-1.3.1/lemon/random.cc +29 -0
  129. data/ext/lemon-1.3.1/lemon/random.h +1005 -0
  130. data/ext/lemon-1.3.1/lemon/smart_graph.h +1344 -0
  131. data/ext/lemon-1.3.1/lemon/soplex.cc +465 -0
  132. data/ext/lemon-1.3.1/lemon/soplex.h +158 -0
  133. data/ext/lemon-1.3.1/lemon/static_graph.h +476 -0
  134. data/ext/lemon-1.3.1/lemon/suurballe.h +776 -0
  135. data/ext/lemon-1.3.1/lemon/time_measure.h +610 -0
  136. data/ext/lemon-1.3.1/lemon/tolerance.h +242 -0
  137. data/ext/lemon-1.3.1/lemon/unionfind.h +1824 -0
  138. data/ext/lemon-1.3.1/scripts/unify-sources.sh +390 -0
  139. data/ext/lemon-1.3.1/scripts/valgrind-wrapper.sh +22 -0
  140. data/ext/lemongraph/arc_map.cc +1007 -0
  141. data/ext/lemongraph/digraph.cc +282 -0
  142. data/ext/lemongraph/digraph_arc.cc +153 -0
  143. data/ext/lemongraph/digraph_node.cc +277 -0
  144. data/ext/lemongraph/edge_map.cc +770 -0
  145. data/ext/lemongraph/extconf.rb +53 -0
  146. data/ext/lemongraph/graph.cc +351 -0
  147. data/ext/lemongraph/graph_arc.cc +95 -0
  148. data/ext/lemongraph/graph_edge.cc +153 -0
  149. data/ext/lemongraph/graph_item.cc +76 -0
  150. data/ext/lemongraph/graph_node.cc +321 -0
  151. data/ext/lemongraph/lemongraph.cc +260 -0
  152. data/ext/lemongraph/lemongraph.hh +295 -0
  153. data/ext/lemongraph/lemongraph.map +6 -0
  154. data/ext/lemongraph/lemongraph_export.hh +31 -0
  155. data/ext/lemongraph/node_map.cc +1011 -0
  156. data/lemongraph.gemspec +176 -0
  157. data/lib/lemongraph/graphviz.rb +240 -0
  158. data/lib/lemongraph/version.rb +4 -0
  159. data/lib/lemongraph.rb +21 -0
  160. data/samples/lemondeps.rb +38 -0
  161. metadata +202 -0
@@ -0,0 +1,4057 @@
1
+ /* -*- mode: C++; indent-tabs-mode: nil; -*-
2
+ *
3
+ * This file is a part of LEMON, a generic C++ optimization library.
4
+ *
5
+ * Copyright (C) 2003-2013
6
+ * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
+ * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
+ *
9
+ * Permission to use, modify and distribute this software is granted
10
+ * provided that this copyright notice appears in all copies. For
11
+ * precise terms see the accompanying LICENSE file.
12
+ *
13
+ * This software is provided "AS IS" with no warranty of any kind,
14
+ * express or implied, and with no claim as to its suitability for any
15
+ * purpose.
16
+ *
17
+ */
18
+
19
+ #ifndef LEMON_MAPS_H
20
+ #define LEMON_MAPS_H
21
+
22
+ #include <iterator>
23
+ #include <functional>
24
+ #include <vector>
25
+ #include <map>
26
+
27
+ #include <lemon/core.h>
28
+
29
+ ///\file
30
+ ///\ingroup maps
31
+ ///\brief Miscellaneous property maps
32
+
33
+ namespace lemon {
34
+
35
+ /// \addtogroup maps
36
+ /// @{
37
+
38
+ /// Base class of maps.
39
+
40
+ /// Base class of maps. It provides the necessary type definitions
41
+ /// required by the map %concepts.
42
+ template<typename K, typename V>
43
+ class MapBase {
44
+ public:
45
+ /// \brief The key type of the map.
46
+ typedef K Key;
47
+ /// \brief The value type of the map.
48
+ /// (The type of objects associated with the keys).
49
+ typedef V Value;
50
+ };
51
+
52
+
53
+ /// Null map. (a.k.a. DoNothingMap)
54
+
55
+ /// This map can be used if you have to provide a map only for
56
+ /// its type definitions, or if you have to provide a writable map,
57
+ /// but data written to it is not required (i.e. it will be sent to
58
+ /// <tt>/dev/null</tt>).
59
+ /// It conforms to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
60
+ ///
61
+ /// \sa ConstMap
62
+ template<typename K, typename V>
63
+ class NullMap : public MapBase<K, V> {
64
+ public:
65
+ ///\e
66
+ typedef K Key;
67
+ ///\e
68
+ typedef V Value;
69
+
70
+ /// Gives back a default constructed element.
71
+ Value operator[](const Key&) const { return Value(); }
72
+ /// Absorbs the value.
73
+ void set(const Key&, const Value&) {}
74
+ };
75
+
76
+ /// Returns a \c NullMap class
77
+
78
+ /// This function just returns a \c NullMap class.
79
+ /// \relates NullMap
80
+ template <typename K, typename V>
81
+ NullMap<K, V> nullMap() {
82
+ return NullMap<K, V>();
83
+ }
84
+
85
+
86
+ /// Constant map.
87
+
88
+ /// This \ref concepts::ReadMap "readable map" assigns a specified
89
+ /// value to each key.
90
+ ///
91
+ /// In other aspects it is equivalent to \c NullMap.
92
+ /// So it conforms to the \ref concepts::ReadWriteMap "ReadWriteMap"
93
+ /// concept, but it absorbs the data written to it.
94
+ ///
95
+ /// The simplest way of using this map is through the constMap()
96
+ /// function.
97
+ ///
98
+ /// \sa NullMap
99
+ /// \sa IdentityMap
100
+ template<typename K, typename V>
101
+ class ConstMap : public MapBase<K, V> {
102
+ private:
103
+ V _value;
104
+ public:
105
+ ///\e
106
+ typedef K Key;
107
+ ///\e
108
+ typedef V Value;
109
+
110
+ /// Default constructor
111
+
112
+ /// Default constructor.
113
+ /// The value of the map will be default constructed.
114
+ ConstMap() {}
115
+
116
+ /// Constructor with specified initial value
117
+
118
+ /// Constructor with specified initial value.
119
+ /// \param v The initial value of the map.
120
+ ConstMap(const Value &v) : _value(v) {}
121
+
122
+ /// Gives back the specified value.
123
+ Value operator[](const Key&) const { return _value; }
124
+
125
+ /// Absorbs the value.
126
+ void set(const Key&, const Value&) {}
127
+
128
+ /// Sets the value that is assigned to each key.
129
+ void setAll(const Value &v) {
130
+ _value = v;
131
+ }
132
+
133
+ template<typename V1>
134
+ ConstMap(const ConstMap<K, V1> &, const Value &v) : _value(v) {}
135
+ };
136
+
137
+ /// Returns a \c ConstMap class
138
+
139
+ /// This function just returns a \c ConstMap class.
140
+ /// \relates ConstMap
141
+ template<typename K, typename V>
142
+ inline ConstMap<K, V> constMap(const V &v) {
143
+ return ConstMap<K, V>(v);
144
+ }
145
+
146
+ template<typename K, typename V>
147
+ inline ConstMap<K, V> constMap() {
148
+ return ConstMap<K, V>();
149
+ }
150
+
151
+
152
+ template<typename T, T v>
153
+ struct Const {};
154
+
155
+ /// Constant map with inlined constant value.
156
+
157
+ /// This \ref concepts::ReadMap "readable map" assigns a specified
158
+ /// value to each key.
159
+ ///
160
+ /// In other aspects it is equivalent to \c NullMap.
161
+ /// So it conforms to the \ref concepts::ReadWriteMap "ReadWriteMap"
162
+ /// concept, but it absorbs the data written to it.
163
+ ///
164
+ /// The simplest way of using this map is through the constMap()
165
+ /// function.
166
+ ///
167
+ /// \sa NullMap
168
+ /// \sa IdentityMap
169
+ template<typename K, typename V, V v>
170
+ class ConstMap<K, Const<V, v> > : public MapBase<K, V> {
171
+ public:
172
+ ///\e
173
+ typedef K Key;
174
+ ///\e
175
+ typedef V Value;
176
+
177
+ /// Constructor.
178
+ ConstMap() {}
179
+
180
+ /// Gives back the specified value.
181
+ Value operator[](const Key&) const { return v; }
182
+
183
+ /// Absorbs the value.
184
+ void set(const Key&, const Value&) {}
185
+ };
186
+
187
+ /// Returns a \c ConstMap class with inlined constant value
188
+
189
+ /// This function just returns a \c ConstMap class with inlined
190
+ /// constant value.
191
+ /// \relates ConstMap
192
+ template<typename K, typename V, V v>
193
+ inline ConstMap<K, Const<V, v> > constMap() {
194
+ return ConstMap<K, Const<V, v> >();
195
+ }
196
+
197
+
198
+ /// Identity map.
199
+
200
+ /// This \ref concepts::ReadMap "read-only map" gives back the given
201
+ /// key as value without any modification.
202
+ ///
203
+ /// \sa ConstMap
204
+ template <typename T>
205
+ class IdentityMap : public MapBase<T, T> {
206
+ public:
207
+ ///\e
208
+ typedef T Key;
209
+ ///\e
210
+ typedef T Value;
211
+
212
+ /// Gives back the given value without any modification.
213
+ Value operator[](const Key &k) const {
214
+ return k;
215
+ }
216
+ };
217
+
218
+ /// Returns an \c IdentityMap class
219
+
220
+ /// This function just returns an \c IdentityMap class.
221
+ /// \relates IdentityMap
222
+ template<typename T>
223
+ inline IdentityMap<T> identityMap() {
224
+ return IdentityMap<T>();
225
+ }
226
+
227
+
228
+ /// \brief Map for storing values for integer keys from the range
229
+ /// <tt>[0..size-1]</tt>.
230
+ ///
231
+ /// This map is essentially a wrapper for \c std::vector. It assigns
232
+ /// values to integer keys from the range <tt>[0..size-1]</tt>.
233
+ /// It can be used together with some data structures, e.g.
234
+ /// heap types and \c UnionFind, when the used items are small
235
+ /// integers. This map conforms to the \ref concepts::ReferenceMap
236
+ /// "ReferenceMap" concept.
237
+ ///
238
+ /// The simplest way of using this map is through the rangeMap()
239
+ /// function.
240
+ template <typename V>
241
+ class RangeMap : public MapBase<int, V> {
242
+ template <typename V1>
243
+ friend class RangeMap;
244
+ private:
245
+
246
+ typedef std::vector<V> Vector;
247
+ Vector _vector;
248
+
249
+ public:
250
+
251
+ /// Key type
252
+ typedef int Key;
253
+ /// Value type
254
+ typedef V Value;
255
+ /// Reference type
256
+ typedef typename Vector::reference Reference;
257
+ /// Const reference type
258
+ typedef typename Vector::const_reference ConstReference;
259
+
260
+ typedef True ReferenceMapTag;
261
+
262
+ public:
263
+
264
+ /// Constructor with specified default value.
265
+ RangeMap(int size = 0, const Value &value = Value())
266
+ : _vector(size, value) {}
267
+
268
+ /// Constructs the map from an appropriate \c std::vector.
269
+ template <typename V1>
270
+ RangeMap(const std::vector<V1>& vector)
271
+ : _vector(vector.begin(), vector.end()) {}
272
+
273
+ /// Constructs the map from another \c RangeMap.
274
+ template <typename V1>
275
+ RangeMap(const RangeMap<V1> &c)
276
+ : _vector(c._vector.begin(), c._vector.end()) {}
277
+
278
+ /// Returns the size of the map.
279
+ int size() {
280
+ return _vector.size();
281
+ }
282
+
283
+ /// Resizes the map.
284
+
285
+ /// Resizes the underlying \c std::vector container, so changes the
286
+ /// keyset of the map.
287
+ /// \param size The new size of the map. The new keyset will be the
288
+ /// range <tt>[0..size-1]</tt>.
289
+ /// \param value The default value to assign to the new keys.
290
+ void resize(int size, const Value &value = Value()) {
291
+ _vector.resize(size, value);
292
+ }
293
+
294
+ private:
295
+
296
+ RangeMap& operator=(const RangeMap&);
297
+
298
+ public:
299
+
300
+ ///\e
301
+ Reference operator[](const Key &k) {
302
+ return _vector[k];
303
+ }
304
+
305
+ ///\e
306
+ ConstReference operator[](const Key &k) const {
307
+ return _vector[k];
308
+ }
309
+
310
+ ///\e
311
+ void set(const Key &k, const Value &v) {
312
+ _vector[k] = v;
313
+ }
314
+ };
315
+
316
+ /// Returns a \c RangeMap class
317
+
318
+ /// This function just returns a \c RangeMap class.
319
+ /// \relates RangeMap
320
+ template<typename V>
321
+ inline RangeMap<V> rangeMap(int size = 0, const V &value = V()) {
322
+ return RangeMap<V>(size, value);
323
+ }
324
+
325
+ /// \brief Returns a \c RangeMap class created from an appropriate
326
+ /// \c std::vector
327
+
328
+ /// This function just returns a \c RangeMap class created from an
329
+ /// appropriate \c std::vector.
330
+ /// \relates RangeMap
331
+ template<typename V>
332
+ inline RangeMap<V> rangeMap(const std::vector<V> &vector) {
333
+ return RangeMap<V>(vector);
334
+ }
335
+
336
+
337
+ /// Map type based on \c std::map
338
+
339
+ /// This map is essentially a wrapper for \c std::map with addition
340
+ /// that you can specify a default value for the keys that are not
341
+ /// stored actually. This value can be different from the default
342
+ /// contructed value (i.e. \c %Value()).
343
+ /// This type conforms to the \ref concepts::ReferenceMap "ReferenceMap"
344
+ /// concept.
345
+ ///
346
+ /// This map is useful if a default value should be assigned to most of
347
+ /// the keys and different values should be assigned only to a few
348
+ /// keys (i.e. the map is "sparse").
349
+ /// The name of this type also refers to this important usage.
350
+ ///
351
+ /// Apart form that, this map can be used in many other cases since it
352
+ /// is based on \c std::map, which is a general associative container.
353
+ /// However, keep in mind that it is usually not as efficient as other
354
+ /// maps.
355
+ ///
356
+ /// The simplest way of using this map is through the sparseMap()
357
+ /// function.
358
+ template <typename K, typename V, typename Comp = std::less<K> >
359
+ class SparseMap : public MapBase<K, V> {
360
+ template <typename K1, typename V1, typename C1>
361
+ friend class SparseMap;
362
+ public:
363
+
364
+ /// Key type
365
+ typedef K Key;
366
+ /// Value type
367
+ typedef V Value;
368
+ /// Reference type
369
+ typedef Value& Reference;
370
+ /// Const reference type
371
+ typedef const Value& ConstReference;
372
+
373
+ typedef True ReferenceMapTag;
374
+
375
+ private:
376
+
377
+ typedef std::map<K, V, Comp> Map;
378
+ Map _map;
379
+ Value _value;
380
+
381
+ public:
382
+
383
+ /// \brief Constructor with specified default value.
384
+ SparseMap(const Value &value = Value()) : _value(value) {}
385
+ /// \brief Constructs the map from an appropriate \c std::map, and
386
+ /// explicitly specifies a default value.
387
+ template <typename V1, typename Comp1>
388
+ SparseMap(const std::map<Key, V1, Comp1> &map,
389
+ const Value &value = Value())
390
+ : _map(map.begin(), map.end()), _value(value) {}
391
+
392
+ /// \brief Constructs the map from another \c SparseMap.
393
+ template<typename V1, typename Comp1>
394
+ SparseMap(const SparseMap<Key, V1, Comp1> &c)
395
+ : _map(c._map.begin(), c._map.end()), _value(c._value) {}
396
+
397
+ private:
398
+
399
+ SparseMap& operator=(const SparseMap&);
400
+
401
+ public:
402
+
403
+ ///\e
404
+ Reference operator[](const Key &k) {
405
+ typename Map::iterator it = _map.lower_bound(k);
406
+ if (it != _map.end() && !_map.key_comp()(k, it->first))
407
+ return it->second;
408
+ else
409
+ return _map.insert(it, std::make_pair(k, _value))->second;
410
+ }
411
+
412
+ ///\e
413
+ ConstReference operator[](const Key &k) const {
414
+ typename Map::const_iterator it = _map.find(k);
415
+ if (it != _map.end())
416
+ return it->second;
417
+ else
418
+ return _value;
419
+ }
420
+
421
+ ///\e
422
+ void set(const Key &k, const Value &v) {
423
+ typename Map::iterator it = _map.lower_bound(k);
424
+ if (it != _map.end() && !_map.key_comp()(k, it->first))
425
+ it->second = v;
426
+ else
427
+ _map.insert(it, std::make_pair(k, v));
428
+ }
429
+
430
+ ///\e
431
+ void setAll(const Value &v) {
432
+ _value = v;
433
+ _map.clear();
434
+ }
435
+ };
436
+
437
+ /// Returns a \c SparseMap class
438
+
439
+ /// This function just returns a \c SparseMap class with specified
440
+ /// default value.
441
+ /// \relates SparseMap
442
+ template<typename K, typename V, typename Compare>
443
+ inline SparseMap<K, V, Compare> sparseMap(const V& value = V()) {
444
+ return SparseMap<K, V, Compare>(value);
445
+ }
446
+
447
+ template<typename K, typename V>
448
+ inline SparseMap<K, V, std::less<K> > sparseMap(const V& value = V()) {
449
+ return SparseMap<K, V, std::less<K> >(value);
450
+ }
451
+
452
+ /// \brief Returns a \c SparseMap class created from an appropriate
453
+ /// \c std::map
454
+
455
+ /// This function just returns a \c SparseMap class created from an
456
+ /// appropriate \c std::map.
457
+ /// \relates SparseMap
458
+ template<typename K, typename V, typename Compare>
459
+ inline SparseMap<K, V, Compare>
460
+ sparseMap(const std::map<K, V, Compare> &map, const V& value = V())
461
+ {
462
+ return SparseMap<K, V, Compare>(map, value);
463
+ }
464
+
465
+ /// @}
466
+
467
+ /// \addtogroup map_adaptors
468
+ /// @{
469
+
470
+ /// Composition of two maps
471
+
472
+ /// This \ref concepts::ReadMap "read-only map" returns the
473
+ /// composition of two given maps. That is to say, if \c m1 is of
474
+ /// type \c M1 and \c m2 is of \c M2, then for
475
+ /// \code
476
+ /// ComposeMap<M1, M2> cm(m1,m2);
477
+ /// \endcode
478
+ /// <tt>cm[x]</tt> will be equal to <tt>m1[m2[x]]</tt>.
479
+ ///
480
+ /// The \c Key type of the map is inherited from \c M2 and the
481
+ /// \c Value type is from \c M1.
482
+ /// \c M2::Value must be convertible to \c M1::Key.
483
+ ///
484
+ /// The simplest way of using this map is through the composeMap()
485
+ /// function.
486
+ ///
487
+ /// \sa CombineMap
488
+ template <typename M1, typename M2>
489
+ class ComposeMap : public MapBase<typename M2::Key, typename M1::Value> {
490
+ const M1 &_m1;
491
+ const M2 &_m2;
492
+ public:
493
+ ///\e
494
+ typedef typename M2::Key Key;
495
+ ///\e
496
+ typedef typename M1::Value Value;
497
+
498
+ /// Constructor
499
+ ComposeMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
500
+
501
+ ///\e
502
+ typename MapTraits<M1>::ConstReturnValue
503
+ operator[](const Key &k) const { return _m1[_m2[k]]; }
504
+ };
505
+
506
+ /// Returns a \c ComposeMap class
507
+
508
+ /// This function just returns a \c ComposeMap class.
509
+ ///
510
+ /// If \c m1 and \c m2 are maps and the \c Value type of \c m2 is
511
+ /// convertible to the \c Key of \c m1, then <tt>composeMap(m1,m2)[x]</tt>
512
+ /// will be equal to <tt>m1[m2[x]]</tt>.
513
+ ///
514
+ /// \relates ComposeMap
515
+ template <typename M1, typename M2>
516
+ inline ComposeMap<M1, M2> composeMap(const M1 &m1, const M2 &m2) {
517
+ return ComposeMap<M1, M2>(m1, m2);
518
+ }
519
+
520
+
521
+ /// Combination of two maps using an STL (binary) functor.
522
+
523
+ /// This \ref concepts::ReadMap "read-only map" takes two maps and a
524
+ /// binary functor and returns the combination of the two given maps
525
+ /// using the functor.
526
+ /// That is to say, if \c m1 is of type \c M1 and \c m2 is of \c M2
527
+ /// and \c f is of \c F, then for
528
+ /// \code
529
+ /// CombineMap<M1,M2,F,V> cm(m1,m2,f);
530
+ /// \endcode
531
+ /// <tt>cm[x]</tt> will be equal to <tt>f(m1[x],m2[x])</tt>.
532
+ ///
533
+ /// The \c Key type of the map is inherited from \c M1 (\c M1::Key
534
+ /// must be convertible to \c M2::Key) and the \c Value type is \c V.
535
+ /// \c M2::Value and \c M1::Value must be convertible to the
536
+ /// corresponding input parameter of \c F and the return type of \c F
537
+ /// must be convertible to \c V.
538
+ ///
539
+ /// The simplest way of using this map is through the combineMap()
540
+ /// function.
541
+ ///
542
+ /// \sa ComposeMap
543
+ template<typename M1, typename M2, typename F,
544
+ typename V = typename F::result_type>
545
+ class CombineMap : public MapBase<typename M1::Key, V> {
546
+ const M1 &_m1;
547
+ const M2 &_m2;
548
+ F _f;
549
+ public:
550
+ ///\e
551
+ typedef typename M1::Key Key;
552
+ ///\e
553
+ typedef V Value;
554
+
555
+ /// Constructor
556
+ CombineMap(const M1 &m1, const M2 &m2, const F &f = F())
557
+ : _m1(m1), _m2(m2), _f(f) {}
558
+ ///\e
559
+ Value operator[](const Key &k) const { return _f(_m1[k],_m2[k]); }
560
+ };
561
+
562
+ /// Returns a \c CombineMap class
563
+
564
+ /// This function just returns a \c CombineMap class.
565
+ ///
566
+ /// For example, if \c m1 and \c m2 are both maps with \c double
567
+ /// values, then
568
+ /// \code
569
+ /// combineMap(m1,m2,std::plus<double>())
570
+ /// \endcode
571
+ /// is equivalent to
572
+ /// \code
573
+ /// addMap(m1,m2)
574
+ /// \endcode
575
+ ///
576
+ /// This function is specialized for adaptable binary function
577
+ /// classes and C++ functions.
578
+ ///
579
+ /// \relates CombineMap
580
+ template<typename M1, typename M2, typename F, typename V>
581
+ inline CombineMap<M1, M2, F, V>
582
+ combineMap(const M1 &m1, const M2 &m2, const F &f) {
583
+ return CombineMap<M1, M2, F, V>(m1,m2,f);
584
+ }
585
+
586
+ template<typename M1, typename M2, typename F>
587
+ inline CombineMap<M1, M2, F, typename F::result_type>
588
+ combineMap(const M1 &m1, const M2 &m2, const F &f) {
589
+ return combineMap<M1, M2, F, typename F::result_type>(m1,m2,f);
590
+ }
591
+
592
+ template<typename M1, typename M2, typename K1, typename K2, typename V>
593
+ inline CombineMap<M1, M2, V (*)(K1, K2), V>
594
+ combineMap(const M1 &m1, const M2 &m2, V (*f)(K1, K2)) {
595
+ return combineMap<M1, M2, V (*)(K1, K2), V>(m1,m2,f);
596
+ }
597
+
598
+
599
+ /// Converts an STL style (unary) functor to a map
600
+
601
+ /// This \ref concepts::ReadMap "read-only map" returns the value
602
+ /// of a given functor. Actually, it just wraps the functor and
603
+ /// provides the \c Key and \c Value typedefs.
604
+ ///
605
+ /// Template parameters \c K and \c V will become its \c Key and
606
+ /// \c Value. In most cases they have to be given explicitly because
607
+ /// a functor typically does not provide \c argument_type and
608
+ /// \c result_type typedefs.
609
+ /// Parameter \c F is the type of the used functor.
610
+ ///
611
+ /// The simplest way of using this map is through the functorToMap()
612
+ /// function.
613
+ ///
614
+ /// \sa MapToFunctor
615
+ template<typename F,
616
+ typename K = typename F::argument_type,
617
+ typename V = typename F::result_type>
618
+ class FunctorToMap : public MapBase<K, V> {
619
+ F _f;
620
+ public:
621
+ ///\e
622
+ typedef K Key;
623
+ ///\e
624
+ typedef V Value;
625
+
626
+ /// Constructor
627
+ FunctorToMap(const F &f = F()) : _f(f) {}
628
+ ///\e
629
+ Value operator[](const Key &k) const { return _f(k); }
630
+ };
631
+
632
+ /// Returns a \c FunctorToMap class
633
+
634
+ /// This function just returns a \c FunctorToMap class.
635
+ ///
636
+ /// This function is specialized for adaptable binary function
637
+ /// classes and C++ functions.
638
+ ///
639
+ /// \relates FunctorToMap
640
+ template<typename K, typename V, typename F>
641
+ inline FunctorToMap<F, K, V> functorToMap(const F &f) {
642
+ return FunctorToMap<F, K, V>(f);
643
+ }
644
+
645
+ template <typename F>
646
+ inline FunctorToMap<F, typename F::argument_type, typename F::result_type>
647
+ functorToMap(const F &f)
648
+ {
649
+ return FunctorToMap<F, typename F::argument_type,
650
+ typename F::result_type>(f);
651
+ }
652
+
653
+ template <typename K, typename V>
654
+ inline FunctorToMap<V (*)(K), K, V> functorToMap(V (*f)(K)) {
655
+ return FunctorToMap<V (*)(K), K, V>(f);
656
+ }
657
+
658
+
659
+ /// Converts a map to an STL style (unary) functor
660
+
661
+ /// This class converts a map to an STL style (unary) functor.
662
+ /// That is it provides an <tt>operator()</tt> to read its values.
663
+ ///
664
+ /// For the sake of convenience it also works as a usual
665
+ /// \ref concepts::ReadMap "readable map", i.e. <tt>operator[]</tt>
666
+ /// and the \c Key and \c Value typedefs also exist.
667
+ ///
668
+ /// The simplest way of using this map is through the mapToFunctor()
669
+ /// function.
670
+ ///
671
+ ///\sa FunctorToMap
672
+ template <typename M>
673
+ class MapToFunctor : public MapBase<typename M::Key, typename M::Value> {
674
+ const M &_m;
675
+ public:
676
+ ///\e
677
+ typedef typename M::Key Key;
678
+ ///\e
679
+ typedef typename M::Value Value;
680
+
681
+ typedef typename M::Key argument_type;
682
+ typedef typename M::Value result_type;
683
+
684
+ /// Constructor
685
+ MapToFunctor(const M &m) : _m(m) {}
686
+ ///\e
687
+ Value operator()(const Key &k) const { return _m[k]; }
688
+ ///\e
689
+ Value operator[](const Key &k) const { return _m[k]; }
690
+ };
691
+
692
+ /// Returns a \c MapToFunctor class
693
+
694
+ /// This function just returns a \c MapToFunctor class.
695
+ /// \relates MapToFunctor
696
+ template<typename M>
697
+ inline MapToFunctor<M> mapToFunctor(const M &m) {
698
+ return MapToFunctor<M>(m);
699
+ }
700
+
701
+
702
+ /// \brief Map adaptor to convert the \c Value type of a map to
703
+ /// another type using the default conversion.
704
+
705
+ /// Map adaptor to convert the \c Value type of a \ref concepts::ReadMap
706
+ /// "readable map" to another type using the default conversion.
707
+ /// The \c Key type of it is inherited from \c M and the \c Value
708
+ /// type is \c V.
709
+ /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
710
+ ///
711
+ /// The simplest way of using this map is through the convertMap()
712
+ /// function.
713
+ template <typename M, typename V>
714
+ class ConvertMap : public MapBase<typename M::Key, V> {
715
+ const M &_m;
716
+ public:
717
+ ///\e
718
+ typedef typename M::Key Key;
719
+ ///\e
720
+ typedef V Value;
721
+
722
+ /// Constructor
723
+
724
+ /// Constructor.
725
+ /// \param m The underlying map.
726
+ ConvertMap(const M &m) : _m(m) {}
727
+
728
+ ///\e
729
+ Value operator[](const Key &k) const { return _m[k]; }
730
+ };
731
+
732
+ /// Returns a \c ConvertMap class
733
+
734
+ /// This function just returns a \c ConvertMap class.
735
+ /// \relates ConvertMap
736
+ template<typename V, typename M>
737
+ inline ConvertMap<M, V> convertMap(const M &map) {
738
+ return ConvertMap<M, V>(map);
739
+ }
740
+
741
+
742
+ /// Applies all map setting operations to two maps
743
+
744
+ /// This map has two \ref concepts::WriteMap "writable map" parameters
745
+ /// and each write request will be passed to both of them.
746
+ /// If \c M1 is also \ref concepts::ReadMap "readable", then the read
747
+ /// operations will return the corresponding values of \c M1.
748
+ ///
749
+ /// The \c Key and \c Value types are inherited from \c M1.
750
+ /// The \c Key and \c Value of \c M2 must be convertible from those
751
+ /// of \c M1.
752
+ ///
753
+ /// The simplest way of using this map is through the forkMap()
754
+ /// function.
755
+ template<typename M1, typename M2>
756
+ class ForkMap : public MapBase<typename M1::Key, typename M1::Value> {
757
+ M1 &_m1;
758
+ M2 &_m2;
759
+ public:
760
+ ///\e
761
+ typedef typename M1::Key Key;
762
+ ///\e
763
+ typedef typename M1::Value Value;
764
+
765
+ /// Constructor
766
+ ForkMap(M1 &m1, M2 &m2) : _m1(m1), _m2(m2) {}
767
+ /// Returns the value associated with the given key in the first map.
768
+ Value operator[](const Key &k) const { return _m1[k]; }
769
+ /// Sets the value associated with the given key in both maps.
770
+ void set(const Key &k, const Value &v) { _m1.set(k,v); _m2.set(k,v); }
771
+ };
772
+
773
+ /// Returns a \c ForkMap class
774
+
775
+ /// This function just returns a \c ForkMap class.
776
+ /// \relates ForkMap
777
+ template <typename M1, typename M2>
778
+ inline ForkMap<M1,M2> forkMap(M1 &m1, M2 &m2) {
779
+ return ForkMap<M1,M2>(m1,m2);
780
+ }
781
+
782
+
783
+ /// Sum of two maps
784
+
785
+ /// This \ref concepts::ReadMap "read-only map" returns the sum
786
+ /// of the values of the two given maps.
787
+ /// Its \c Key and \c Value types are inherited from \c M1.
788
+ /// The \c Key and \c Value of \c M2 must be convertible to those of
789
+ /// \c M1.
790
+ ///
791
+ /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
792
+ /// \code
793
+ /// AddMap<M1,M2> am(m1,m2);
794
+ /// \endcode
795
+ /// <tt>am[x]</tt> will be equal to <tt>m1[x]+m2[x]</tt>.
796
+ ///
797
+ /// The simplest way of using this map is through the addMap()
798
+ /// function.
799
+ ///
800
+ /// \sa SubMap, MulMap, DivMap
801
+ /// \sa ShiftMap, ShiftWriteMap
802
+ template<typename M1, typename M2>
803
+ class AddMap : public MapBase<typename M1::Key, typename M1::Value> {
804
+ const M1 &_m1;
805
+ const M2 &_m2;
806
+ public:
807
+ ///\e
808
+ typedef typename M1::Key Key;
809
+ ///\e
810
+ typedef typename M1::Value Value;
811
+
812
+ /// Constructor
813
+ AddMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
814
+ ///\e
815
+ Value operator[](const Key &k) const { return _m1[k]+_m2[k]; }
816
+ };
817
+
818
+ /// Returns an \c AddMap class
819
+
820
+ /// This function just returns an \c AddMap class.
821
+ ///
822
+ /// For example, if \c m1 and \c m2 are both maps with \c double
823
+ /// values, then <tt>addMap(m1,m2)[x]</tt> will be equal to
824
+ /// <tt>m1[x]+m2[x]</tt>.
825
+ ///
826
+ /// \relates AddMap
827
+ template<typename M1, typename M2>
828
+ inline AddMap<M1, M2> addMap(const M1 &m1, const M2 &m2) {
829
+ return AddMap<M1, M2>(m1,m2);
830
+ }
831
+
832
+
833
+ /// Difference of two maps
834
+
835
+ /// This \ref concepts::ReadMap "read-only map" returns the difference
836
+ /// of the values of the two given maps.
837
+ /// Its \c Key and \c Value types are inherited from \c M1.
838
+ /// The \c Key and \c Value of \c M2 must be convertible to those of
839
+ /// \c M1.
840
+ ///
841
+ /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
842
+ /// \code
843
+ /// SubMap<M1,M2> sm(m1,m2);
844
+ /// \endcode
845
+ /// <tt>sm[x]</tt> will be equal to <tt>m1[x]-m2[x]</tt>.
846
+ ///
847
+ /// The simplest way of using this map is through the subMap()
848
+ /// function.
849
+ ///
850
+ /// \sa AddMap, MulMap, DivMap
851
+ template<typename M1, typename M2>
852
+ class SubMap : public MapBase<typename M1::Key, typename M1::Value> {
853
+ const M1 &_m1;
854
+ const M2 &_m2;
855
+ public:
856
+ ///\e
857
+ typedef typename M1::Key Key;
858
+ ///\e
859
+ typedef typename M1::Value Value;
860
+
861
+ /// Constructor
862
+ SubMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
863
+ ///\e
864
+ Value operator[](const Key &k) const { return _m1[k]-_m2[k]; }
865
+ };
866
+
867
+ /// Returns a \c SubMap class
868
+
869
+ /// This function just returns a \c SubMap class.
870
+ ///
871
+ /// For example, if \c m1 and \c m2 are both maps with \c double
872
+ /// values, then <tt>subMap(m1,m2)[x]</tt> will be equal to
873
+ /// <tt>m1[x]-m2[x]</tt>.
874
+ ///
875
+ /// \relates SubMap
876
+ template<typename M1, typename M2>
877
+ inline SubMap<M1, M2> subMap(const M1 &m1, const M2 &m2) {
878
+ return SubMap<M1, M2>(m1,m2);
879
+ }
880
+
881
+
882
+ /// Product of two maps
883
+
884
+ /// This \ref concepts::ReadMap "read-only map" returns the product
885
+ /// of the values of the two given maps.
886
+ /// Its \c Key and \c Value types are inherited from \c M1.
887
+ /// The \c Key and \c Value of \c M2 must be convertible to those of
888
+ /// \c M1.
889
+ ///
890
+ /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
891
+ /// \code
892
+ /// MulMap<M1,M2> mm(m1,m2);
893
+ /// \endcode
894
+ /// <tt>mm[x]</tt> will be equal to <tt>m1[x]*m2[x]</tt>.
895
+ ///
896
+ /// The simplest way of using this map is through the mulMap()
897
+ /// function.
898
+ ///
899
+ /// \sa AddMap, SubMap, DivMap
900
+ /// \sa ScaleMap, ScaleWriteMap
901
+ template<typename M1, typename M2>
902
+ class MulMap : public MapBase<typename M1::Key, typename M1::Value> {
903
+ const M1 &_m1;
904
+ const M2 &_m2;
905
+ public:
906
+ ///\e
907
+ typedef typename M1::Key Key;
908
+ ///\e
909
+ typedef typename M1::Value Value;
910
+
911
+ /// Constructor
912
+ MulMap(const M1 &m1,const M2 &m2) : _m1(m1), _m2(m2) {}
913
+ ///\e
914
+ Value operator[](const Key &k) const { return _m1[k]*_m2[k]; }
915
+ };
916
+
917
+ /// Returns a \c MulMap class
918
+
919
+ /// This function just returns a \c MulMap class.
920
+ ///
921
+ /// For example, if \c m1 and \c m2 are both maps with \c double
922
+ /// values, then <tt>mulMap(m1,m2)[x]</tt> will be equal to
923
+ /// <tt>m1[x]*m2[x]</tt>.
924
+ ///
925
+ /// \relates MulMap
926
+ template<typename M1, typename M2>
927
+ inline MulMap<M1, M2> mulMap(const M1 &m1,const M2 &m2) {
928
+ return MulMap<M1, M2>(m1,m2);
929
+ }
930
+
931
+
932
+ /// Quotient of two maps
933
+
934
+ /// This \ref concepts::ReadMap "read-only map" returns the quotient
935
+ /// of the values of the two given maps.
936
+ /// Its \c Key and \c Value types are inherited from \c M1.
937
+ /// The \c Key and \c Value of \c M2 must be convertible to those of
938
+ /// \c M1.
939
+ ///
940
+ /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
941
+ /// \code
942
+ /// DivMap<M1,M2> dm(m1,m2);
943
+ /// \endcode
944
+ /// <tt>dm[x]</tt> will be equal to <tt>m1[x]/m2[x]</tt>.
945
+ ///
946
+ /// The simplest way of using this map is through the divMap()
947
+ /// function.
948
+ ///
949
+ /// \sa AddMap, SubMap, MulMap
950
+ template<typename M1, typename M2>
951
+ class DivMap : public MapBase<typename M1::Key, typename M1::Value> {
952
+ const M1 &_m1;
953
+ const M2 &_m2;
954
+ public:
955
+ ///\e
956
+ typedef typename M1::Key Key;
957
+ ///\e
958
+ typedef typename M1::Value Value;
959
+
960
+ /// Constructor
961
+ DivMap(const M1 &m1,const M2 &m2) : _m1(m1), _m2(m2) {}
962
+ ///\e
963
+ Value operator[](const Key &k) const { return _m1[k]/_m2[k]; }
964
+ };
965
+
966
+ /// Returns a \c DivMap class
967
+
968
+ /// This function just returns a \c DivMap class.
969
+ ///
970
+ /// For example, if \c m1 and \c m2 are both maps with \c double
971
+ /// values, then <tt>divMap(m1,m2)[x]</tt> will be equal to
972
+ /// <tt>m1[x]/m2[x]</tt>.
973
+ ///
974
+ /// \relates DivMap
975
+ template<typename M1, typename M2>
976
+ inline DivMap<M1, M2> divMap(const M1 &m1,const M2 &m2) {
977
+ return DivMap<M1, M2>(m1,m2);
978
+ }
979
+
980
+
981
+ /// Shifts a map with a constant.
982
+
983
+ /// This \ref concepts::ReadMap "read-only map" returns the sum of
984
+ /// the given map and a constant value (i.e. it shifts the map with
985
+ /// the constant). Its \c Key and \c Value are inherited from \c M.
986
+ ///
987
+ /// Actually,
988
+ /// \code
989
+ /// ShiftMap<M> sh(m,v);
990
+ /// \endcode
991
+ /// is equivalent to
992
+ /// \code
993
+ /// ConstMap<M::Key, M::Value> cm(v);
994
+ /// AddMap<M, ConstMap<M::Key, M::Value> > sh(m,cm);
995
+ /// \endcode
996
+ ///
997
+ /// The simplest way of using this map is through the shiftMap()
998
+ /// function.
999
+ ///
1000
+ /// \sa ShiftWriteMap
1001
+ template<typename M, typename C = typename M::Value>
1002
+ class ShiftMap : public MapBase<typename M::Key, typename M::Value> {
1003
+ const M &_m;
1004
+ C _v;
1005
+ public:
1006
+ ///\e
1007
+ typedef typename M::Key Key;
1008
+ ///\e
1009
+ typedef typename M::Value Value;
1010
+
1011
+ /// Constructor
1012
+
1013
+ /// Constructor.
1014
+ /// \param m The undelying map.
1015
+ /// \param v The constant value.
1016
+ ShiftMap(const M &m, const C &v) : _m(m), _v(v) {}
1017
+ ///\e
1018
+ Value operator[](const Key &k) const { return _m[k]+_v; }
1019
+ };
1020
+
1021
+ /// Shifts a map with a constant (read-write version).
1022
+
1023
+ /// This \ref concepts::ReadWriteMap "read-write map" returns the sum
1024
+ /// of the given map and a constant value (i.e. it shifts the map with
1025
+ /// the constant). Its \c Key and \c Value are inherited from \c M.
1026
+ /// It makes also possible to write the map.
1027
+ ///
1028
+ /// The simplest way of using this map is through the shiftWriteMap()
1029
+ /// function.
1030
+ ///
1031
+ /// \sa ShiftMap
1032
+ template<typename M, typename C = typename M::Value>
1033
+ class ShiftWriteMap : public MapBase<typename M::Key, typename M::Value> {
1034
+ M &_m;
1035
+ C _v;
1036
+ public:
1037
+ ///\e
1038
+ typedef typename M::Key Key;
1039
+ ///\e
1040
+ typedef typename M::Value Value;
1041
+
1042
+ /// Constructor
1043
+
1044
+ /// Constructor.
1045
+ /// \param m The undelying map.
1046
+ /// \param v The constant value.
1047
+ ShiftWriteMap(M &m, const C &v) : _m(m), _v(v) {}
1048
+ ///\e
1049
+ Value operator[](const Key &k) const { return _m[k]+_v; }
1050
+ ///\e
1051
+ void set(const Key &k, const Value &v) { _m.set(k, v-_v); }
1052
+ };
1053
+
1054
+ /// Returns a \c ShiftMap class
1055
+
1056
+ /// This function just returns a \c ShiftMap class.
1057
+ ///
1058
+ /// For example, if \c m is a map with \c double values and \c v is
1059
+ /// \c double, then <tt>shiftMap(m,v)[x]</tt> will be equal to
1060
+ /// <tt>m[x]+v</tt>.
1061
+ ///
1062
+ /// \relates ShiftMap
1063
+ template<typename M, typename C>
1064
+ inline ShiftMap<M, C> shiftMap(const M &m, const C &v) {
1065
+ return ShiftMap<M, C>(m,v);
1066
+ }
1067
+
1068
+ /// Returns a \c ShiftWriteMap class
1069
+
1070
+ /// This function just returns a \c ShiftWriteMap class.
1071
+ ///
1072
+ /// For example, if \c m is a map with \c double values and \c v is
1073
+ /// \c double, then <tt>shiftWriteMap(m,v)[x]</tt> will be equal to
1074
+ /// <tt>m[x]+v</tt>.
1075
+ /// Moreover it makes also possible to write the map.
1076
+ ///
1077
+ /// \relates ShiftWriteMap
1078
+ template<typename M, typename C>
1079
+ inline ShiftWriteMap<M, C> shiftWriteMap(M &m, const C &v) {
1080
+ return ShiftWriteMap<M, C>(m,v);
1081
+ }
1082
+
1083
+
1084
+ /// Scales a map with a constant.
1085
+
1086
+ /// This \ref concepts::ReadMap "read-only map" returns the value of
1087
+ /// the given map multiplied from the left side with a constant value.
1088
+ /// Its \c Key and \c Value are inherited from \c M.
1089
+ ///
1090
+ /// Actually,
1091
+ /// \code
1092
+ /// ScaleMap<M> sc(m,v);
1093
+ /// \endcode
1094
+ /// is equivalent to
1095
+ /// \code
1096
+ /// ConstMap<M::Key, M::Value> cm(v);
1097
+ /// MulMap<ConstMap<M::Key, M::Value>, M> sc(cm,m);
1098
+ /// \endcode
1099
+ ///
1100
+ /// The simplest way of using this map is through the scaleMap()
1101
+ /// function.
1102
+ ///
1103
+ /// \sa ScaleWriteMap
1104
+ template<typename M, typename C = typename M::Value>
1105
+ class ScaleMap : public MapBase<typename M::Key, typename M::Value> {
1106
+ const M &_m;
1107
+ C _v;
1108
+ public:
1109
+ ///\e
1110
+ typedef typename M::Key Key;
1111
+ ///\e
1112
+ typedef typename M::Value Value;
1113
+
1114
+ /// Constructor
1115
+
1116
+ /// Constructor.
1117
+ /// \param m The undelying map.
1118
+ /// \param v The constant value.
1119
+ ScaleMap(const M &m, const C &v) : _m(m), _v(v) {}
1120
+ ///\e
1121
+ Value operator[](const Key &k) const { return _v*_m[k]; }
1122
+ };
1123
+
1124
+ /// Scales a map with a constant (read-write version).
1125
+
1126
+ /// This \ref concepts::ReadWriteMap "read-write map" returns the value of
1127
+ /// the given map multiplied from the left side with a constant value.
1128
+ /// Its \c Key and \c Value are inherited from \c M.
1129
+ /// It can also be used as write map if the \c / operator is defined
1130
+ /// between \c Value and \c C and the given multiplier is not zero.
1131
+ ///
1132
+ /// The simplest way of using this map is through the scaleWriteMap()
1133
+ /// function.
1134
+ ///
1135
+ /// \sa ScaleMap
1136
+ template<typename M, typename C = typename M::Value>
1137
+ class ScaleWriteMap : public MapBase<typename M::Key, typename M::Value> {
1138
+ M &_m;
1139
+ C _v;
1140
+ public:
1141
+ ///\e
1142
+ typedef typename M::Key Key;
1143
+ ///\e
1144
+ typedef typename M::Value Value;
1145
+
1146
+ /// Constructor
1147
+
1148
+ /// Constructor.
1149
+ /// \param m The undelying map.
1150
+ /// \param v The constant value.
1151
+ ScaleWriteMap(M &m, const C &v) : _m(m), _v(v) {}
1152
+ ///\e
1153
+ Value operator[](const Key &k) const { return _v*_m[k]; }
1154
+ ///\e
1155
+ void set(const Key &k, const Value &v) { _m.set(k, v/_v); }
1156
+ };
1157
+
1158
+ /// Returns a \c ScaleMap class
1159
+
1160
+ /// This function just returns a \c ScaleMap class.
1161
+ ///
1162
+ /// For example, if \c m is a map with \c double values and \c v is
1163
+ /// \c double, then <tt>scaleMap(m,v)[x]</tt> will be equal to
1164
+ /// <tt>v*m[x]</tt>.
1165
+ ///
1166
+ /// \relates ScaleMap
1167
+ template<typename M, typename C>
1168
+ inline ScaleMap<M, C> scaleMap(const M &m, const C &v) {
1169
+ return ScaleMap<M, C>(m,v);
1170
+ }
1171
+
1172
+ /// Returns a \c ScaleWriteMap class
1173
+
1174
+ /// This function just returns a \c ScaleWriteMap class.
1175
+ ///
1176
+ /// For example, if \c m is a map with \c double values and \c v is
1177
+ /// \c double, then <tt>scaleWriteMap(m,v)[x]</tt> will be equal to
1178
+ /// <tt>v*m[x]</tt>.
1179
+ /// Moreover it makes also possible to write the map.
1180
+ ///
1181
+ /// \relates ScaleWriteMap
1182
+ template<typename M, typename C>
1183
+ inline ScaleWriteMap<M, C> scaleWriteMap(M &m, const C &v) {
1184
+ return ScaleWriteMap<M, C>(m,v);
1185
+ }
1186
+
1187
+
1188
+ /// Negative of a map
1189
+
1190
+ /// This \ref concepts::ReadMap "read-only map" returns the negative
1191
+ /// of the values of the given map (using the unary \c - operator).
1192
+ /// Its \c Key and \c Value are inherited from \c M.
1193
+ ///
1194
+ /// If M::Value is \c int, \c double etc., then
1195
+ /// \code
1196
+ /// NegMap<M> neg(m);
1197
+ /// \endcode
1198
+ /// is equivalent to
1199
+ /// \code
1200
+ /// ScaleMap<M> neg(m,-1);
1201
+ /// \endcode
1202
+ ///
1203
+ /// The simplest way of using this map is through the negMap()
1204
+ /// function.
1205
+ ///
1206
+ /// \sa NegWriteMap
1207
+ template<typename M>
1208
+ class NegMap : public MapBase<typename M::Key, typename M::Value> {
1209
+ const M& _m;
1210
+ public:
1211
+ ///\e
1212
+ typedef typename M::Key Key;
1213
+ ///\e
1214
+ typedef typename M::Value Value;
1215
+
1216
+ /// Constructor
1217
+ NegMap(const M &m) : _m(m) {}
1218
+ ///\e
1219
+ Value operator[](const Key &k) const { return -_m[k]; }
1220
+ };
1221
+
1222
+ /// Negative of a map (read-write version)
1223
+
1224
+ /// This \ref concepts::ReadWriteMap "read-write map" returns the
1225
+ /// negative of the values of the given map (using the unary \c -
1226
+ /// operator).
1227
+ /// Its \c Key and \c Value are inherited from \c M.
1228
+ /// It makes also possible to write the map.
1229
+ ///
1230
+ /// If M::Value is \c int, \c double etc., then
1231
+ /// \code
1232
+ /// NegWriteMap<M> neg(m);
1233
+ /// \endcode
1234
+ /// is equivalent to
1235
+ /// \code
1236
+ /// ScaleWriteMap<M> neg(m,-1);
1237
+ /// \endcode
1238
+ ///
1239
+ /// The simplest way of using this map is through the negWriteMap()
1240
+ /// function.
1241
+ ///
1242
+ /// \sa NegMap
1243
+ template<typename M>
1244
+ class NegWriteMap : public MapBase<typename M::Key, typename M::Value> {
1245
+ M &_m;
1246
+ public:
1247
+ ///\e
1248
+ typedef typename M::Key Key;
1249
+ ///\e
1250
+ typedef typename M::Value Value;
1251
+
1252
+ /// Constructor
1253
+ NegWriteMap(M &m) : _m(m) {}
1254
+ ///\e
1255
+ Value operator[](const Key &k) const { return -_m[k]; }
1256
+ ///\e
1257
+ void set(const Key &k, const Value &v) { _m.set(k, -v); }
1258
+ };
1259
+
1260
+ /// Returns a \c NegMap class
1261
+
1262
+ /// This function just returns a \c NegMap class.
1263
+ ///
1264
+ /// For example, if \c m is a map with \c double values, then
1265
+ /// <tt>negMap(m)[x]</tt> will be equal to <tt>-m[x]</tt>.
1266
+ ///
1267
+ /// \relates NegMap
1268
+ template <typename M>
1269
+ inline NegMap<M> negMap(const M &m) {
1270
+ return NegMap<M>(m);
1271
+ }
1272
+
1273
+ /// Returns a \c NegWriteMap class
1274
+
1275
+ /// This function just returns a \c NegWriteMap class.
1276
+ ///
1277
+ /// For example, if \c m is a map with \c double values, then
1278
+ /// <tt>negWriteMap(m)[x]</tt> will be equal to <tt>-m[x]</tt>.
1279
+ /// Moreover it makes also possible to write the map.
1280
+ ///
1281
+ /// \relates NegWriteMap
1282
+ template <typename M>
1283
+ inline NegWriteMap<M> negWriteMap(M &m) {
1284
+ return NegWriteMap<M>(m);
1285
+ }
1286
+
1287
+
1288
+ /// Absolute value of a map
1289
+
1290
+ /// This \ref concepts::ReadMap "read-only map" returns the absolute
1291
+ /// value of the values of the given map.
1292
+ /// Its \c Key and \c Value are inherited from \c M.
1293
+ /// \c Value must be comparable to \c 0 and the unary \c -
1294
+ /// operator must be defined for it, of course.
1295
+ ///
1296
+ /// The simplest way of using this map is through the absMap()
1297
+ /// function.
1298
+ template<typename M>
1299
+ class AbsMap : public MapBase<typename M::Key, typename M::Value> {
1300
+ const M &_m;
1301
+ public:
1302
+ ///\e
1303
+ typedef typename M::Key Key;
1304
+ ///\e
1305
+ typedef typename M::Value Value;
1306
+
1307
+ /// Constructor
1308
+ AbsMap(const M &m) : _m(m) {}
1309
+ ///\e
1310
+ Value operator[](const Key &k) const {
1311
+ Value tmp = _m[k];
1312
+ return tmp >= 0 ? tmp : -tmp;
1313
+ }
1314
+
1315
+ };
1316
+
1317
+ /// Returns an \c AbsMap class
1318
+
1319
+ /// This function just returns an \c AbsMap class.
1320
+ ///
1321
+ /// For example, if \c m is a map with \c double values, then
1322
+ /// <tt>absMap(m)[x]</tt> will be equal to <tt>m[x]</tt> if
1323
+ /// it is positive or zero and <tt>-m[x]</tt> if <tt>m[x]</tt> is
1324
+ /// negative.
1325
+ ///
1326
+ /// \relates AbsMap
1327
+ template<typename M>
1328
+ inline AbsMap<M> absMap(const M &m) {
1329
+ return AbsMap<M>(m);
1330
+ }
1331
+
1332
+ /// @}
1333
+
1334
+ // Logical maps and map adaptors:
1335
+
1336
+ /// \addtogroup maps
1337
+ /// @{
1338
+
1339
+ /// Constant \c true map.
1340
+
1341
+ /// This \ref concepts::ReadMap "read-only map" assigns \c true to
1342
+ /// each key.
1343
+ ///
1344
+ /// Note that
1345
+ /// \code
1346
+ /// TrueMap<K> tm;
1347
+ /// \endcode
1348
+ /// is equivalent to
1349
+ /// \code
1350
+ /// ConstMap<K,bool> tm(true);
1351
+ /// \endcode
1352
+ ///
1353
+ /// \sa FalseMap
1354
+ /// \sa ConstMap
1355
+ template <typename K>
1356
+ class TrueMap : public MapBase<K, bool> {
1357
+ public:
1358
+ ///\e
1359
+ typedef K Key;
1360
+ ///\e
1361
+ typedef bool Value;
1362
+
1363
+ /// Gives back \c true.
1364
+ Value operator[](const Key&) const { return true; }
1365
+ };
1366
+
1367
+ /// Returns a \c TrueMap class
1368
+
1369
+ /// This function just returns a \c TrueMap class.
1370
+ /// \relates TrueMap
1371
+ template<typename K>
1372
+ inline TrueMap<K> trueMap() {
1373
+ return TrueMap<K>();
1374
+ }
1375
+
1376
+
1377
+ /// Constant \c false map.
1378
+
1379
+ /// This \ref concepts::ReadMap "read-only map" assigns \c false to
1380
+ /// each key.
1381
+ ///
1382
+ /// Note that
1383
+ /// \code
1384
+ /// FalseMap<K> fm;
1385
+ /// \endcode
1386
+ /// is equivalent to
1387
+ /// \code
1388
+ /// ConstMap<K,bool> fm(false);
1389
+ /// \endcode
1390
+ ///
1391
+ /// \sa TrueMap
1392
+ /// \sa ConstMap
1393
+ template <typename K>
1394
+ class FalseMap : public MapBase<K, bool> {
1395
+ public:
1396
+ ///\e
1397
+ typedef K Key;
1398
+ ///\e
1399
+ typedef bool Value;
1400
+
1401
+ /// Gives back \c false.
1402
+ Value operator[](const Key&) const { return false; }
1403
+ };
1404
+
1405
+ /// Returns a \c FalseMap class
1406
+
1407
+ /// This function just returns a \c FalseMap class.
1408
+ /// \relates FalseMap
1409
+ template<typename K>
1410
+ inline FalseMap<K> falseMap() {
1411
+ return FalseMap<K>();
1412
+ }
1413
+
1414
+ /// @}
1415
+
1416
+ /// \addtogroup map_adaptors
1417
+ /// @{
1418
+
1419
+ /// Logical 'and' of two maps
1420
+
1421
+ /// This \ref concepts::ReadMap "read-only map" returns the logical
1422
+ /// 'and' of the values of the two given maps.
1423
+ /// Its \c Key type is inherited from \c M1 and its \c Value type is
1424
+ /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1425
+ ///
1426
+ /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1427
+ /// \code
1428
+ /// AndMap<M1,M2> am(m1,m2);
1429
+ /// \endcode
1430
+ /// <tt>am[x]</tt> will be equal to <tt>m1[x]&&m2[x]</tt>.
1431
+ ///
1432
+ /// The simplest way of using this map is through the andMap()
1433
+ /// function.
1434
+ ///
1435
+ /// \sa OrMap
1436
+ /// \sa NotMap, NotWriteMap
1437
+ template<typename M1, typename M2>
1438
+ class AndMap : public MapBase<typename M1::Key, bool> {
1439
+ const M1 &_m1;
1440
+ const M2 &_m2;
1441
+ public:
1442
+ ///\e
1443
+ typedef typename M1::Key Key;
1444
+ ///\e
1445
+ typedef bool Value;
1446
+
1447
+ /// Constructor
1448
+ AndMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1449
+ ///\e
1450
+ Value operator[](const Key &k) const { return _m1[k]&&_m2[k]; }
1451
+ };
1452
+
1453
+ /// Returns an \c AndMap class
1454
+
1455
+ /// This function just returns an \c AndMap class.
1456
+ ///
1457
+ /// For example, if \c m1 and \c m2 are both maps with \c bool values,
1458
+ /// then <tt>andMap(m1,m2)[x]</tt> will be equal to
1459
+ /// <tt>m1[x]&&m2[x]</tt>.
1460
+ ///
1461
+ /// \relates AndMap
1462
+ template<typename M1, typename M2>
1463
+ inline AndMap<M1, M2> andMap(const M1 &m1, const M2 &m2) {
1464
+ return AndMap<M1, M2>(m1,m2);
1465
+ }
1466
+
1467
+
1468
+ /// Logical 'or' of two maps
1469
+
1470
+ /// This \ref concepts::ReadMap "read-only map" returns the logical
1471
+ /// 'or' of the values of the two given maps.
1472
+ /// Its \c Key type is inherited from \c M1 and its \c Value type is
1473
+ /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1474
+ ///
1475
+ /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1476
+ /// \code
1477
+ /// OrMap<M1,M2> om(m1,m2);
1478
+ /// \endcode
1479
+ /// <tt>om[x]</tt> will be equal to <tt>m1[x]||m2[x]</tt>.
1480
+ ///
1481
+ /// The simplest way of using this map is through the orMap()
1482
+ /// function.
1483
+ ///
1484
+ /// \sa AndMap
1485
+ /// \sa NotMap, NotWriteMap
1486
+ template<typename M1, typename M2>
1487
+ class OrMap : public MapBase<typename M1::Key, bool> {
1488
+ const M1 &_m1;
1489
+ const M2 &_m2;
1490
+ public:
1491
+ ///\e
1492
+ typedef typename M1::Key Key;
1493
+ ///\e
1494
+ typedef bool Value;
1495
+
1496
+ /// Constructor
1497
+ OrMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1498
+ ///\e
1499
+ Value operator[](const Key &k) const { return _m1[k]||_m2[k]; }
1500
+ };
1501
+
1502
+ /// Returns an \c OrMap class
1503
+
1504
+ /// This function just returns an \c OrMap class.
1505
+ ///
1506
+ /// For example, if \c m1 and \c m2 are both maps with \c bool values,
1507
+ /// then <tt>orMap(m1,m2)[x]</tt> will be equal to
1508
+ /// <tt>m1[x]||m2[x]</tt>.
1509
+ ///
1510
+ /// \relates OrMap
1511
+ template<typename M1, typename M2>
1512
+ inline OrMap<M1, M2> orMap(const M1 &m1, const M2 &m2) {
1513
+ return OrMap<M1, M2>(m1,m2);
1514
+ }
1515
+
1516
+
1517
+ /// Logical 'not' of a map
1518
+
1519
+ /// This \ref concepts::ReadMap "read-only map" returns the logical
1520
+ /// negation of the values of the given map.
1521
+ /// Its \c Key is inherited from \c M and its \c Value is \c bool.
1522
+ ///
1523
+ /// The simplest way of using this map is through the notMap()
1524
+ /// function.
1525
+ ///
1526
+ /// \sa NotWriteMap
1527
+ template <typename M>
1528
+ class NotMap : public MapBase<typename M::Key, bool> {
1529
+ const M &_m;
1530
+ public:
1531
+ ///\e
1532
+ typedef typename M::Key Key;
1533
+ ///\e
1534
+ typedef bool Value;
1535
+
1536
+ /// Constructor
1537
+ NotMap(const M &m) : _m(m) {}
1538
+ ///\e
1539
+ Value operator[](const Key &k) const { return !_m[k]; }
1540
+ };
1541
+
1542
+ /// Logical 'not' of a map (read-write version)
1543
+
1544
+ /// This \ref concepts::ReadWriteMap "read-write map" returns the
1545
+ /// logical negation of the values of the given map.
1546
+ /// Its \c Key is inherited from \c M and its \c Value is \c bool.
1547
+ /// It makes also possible to write the map. When a value is set,
1548
+ /// the opposite value is set to the original map.
1549
+ ///
1550
+ /// The simplest way of using this map is through the notWriteMap()
1551
+ /// function.
1552
+ ///
1553
+ /// \sa NotMap
1554
+ template <typename M>
1555
+ class NotWriteMap : public MapBase<typename M::Key, bool> {
1556
+ M &_m;
1557
+ public:
1558
+ ///\e
1559
+ typedef typename M::Key Key;
1560
+ ///\e
1561
+ typedef bool Value;
1562
+
1563
+ /// Constructor
1564
+ NotWriteMap(M &m) : _m(m) {}
1565
+ ///\e
1566
+ Value operator[](const Key &k) const { return !_m[k]; }
1567
+ ///\e
1568
+ void set(const Key &k, bool v) { _m.set(k, !v); }
1569
+ };
1570
+
1571
+ /// Returns a \c NotMap class
1572
+
1573
+ /// This function just returns a \c NotMap class.
1574
+ ///
1575
+ /// For example, if \c m is a map with \c bool values, then
1576
+ /// <tt>notMap(m)[x]</tt> will be equal to <tt>!m[x]</tt>.
1577
+ ///
1578
+ /// \relates NotMap
1579
+ template <typename M>
1580
+ inline NotMap<M> notMap(const M &m) {
1581
+ return NotMap<M>(m);
1582
+ }
1583
+
1584
+ /// Returns a \c NotWriteMap class
1585
+
1586
+ /// This function just returns a \c NotWriteMap class.
1587
+ ///
1588
+ /// For example, if \c m is a map with \c bool values, then
1589
+ /// <tt>notWriteMap(m)[x]</tt> will be equal to <tt>!m[x]</tt>.
1590
+ /// Moreover it makes also possible to write the map.
1591
+ ///
1592
+ /// \relates NotWriteMap
1593
+ template <typename M>
1594
+ inline NotWriteMap<M> notWriteMap(M &m) {
1595
+ return NotWriteMap<M>(m);
1596
+ }
1597
+
1598
+
1599
+ /// Combination of two maps using the \c == operator
1600
+
1601
+ /// This \ref concepts::ReadMap "read-only map" assigns \c true to
1602
+ /// the keys for which the corresponding values of the two maps are
1603
+ /// equal.
1604
+ /// Its \c Key type is inherited from \c M1 and its \c Value type is
1605
+ /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1606
+ ///
1607
+ /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1608
+ /// \code
1609
+ /// EqualMap<M1,M2> em(m1,m2);
1610
+ /// \endcode
1611
+ /// <tt>em[x]</tt> will be equal to <tt>m1[x]==m2[x]</tt>.
1612
+ ///
1613
+ /// The simplest way of using this map is through the equalMap()
1614
+ /// function.
1615
+ ///
1616
+ /// \sa LessMap
1617
+ template<typename M1, typename M2>
1618
+ class EqualMap : public MapBase<typename M1::Key, bool> {
1619
+ const M1 &_m1;
1620
+ const M2 &_m2;
1621
+ public:
1622
+ ///\e
1623
+ typedef typename M1::Key Key;
1624
+ ///\e
1625
+ typedef bool Value;
1626
+
1627
+ /// Constructor
1628
+ EqualMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1629
+ ///\e
1630
+ Value operator[](const Key &k) const { return _m1[k]==_m2[k]; }
1631
+ };
1632
+
1633
+ /// Returns an \c EqualMap class
1634
+
1635
+ /// This function just returns an \c EqualMap class.
1636
+ ///
1637
+ /// For example, if \c m1 and \c m2 are maps with keys and values of
1638
+ /// the same type, then <tt>equalMap(m1,m2)[x]</tt> will be equal to
1639
+ /// <tt>m1[x]==m2[x]</tt>.
1640
+ ///
1641
+ /// \relates EqualMap
1642
+ template<typename M1, typename M2>
1643
+ inline EqualMap<M1, M2> equalMap(const M1 &m1, const M2 &m2) {
1644
+ return EqualMap<M1, M2>(m1,m2);
1645
+ }
1646
+
1647
+
1648
+ /// Combination of two maps using the \c < operator
1649
+
1650
+ /// This \ref concepts::ReadMap "read-only map" assigns \c true to
1651
+ /// the keys for which the corresponding value of the first map is
1652
+ /// less then the value of the second map.
1653
+ /// Its \c Key type is inherited from \c M1 and its \c Value type is
1654
+ /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1655
+ ///
1656
+ /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1657
+ /// \code
1658
+ /// LessMap<M1,M2> lm(m1,m2);
1659
+ /// \endcode
1660
+ /// <tt>lm[x]</tt> will be equal to <tt>m1[x]<m2[x]</tt>.
1661
+ ///
1662
+ /// The simplest way of using this map is through the lessMap()
1663
+ /// function.
1664
+ ///
1665
+ /// \sa EqualMap
1666
+ template<typename M1, typename M2>
1667
+ class LessMap : public MapBase<typename M1::Key, bool> {
1668
+ const M1 &_m1;
1669
+ const M2 &_m2;
1670
+ public:
1671
+ ///\e
1672
+ typedef typename M1::Key Key;
1673
+ ///\e
1674
+ typedef bool Value;
1675
+
1676
+ /// Constructor
1677
+ LessMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1678
+ ///\e
1679
+ Value operator[](const Key &k) const { return _m1[k]<_m2[k]; }
1680
+ };
1681
+
1682
+ /// Returns an \c LessMap class
1683
+
1684
+ /// This function just returns an \c LessMap class.
1685
+ ///
1686
+ /// For example, if \c m1 and \c m2 are maps with keys and values of
1687
+ /// the same type, then <tt>lessMap(m1,m2)[x]</tt> will be equal to
1688
+ /// <tt>m1[x]<m2[x]</tt>.
1689
+ ///
1690
+ /// \relates LessMap
1691
+ template<typename M1, typename M2>
1692
+ inline LessMap<M1, M2> lessMap(const M1 &m1, const M2 &m2) {
1693
+ return LessMap<M1, M2>(m1,m2);
1694
+ }
1695
+
1696
+ namespace _maps_bits {
1697
+
1698
+ template <typename _Iterator, typename Enable = void>
1699
+ struct IteratorTraits {
1700
+ typedef typename std::iterator_traits<_Iterator>::value_type Value;
1701
+ };
1702
+
1703
+ template <typename _Iterator>
1704
+ struct IteratorTraits<_Iterator,
1705
+ typename exists<typename _Iterator::container_type>::type>
1706
+ {
1707
+ typedef typename _Iterator::container_type::value_type Value;
1708
+ };
1709
+
1710
+ }
1711
+
1712
+ /// @}
1713
+
1714
+ /// \addtogroup maps
1715
+ /// @{
1716
+
1717
+ /// \brief Writable bool map for logging each \c true assigned element
1718
+ ///
1719
+ /// A \ref concepts::WriteMap "writable" bool map for logging
1720
+ /// each \c true assigned element, i.e it copies subsequently each
1721
+ /// keys set to \c true to the given iterator.
1722
+ /// The most important usage of it is storing certain nodes or arcs
1723
+ /// that were marked \c true by an algorithm.
1724
+ ///
1725
+ /// There are several algorithms that provide solutions through bool
1726
+ /// maps and most of them assign \c true at most once for each key.
1727
+ /// In these cases it is a natural request to store each \c true
1728
+ /// assigned elements (in order of the assignment), which can be
1729
+ /// easily done with LoggerBoolMap.
1730
+ ///
1731
+ /// The simplest way of using this map is through the loggerBoolMap()
1732
+ /// function.
1733
+ ///
1734
+ /// \tparam IT The type of the iterator.
1735
+ /// \tparam KEY The key type of the map. The default value set
1736
+ /// according to the iterator type should work in most cases.
1737
+ ///
1738
+ /// \note The container of the iterator must contain enough space
1739
+ /// for the elements or the iterator should be an inserter iterator.
1740
+ #ifdef DOXYGEN
1741
+ template <typename IT, typename KEY>
1742
+ #else
1743
+ template <typename IT,
1744
+ typename KEY = typename _maps_bits::IteratorTraits<IT>::Value>
1745
+ #endif
1746
+ class LoggerBoolMap : public MapBase<KEY, bool> {
1747
+ public:
1748
+
1749
+ ///\e
1750
+ typedef KEY Key;
1751
+ ///\e
1752
+ typedef bool Value;
1753
+ ///\e
1754
+ typedef IT Iterator;
1755
+
1756
+ /// Constructor
1757
+ LoggerBoolMap(Iterator it)
1758
+ : _begin(it), _end(it) {}
1759
+
1760
+ /// Gives back the given iterator set for the first key
1761
+ Iterator begin() const {
1762
+ return _begin;
1763
+ }
1764
+
1765
+ /// Gives back the the 'after the last' iterator
1766
+ Iterator end() const {
1767
+ return _end;
1768
+ }
1769
+
1770
+ /// The set function of the map
1771
+ void set(const Key& key, Value value) {
1772
+ if (value) {
1773
+ *_end++ = key;
1774
+ }
1775
+ }
1776
+
1777
+ private:
1778
+ Iterator _begin;
1779
+ Iterator _end;
1780
+ };
1781
+
1782
+ /// Returns a \c LoggerBoolMap class
1783
+
1784
+ /// This function just returns a \c LoggerBoolMap class.
1785
+ ///
1786
+ /// The most important usage of it is storing certain nodes or arcs
1787
+ /// that were marked \c true by an algorithm.
1788
+ /// For example, it makes easier to store the nodes in the processing
1789
+ /// order of Dfs algorithm, as the following examples show.
1790
+ /// \code
1791
+ /// std::vector<Node> v;
1792
+ /// dfs(g).processedMap(loggerBoolMap(std::back_inserter(v))).run(s);
1793
+ /// \endcode
1794
+ /// \code
1795
+ /// std::vector<Node> v(countNodes(g));
1796
+ /// dfs(g).processedMap(loggerBoolMap(v.begin())).run(s);
1797
+ /// \endcode
1798
+ ///
1799
+ /// \note The container of the iterator must contain enough space
1800
+ /// for the elements or the iterator should be an inserter iterator.
1801
+ ///
1802
+ /// \note LoggerBoolMap is just \ref concepts::WriteMap "writable", so
1803
+ /// it cannot be used when a readable map is needed, for example, as
1804
+ /// \c ReachedMap for \c Bfs, \c Dfs and \c Dijkstra algorithms.
1805
+ ///
1806
+ /// \relates LoggerBoolMap
1807
+ template<typename Iterator>
1808
+ inline LoggerBoolMap<Iterator> loggerBoolMap(Iterator it) {
1809
+ return LoggerBoolMap<Iterator>(it);
1810
+ }
1811
+
1812
+ /// @}
1813
+
1814
+ /// \addtogroup graph_maps
1815
+ /// @{
1816
+
1817
+ /// \brief Provides an immutable and unique id for each item in a graph.
1818
+ ///
1819
+ /// IdMap provides a unique and immutable id for each item of the
1820
+ /// same type (\c Node, \c Arc or \c Edge) in a graph. This id is
1821
+ /// - \b unique: different items get different ids,
1822
+ /// - \b immutable: the id of an item does not change (even if you
1823
+ /// delete other nodes).
1824
+ ///
1825
+ /// Using this map you get access (i.e. can read) the inner id values of
1826
+ /// the items stored in the graph, which is returned by the \c id()
1827
+ /// function of the graph. This map can be inverted with its member
1828
+ /// class \c InverseMap or with the \c operator()() member.
1829
+ ///
1830
+ /// \tparam GR The graph type.
1831
+ /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
1832
+ /// \c GR::Edge).
1833
+ ///
1834
+ /// \see RangeIdMap
1835
+ template <typename GR, typename K>
1836
+ class IdMap : public MapBase<K, int> {
1837
+ public:
1838
+ /// The graph type of IdMap.
1839
+ typedef GR Graph;
1840
+ typedef GR Digraph;
1841
+ /// The key type of IdMap (\c Node, \c Arc or \c Edge).
1842
+ typedef K Item;
1843
+ /// The key type of IdMap (\c Node, \c Arc or \c Edge).
1844
+ typedef K Key;
1845
+ /// The value type of IdMap.
1846
+ typedef int Value;
1847
+
1848
+ /// \brief Constructor.
1849
+ ///
1850
+ /// Constructor of the map.
1851
+ explicit IdMap(const Graph& graph) : _graph(&graph) {}
1852
+
1853
+ /// \brief Gives back the \e id of the item.
1854
+ ///
1855
+ /// Gives back the immutable and unique \e id of the item.
1856
+ int operator[](const Item& item) const { return _graph->id(item);}
1857
+
1858
+ /// \brief Gives back the \e item by its id.
1859
+ ///
1860
+ /// Gives back the \e item by its id.
1861
+ Item operator()(int id) { return _graph->fromId(id, Item()); }
1862
+
1863
+ private:
1864
+ const Graph* _graph;
1865
+
1866
+ public:
1867
+
1868
+ /// \brief The inverse map type of IdMap.
1869
+ ///
1870
+ /// The inverse map type of IdMap. The subscript operator gives back
1871
+ /// an item by its id.
1872
+ /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
1873
+ /// \see inverse()
1874
+ class InverseMap {
1875
+ public:
1876
+
1877
+ /// \brief Constructor.
1878
+ ///
1879
+ /// Constructor for creating an id-to-item map.
1880
+ explicit InverseMap(const Graph& graph) : _graph(&graph) {}
1881
+
1882
+ /// \brief Constructor.
1883
+ ///
1884
+ /// Constructor for creating an id-to-item map.
1885
+ explicit InverseMap(const IdMap& map) : _graph(map._graph) {}
1886
+
1887
+ /// \brief Gives back an item by its id.
1888
+ ///
1889
+ /// Gives back an item by its id.
1890
+ Item operator[](int id) const { return _graph->fromId(id, Item());}
1891
+
1892
+ private:
1893
+ const Graph* _graph;
1894
+ };
1895
+
1896
+ /// \brief Gives back the inverse of the map.
1897
+ ///
1898
+ /// Gives back the inverse of the IdMap.
1899
+ InverseMap inverse() const { return InverseMap(*_graph);}
1900
+ };
1901
+
1902
+ /// \brief Returns an \c IdMap class.
1903
+ ///
1904
+ /// This function just returns an \c IdMap class.
1905
+ /// \relates IdMap
1906
+ template <typename K, typename GR>
1907
+ inline IdMap<GR, K> idMap(const GR& graph) {
1908
+ return IdMap<GR, K>(graph);
1909
+ }
1910
+
1911
+ /// \brief General cross reference graph map type.
1912
+
1913
+ /// This class provides simple invertable graph maps.
1914
+ /// It wraps a standard graph map (\c NodeMap, \c ArcMap or \c EdgeMap)
1915
+ /// and if a key is set to a new value, then stores it in the inverse map.
1916
+ /// The graph items can be accessed by their values either using
1917
+ /// \c InverseMap or \c operator()(), and the values of the map can be
1918
+ /// accessed with an STL compatible forward iterator (\c ValueIt).
1919
+ ///
1920
+ /// This map is intended to be used when all associated values are
1921
+ /// different (the map is actually invertable) or there are only a few
1922
+ /// items with the same value.
1923
+ /// Otherwise consider to use \c IterableValueMap, which is more
1924
+ /// suitable and more efficient for such cases. It provides iterators
1925
+ /// to traverse the items with the same associated value, but
1926
+ /// it does not have \c InverseMap.
1927
+ ///
1928
+ /// This type is not reference map, so it cannot be modified with
1929
+ /// the subscript operator.
1930
+ ///
1931
+ /// \tparam GR The graph type.
1932
+ /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
1933
+ /// \c GR::Edge).
1934
+ /// \tparam V The value type of the map.
1935
+ ///
1936
+ /// \see IterableValueMap
1937
+ template <typename GR, typename K, typename V>
1938
+ class CrossRefMap
1939
+ : protected ItemSetTraits<GR, K>::template Map<V>::Type {
1940
+ private:
1941
+
1942
+ typedef typename ItemSetTraits<GR, K>::
1943
+ template Map<V>::Type Map;
1944
+
1945
+ typedef std::multimap<V, K> Container;
1946
+ Container _inv_map;
1947
+
1948
+ public:
1949
+
1950
+ /// The graph type of CrossRefMap.
1951
+ typedef GR Graph;
1952
+ typedef GR Digraph;
1953
+ /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge).
1954
+ typedef K Item;
1955
+ /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge).
1956
+ typedef K Key;
1957
+ /// The value type of CrossRefMap.
1958
+ typedef V Value;
1959
+
1960
+ /// \brief Constructor.
1961
+ ///
1962
+ /// Construct a new CrossRefMap for the given graph.
1963
+ explicit CrossRefMap(const Graph& graph) : Map(graph) {}
1964
+
1965
+ /// \brief Forward iterator for values.
1966
+ ///
1967
+ /// This iterator is an STL compatible forward
1968
+ /// iterator on the values of the map. The values can
1969
+ /// be accessed in the <tt>[beginValue, endValue)</tt> range.
1970
+ /// They are considered with multiplicity, so each value is
1971
+ /// traversed for each item it is assigned to.
1972
+ class ValueIt
1973
+ : public std::iterator<std::forward_iterator_tag, Value> {
1974
+ friend class CrossRefMap;
1975
+ private:
1976
+ ValueIt(typename Container::const_iterator _it)
1977
+ : it(_it) {}
1978
+ public:
1979
+
1980
+ /// Constructor
1981
+ ValueIt() {}
1982
+
1983
+ /// \e
1984
+ ValueIt& operator++() { ++it; return *this; }
1985
+ /// \e
1986
+ ValueIt operator++(int) {
1987
+ ValueIt tmp(*this);
1988
+ operator++();
1989
+ return tmp;
1990
+ }
1991
+
1992
+ /// \e
1993
+ const Value& operator*() const { return it->first; }
1994
+ /// \e
1995
+ const Value* operator->() const { return &(it->first); }
1996
+
1997
+ /// \e
1998
+ bool operator==(ValueIt jt) const { return it == jt.it; }
1999
+ /// \e
2000
+ bool operator!=(ValueIt jt) const { return it != jt.it; }
2001
+
2002
+ private:
2003
+ typename Container::const_iterator it;
2004
+ };
2005
+
2006
+ /// Alias for \c ValueIt
2007
+ typedef ValueIt ValueIterator;
2008
+
2009
+ /// \brief Returns an iterator to the first value.
2010
+ ///
2011
+ /// Returns an STL compatible iterator to the
2012
+ /// first value of the map. The values of the
2013
+ /// map can be accessed in the <tt>[beginValue, endValue)</tt>
2014
+ /// range.
2015
+ ValueIt beginValue() const {
2016
+ return ValueIt(_inv_map.begin());
2017
+ }
2018
+
2019
+ /// \brief Returns an iterator after the last value.
2020
+ ///
2021
+ /// Returns an STL compatible iterator after the
2022
+ /// last value of the map. The values of the
2023
+ /// map can be accessed in the <tt>[beginValue, endValue)</tt>
2024
+ /// range.
2025
+ ValueIt endValue() const {
2026
+ return ValueIt(_inv_map.end());
2027
+ }
2028
+
2029
+ /// \brief Sets the value associated with the given key.
2030
+ ///
2031
+ /// Sets the value associated with the given key.
2032
+ void set(const Key& key, const Value& val) {
2033
+ Value oldval = Map::operator[](key);
2034
+ typename Container::iterator it;
2035
+ for (it = _inv_map.equal_range(oldval).first;
2036
+ it != _inv_map.equal_range(oldval).second; ++it) {
2037
+ if (it->second == key) {
2038
+ _inv_map.erase(it);
2039
+ break;
2040
+ }
2041
+ }
2042
+ _inv_map.insert(std::make_pair(val, key));
2043
+ Map::set(key, val);
2044
+ }
2045
+
2046
+ /// \brief Returns the value associated with the given key.
2047
+ ///
2048
+ /// Returns the value associated with the given key.
2049
+ typename MapTraits<Map>::ConstReturnValue
2050
+ operator[](const Key& key) const {
2051
+ return Map::operator[](key);
2052
+ }
2053
+
2054
+ /// \brief Gives back an item by its value.
2055
+ ///
2056
+ /// This function gives back an item that is assigned to
2057
+ /// the given value or \c INVALID if no such item exists.
2058
+ /// If there are more items with the same associated value,
2059
+ /// only one of them is returned.
2060
+ Key operator()(const Value& val) const {
2061
+ typename Container::const_iterator it = _inv_map.find(val);
2062
+ return it != _inv_map.end() ? it->second : INVALID;
2063
+ }
2064
+
2065
+ /// \brief Returns the number of items with the given value.
2066
+ ///
2067
+ /// This function returns the number of items with the given value
2068
+ /// associated with it.
2069
+ int count(const Value &val) const {
2070
+ return _inv_map.count(val);
2071
+ }
2072
+
2073
+ protected:
2074
+
2075
+ /// \brief Erase the key from the map and the inverse map.
2076
+ ///
2077
+ /// Erase the key from the map and the inverse map. It is called by the
2078
+ /// \c AlterationNotifier.
2079
+ virtual void erase(const Key& key) {
2080
+ Value val = Map::operator[](key);
2081
+ typename Container::iterator it;
2082
+ for (it = _inv_map.equal_range(val).first;
2083
+ it != _inv_map.equal_range(val).second; ++it) {
2084
+ if (it->second == key) {
2085
+ _inv_map.erase(it);
2086
+ break;
2087
+ }
2088
+ }
2089
+ Map::erase(key);
2090
+ }
2091
+
2092
+ /// \brief Erase more keys from the map and the inverse map.
2093
+ ///
2094
+ /// Erase more keys from the map and the inverse map. It is called by the
2095
+ /// \c AlterationNotifier.
2096
+ virtual void erase(const std::vector<Key>& keys) {
2097
+ for (int i = 0; i < int(keys.size()); ++i) {
2098
+ Value val = Map::operator[](keys[i]);
2099
+ typename Container::iterator it;
2100
+ for (it = _inv_map.equal_range(val).first;
2101
+ it != _inv_map.equal_range(val).second; ++it) {
2102
+ if (it->second == keys[i]) {
2103
+ _inv_map.erase(it);
2104
+ break;
2105
+ }
2106
+ }
2107
+ }
2108
+ Map::erase(keys);
2109
+ }
2110
+
2111
+ /// \brief Clear the keys from the map and the inverse map.
2112
+ ///
2113
+ /// Clear the keys from the map and the inverse map. It is called by the
2114
+ /// \c AlterationNotifier.
2115
+ virtual void clear() {
2116
+ _inv_map.clear();
2117
+ Map::clear();
2118
+ }
2119
+
2120
+ public:
2121
+
2122
+ /// \brief The inverse map type of CrossRefMap.
2123
+ ///
2124
+ /// The inverse map type of CrossRefMap. The subscript operator gives
2125
+ /// back an item by its value.
2126
+ /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
2127
+ /// \see inverse()
2128
+ class InverseMap {
2129
+ public:
2130
+ /// \brief Constructor
2131
+ ///
2132
+ /// Constructor of the InverseMap.
2133
+ explicit InverseMap(const CrossRefMap& inverted)
2134
+ : _inverted(inverted) {}
2135
+
2136
+ /// The value type of the InverseMap.
2137
+ typedef typename CrossRefMap::Key Value;
2138
+ /// The key type of the InverseMap.
2139
+ typedef typename CrossRefMap::Value Key;
2140
+
2141
+ /// \brief Subscript operator.
2142
+ ///
2143
+ /// Subscript operator. It gives back an item
2144
+ /// that is assigned to the given value or \c INVALID
2145
+ /// if no such item exists.
2146
+ Value operator[](const Key& key) const {
2147
+ return _inverted(key);
2148
+ }
2149
+
2150
+ private:
2151
+ const CrossRefMap& _inverted;
2152
+ };
2153
+
2154
+ /// \brief Gives back the inverse of the map.
2155
+ ///
2156
+ /// Gives back the inverse of the CrossRefMap.
2157
+ InverseMap inverse() const {
2158
+ return InverseMap(*this);
2159
+ }
2160
+
2161
+ };
2162
+
2163
+ /// \brief Provides continuous and unique id for the
2164
+ /// items of a graph.
2165
+ ///
2166
+ /// RangeIdMap provides a unique and continuous
2167
+ /// id for each item of a given type (\c Node, \c Arc or
2168
+ /// \c Edge) in a graph. This id is
2169
+ /// - \b unique: different items get different ids,
2170
+ /// - \b continuous: the range of the ids is the set of integers
2171
+ /// between 0 and \c n-1, where \c n is the number of the items of
2172
+ /// this type (\c Node, \c Arc or \c Edge).
2173
+ /// - So, the ids can change when deleting an item of the same type.
2174
+ ///
2175
+ /// Thus this id is not (necessarily) the same as what can get using
2176
+ /// the \c id() function of the graph or \ref IdMap.
2177
+ /// This map can be inverted with its member class \c InverseMap,
2178
+ /// or with the \c operator()() member.
2179
+ ///
2180
+ /// \tparam GR The graph type.
2181
+ /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2182
+ /// \c GR::Edge).
2183
+ ///
2184
+ /// \see IdMap
2185
+ template <typename GR, typename K>
2186
+ class RangeIdMap
2187
+ : protected ItemSetTraits<GR, K>::template Map<int>::Type {
2188
+
2189
+ typedef typename ItemSetTraits<GR, K>::template Map<int>::Type Map;
2190
+
2191
+ public:
2192
+ /// The graph type of RangeIdMap.
2193
+ typedef GR Graph;
2194
+ typedef GR Digraph;
2195
+ /// The key type of RangeIdMap (\c Node, \c Arc or \c Edge).
2196
+ typedef K Item;
2197
+ /// The key type of RangeIdMap (\c Node, \c Arc or \c Edge).
2198
+ typedef K Key;
2199
+ /// The value type of RangeIdMap.
2200
+ typedef int Value;
2201
+
2202
+ /// \brief Constructor.
2203
+ ///
2204
+ /// Constructor.
2205
+ explicit RangeIdMap(const Graph& gr) : Map(gr) {
2206
+ Item it;
2207
+ const typename Map::Notifier* nf = Map::notifier();
2208
+ for (nf->first(it); it != INVALID; nf->next(it)) {
2209
+ Map::set(it, _inv_map.size());
2210
+ _inv_map.push_back(it);
2211
+ }
2212
+ }
2213
+
2214
+ protected:
2215
+
2216
+ /// \brief Adds a new key to the map.
2217
+ ///
2218
+ /// Add a new key to the map. It is called by the
2219
+ /// \c AlterationNotifier.
2220
+ virtual void add(const Item& item) {
2221
+ Map::add(item);
2222
+ Map::set(item, _inv_map.size());
2223
+ _inv_map.push_back(item);
2224
+ }
2225
+
2226
+ /// \brief Add more new keys to the map.
2227
+ ///
2228
+ /// Add more new keys to the map. It is called by the
2229
+ /// \c AlterationNotifier.
2230
+ virtual void add(const std::vector<Item>& items) {
2231
+ Map::add(items);
2232
+ for (int i = 0; i < int(items.size()); ++i) {
2233
+ Map::set(items[i], _inv_map.size());
2234
+ _inv_map.push_back(items[i]);
2235
+ }
2236
+ }
2237
+
2238
+ /// \brief Erase the key from the map.
2239
+ ///
2240
+ /// Erase the key from the map. It is called by the
2241
+ /// \c AlterationNotifier.
2242
+ virtual void erase(const Item& item) {
2243
+ Map::set(_inv_map.back(), Map::operator[](item));
2244
+ _inv_map[Map::operator[](item)] = _inv_map.back();
2245
+ _inv_map.pop_back();
2246
+ Map::erase(item);
2247
+ }
2248
+
2249
+ /// \brief Erase more keys from the map.
2250
+ ///
2251
+ /// Erase more keys from the map. It is called by the
2252
+ /// \c AlterationNotifier.
2253
+ virtual void erase(const std::vector<Item>& items) {
2254
+ for (int i = 0; i < int(items.size()); ++i) {
2255
+ Map::set(_inv_map.back(), Map::operator[](items[i]));
2256
+ _inv_map[Map::operator[](items[i])] = _inv_map.back();
2257
+ _inv_map.pop_back();
2258
+ }
2259
+ Map::erase(items);
2260
+ }
2261
+
2262
+ /// \brief Build the unique map.
2263
+ ///
2264
+ /// Build the unique map. It is called by the
2265
+ /// \c AlterationNotifier.
2266
+ virtual void build() {
2267
+ Map::build();
2268
+ Item it;
2269
+ const typename Map::Notifier* nf = Map::notifier();
2270
+ for (nf->first(it); it != INVALID; nf->next(it)) {
2271
+ Map::set(it, _inv_map.size());
2272
+ _inv_map.push_back(it);
2273
+ }
2274
+ }
2275
+
2276
+ /// \brief Clear the keys from the map.
2277
+ ///
2278
+ /// Clear the keys from the map. It is called by the
2279
+ /// \c AlterationNotifier.
2280
+ virtual void clear() {
2281
+ _inv_map.clear();
2282
+ Map::clear();
2283
+ }
2284
+
2285
+ public:
2286
+
2287
+ /// \brief Returns the maximal value plus one.
2288
+ ///
2289
+ /// Returns the maximal value plus one in the map.
2290
+ unsigned int size() const {
2291
+ return _inv_map.size();
2292
+ }
2293
+
2294
+ /// \brief Swaps the position of the two items in the map.
2295
+ ///
2296
+ /// Swaps the position of the two items in the map.
2297
+ void swap(const Item& p, const Item& q) {
2298
+ int pi = Map::operator[](p);
2299
+ int qi = Map::operator[](q);
2300
+ Map::set(p, qi);
2301
+ _inv_map[qi] = p;
2302
+ Map::set(q, pi);
2303
+ _inv_map[pi] = q;
2304
+ }
2305
+
2306
+ /// \brief Gives back the \e range \e id of the item
2307
+ ///
2308
+ /// Gives back the \e range \e id of the item.
2309
+ int operator[](const Item& item) const {
2310
+ return Map::operator[](item);
2311
+ }
2312
+
2313
+ /// \brief Gives back the item belonging to a \e range \e id
2314
+ ///
2315
+ /// Gives back the item belonging to the given \e range \e id.
2316
+ Item operator()(int id) const {
2317
+ return _inv_map[id];
2318
+ }
2319
+
2320
+ private:
2321
+
2322
+ typedef std::vector<Item> Container;
2323
+ Container _inv_map;
2324
+
2325
+ public:
2326
+
2327
+ /// \brief The inverse map type of RangeIdMap.
2328
+ ///
2329
+ /// The inverse map type of RangeIdMap. The subscript operator gives
2330
+ /// back an item by its \e range \e id.
2331
+ /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
2332
+ class InverseMap {
2333
+ public:
2334
+ /// \brief Constructor
2335
+ ///
2336
+ /// Constructor of the InverseMap.
2337
+ explicit InverseMap(const RangeIdMap& inverted)
2338
+ : _inverted(inverted) {}
2339
+
2340
+
2341
+ /// The value type of the InverseMap.
2342
+ typedef typename RangeIdMap::Key Value;
2343
+ /// The key type of the InverseMap.
2344
+ typedef typename RangeIdMap::Value Key;
2345
+
2346
+ /// \brief Subscript operator.
2347
+ ///
2348
+ /// Subscript operator. It gives back the item
2349
+ /// that the given \e range \e id currently belongs to.
2350
+ Value operator[](const Key& key) const {
2351
+ return _inverted(key);
2352
+ }
2353
+
2354
+ /// \brief Size of the map.
2355
+ ///
2356
+ /// Returns the size of the map.
2357
+ unsigned int size() const {
2358
+ return _inverted.size();
2359
+ }
2360
+
2361
+ private:
2362
+ const RangeIdMap& _inverted;
2363
+ };
2364
+
2365
+ /// \brief Gives back the inverse of the map.
2366
+ ///
2367
+ /// Gives back the inverse of the RangeIdMap.
2368
+ const InverseMap inverse() const {
2369
+ return InverseMap(*this);
2370
+ }
2371
+ };
2372
+
2373
+ /// \brief Returns a \c RangeIdMap class.
2374
+ ///
2375
+ /// This function just returns an \c RangeIdMap class.
2376
+ /// \relates RangeIdMap
2377
+ template <typename K, typename GR>
2378
+ inline RangeIdMap<GR, K> rangeIdMap(const GR& graph) {
2379
+ return RangeIdMap<GR, K>(graph);
2380
+ }
2381
+
2382
+ /// \brief Dynamic iterable \c bool map.
2383
+ ///
2384
+ /// This class provides a special graph map type which can store a
2385
+ /// \c bool value for graph items (\c Node, \c Arc or \c Edge).
2386
+ /// For both \c true and \c false values it is possible to iterate on
2387
+ /// the keys mapped to the value.
2388
+ ///
2389
+ /// This type is a reference map, so it can be modified with the
2390
+ /// subscript operator.
2391
+ ///
2392
+ /// \tparam GR The graph type.
2393
+ /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2394
+ /// \c GR::Edge).
2395
+ ///
2396
+ /// \see IterableIntMap, IterableValueMap
2397
+ /// \see CrossRefMap
2398
+ template <typename GR, typename K>
2399
+ class IterableBoolMap
2400
+ : protected ItemSetTraits<GR, K>::template Map<int>::Type {
2401
+ private:
2402
+ typedef GR Graph;
2403
+
2404
+ typedef typename ItemSetTraits<GR, K>::ItemIt KeyIt;
2405
+ typedef typename ItemSetTraits<GR, K>::template Map<int>::Type Parent;
2406
+
2407
+ std::vector<K> _array;
2408
+ int _sep;
2409
+
2410
+ public:
2411
+
2412
+ /// Indicates that the map is reference map.
2413
+ typedef True ReferenceMapTag;
2414
+
2415
+ /// The key type
2416
+ typedef K Key;
2417
+ /// The value type
2418
+ typedef bool Value;
2419
+ /// The const reference type.
2420
+ typedef const Value& ConstReference;
2421
+
2422
+ private:
2423
+
2424
+ int position(const Key& key) const {
2425
+ return Parent::operator[](key);
2426
+ }
2427
+
2428
+ public:
2429
+
2430
+ /// \brief Reference to the value of the map.
2431
+ ///
2432
+ /// This class is similar to the \c bool type. It can be converted to
2433
+ /// \c bool and it provides the same operators.
2434
+ class Reference {
2435
+ friend class IterableBoolMap;
2436
+ private:
2437
+ Reference(IterableBoolMap& map, const Key& key)
2438
+ : _key(key), _map(map) {}
2439
+ public:
2440
+
2441
+ Reference& operator=(const Reference& value) {
2442
+ _map.set(_key, static_cast<bool>(value));
2443
+ return *this;
2444
+ }
2445
+
2446
+ operator bool() const {
2447
+ return static_cast<const IterableBoolMap&>(_map)[_key];
2448
+ }
2449
+
2450
+ Reference& operator=(bool value) {
2451
+ _map.set(_key, value);
2452
+ return *this;
2453
+ }
2454
+ Reference& operator&=(bool value) {
2455
+ _map.set(_key, _map[_key] & value);
2456
+ return *this;
2457
+ }
2458
+ Reference& operator|=(bool value) {
2459
+ _map.set(_key, _map[_key] | value);
2460
+ return *this;
2461
+ }
2462
+ Reference& operator^=(bool value) {
2463
+ _map.set(_key, _map[_key] ^ value);
2464
+ return *this;
2465
+ }
2466
+ private:
2467
+ Key _key;
2468
+ IterableBoolMap& _map;
2469
+ };
2470
+
2471
+ /// \brief Constructor of the map with a default value.
2472
+ ///
2473
+ /// Constructor of the map with a default value.
2474
+ explicit IterableBoolMap(const Graph& graph, bool def = false)
2475
+ : Parent(graph) {
2476
+ typename Parent::Notifier* nf = Parent::notifier();
2477
+ Key it;
2478
+ for (nf->first(it); it != INVALID; nf->next(it)) {
2479
+ Parent::set(it, _array.size());
2480
+ _array.push_back(it);
2481
+ }
2482
+ _sep = (def ? _array.size() : 0);
2483
+ }
2484
+
2485
+ /// \brief Const subscript operator of the map.
2486
+ ///
2487
+ /// Const subscript operator of the map.
2488
+ bool operator[](const Key& key) const {
2489
+ return position(key) < _sep;
2490
+ }
2491
+
2492
+ /// \brief Subscript operator of the map.
2493
+ ///
2494
+ /// Subscript operator of the map.
2495
+ Reference operator[](const Key& key) {
2496
+ return Reference(*this, key);
2497
+ }
2498
+
2499
+ /// \brief Set operation of the map.
2500
+ ///
2501
+ /// Set operation of the map.
2502
+ void set(const Key& key, bool value) {
2503
+ int pos = position(key);
2504
+ if (value) {
2505
+ if (pos < _sep) return;
2506
+ Key tmp = _array[_sep];
2507
+ _array[_sep] = key;
2508
+ Parent::set(key, _sep);
2509
+ _array[pos] = tmp;
2510
+ Parent::set(tmp, pos);
2511
+ ++_sep;
2512
+ } else {
2513
+ if (pos >= _sep) return;
2514
+ --_sep;
2515
+ Key tmp = _array[_sep];
2516
+ _array[_sep] = key;
2517
+ Parent::set(key, _sep);
2518
+ _array[pos] = tmp;
2519
+ Parent::set(tmp, pos);
2520
+ }
2521
+ }
2522
+
2523
+ /// \brief Set all items.
2524
+ ///
2525
+ /// Set all items in the map.
2526
+ /// \note Constant time operation.
2527
+ void setAll(bool value) {
2528
+ _sep = (value ? _array.size() : 0);
2529
+ }
2530
+
2531
+ /// \brief Returns the number of the keys mapped to \c true.
2532
+ ///
2533
+ /// Returns the number of the keys mapped to \c true.
2534
+ int trueNum() const {
2535
+ return _sep;
2536
+ }
2537
+
2538
+ /// \brief Returns the number of the keys mapped to \c false.
2539
+ ///
2540
+ /// Returns the number of the keys mapped to \c false.
2541
+ int falseNum() const {
2542
+ return _array.size() - _sep;
2543
+ }
2544
+
2545
+ /// \brief Iterator for the keys mapped to \c true.
2546
+ ///
2547
+ /// Iterator for the keys mapped to \c true. It works
2548
+ /// like a graph item iterator, it can be converted to
2549
+ /// the key type of the map, incremented with \c ++ operator, and
2550
+ /// if the iterator leaves the last valid key, it will be equal to
2551
+ /// \c INVALID.
2552
+ class TrueIt : public Key {
2553
+ public:
2554
+ typedef Key Parent;
2555
+
2556
+ /// \brief Creates an iterator.
2557
+ ///
2558
+ /// Creates an iterator. It iterates on the
2559
+ /// keys mapped to \c true.
2560
+ /// \param map The IterableBoolMap.
2561
+ explicit TrueIt(const IterableBoolMap& map)
2562
+ : Parent(map._sep > 0 ? map._array[map._sep - 1] : INVALID),
2563
+ _map(&map) {}
2564
+
2565
+ /// \brief Invalid constructor \& conversion.
2566
+ ///
2567
+ /// This constructor initializes the iterator to be invalid.
2568
+ /// \sa Invalid for more details.
2569
+ TrueIt(Invalid) : Parent(INVALID), _map(0) {}
2570
+
2571
+ /// \brief Increment operator.
2572
+ ///
2573
+ /// Increment operator.
2574
+ TrueIt& operator++() {
2575
+ int pos = _map->position(*this);
2576
+ Parent::operator=(pos > 0 ? _map->_array[pos - 1] : INVALID);
2577
+ return *this;
2578
+ }
2579
+
2580
+ private:
2581
+ const IterableBoolMap* _map;
2582
+ };
2583
+
2584
+ /// \brief Iterator for the keys mapped to \c false.
2585
+ ///
2586
+ /// Iterator for the keys mapped to \c false. It works
2587
+ /// like a graph item iterator, it can be converted to
2588
+ /// the key type of the map, incremented with \c ++ operator, and
2589
+ /// if the iterator leaves the last valid key, it will be equal to
2590
+ /// \c INVALID.
2591
+ class FalseIt : public Key {
2592
+ public:
2593
+ typedef Key Parent;
2594
+
2595
+ /// \brief Creates an iterator.
2596
+ ///
2597
+ /// Creates an iterator. It iterates on the
2598
+ /// keys mapped to \c false.
2599
+ /// \param map The IterableBoolMap.
2600
+ explicit FalseIt(const IterableBoolMap& map)
2601
+ : Parent(map._sep < int(map._array.size()) ?
2602
+ map._array.back() : INVALID), _map(&map) {}
2603
+
2604
+ /// \brief Invalid constructor \& conversion.
2605
+ ///
2606
+ /// This constructor initializes the iterator to be invalid.
2607
+ /// \sa Invalid for more details.
2608
+ FalseIt(Invalid) : Parent(INVALID), _map(0) {}
2609
+
2610
+ /// \brief Increment operator.
2611
+ ///
2612
+ /// Increment operator.
2613
+ FalseIt& operator++() {
2614
+ int pos = _map->position(*this);
2615
+ Parent::operator=(pos > _map->_sep ? _map->_array[pos - 1] : INVALID);
2616
+ return *this;
2617
+ }
2618
+
2619
+ private:
2620
+ const IterableBoolMap* _map;
2621
+ };
2622
+
2623
+ /// \brief Iterator for the keys mapped to a given value.
2624
+ ///
2625
+ /// Iterator for the keys mapped to a given value. It works
2626
+ /// like a graph item iterator, it can be converted to
2627
+ /// the key type of the map, incremented with \c ++ operator, and
2628
+ /// if the iterator leaves the last valid key, it will be equal to
2629
+ /// \c INVALID.
2630
+ class ItemIt : public Key {
2631
+ public:
2632
+ typedef Key Parent;
2633
+
2634
+ /// \brief Creates an iterator with a value.
2635
+ ///
2636
+ /// Creates an iterator with a value. It iterates on the
2637
+ /// keys mapped to the given value.
2638
+ /// \param map The IterableBoolMap.
2639
+ /// \param value The value.
2640
+ ItemIt(const IterableBoolMap& map, bool value)
2641
+ : Parent(value ?
2642
+ (map._sep > 0 ?
2643
+ map._array[map._sep - 1] : INVALID) :
2644
+ (map._sep < int(map._array.size()) ?
2645
+ map._array.back() : INVALID)), _map(&map) {}
2646
+
2647
+ /// \brief Invalid constructor \& conversion.
2648
+ ///
2649
+ /// This constructor initializes the iterator to be invalid.
2650
+ /// \sa Invalid for more details.
2651
+ ItemIt(Invalid) : Parent(INVALID), _map(0) {}
2652
+
2653
+ /// \brief Increment operator.
2654
+ ///
2655
+ /// Increment operator.
2656
+ ItemIt& operator++() {
2657
+ int pos = _map->position(*this);
2658
+ int _sep = pos >= _map->_sep ? _map->_sep : 0;
2659
+ Parent::operator=(pos > _sep ? _map->_array[pos - 1] : INVALID);
2660
+ return *this;
2661
+ }
2662
+
2663
+ private:
2664
+ const IterableBoolMap* _map;
2665
+ };
2666
+
2667
+ protected:
2668
+
2669
+ virtual void add(const Key& key) {
2670
+ Parent::add(key);
2671
+ Parent::set(key, _array.size());
2672
+ _array.push_back(key);
2673
+ }
2674
+
2675
+ virtual void add(const std::vector<Key>& keys) {
2676
+ Parent::add(keys);
2677
+ for (int i = 0; i < int(keys.size()); ++i) {
2678
+ Parent::set(keys[i], _array.size());
2679
+ _array.push_back(keys[i]);
2680
+ }
2681
+ }
2682
+
2683
+ virtual void erase(const Key& key) {
2684
+ int pos = position(key);
2685
+ if (pos < _sep) {
2686
+ --_sep;
2687
+ Parent::set(_array[_sep], pos);
2688
+ _array[pos] = _array[_sep];
2689
+ Parent::set(_array.back(), _sep);
2690
+ _array[_sep] = _array.back();
2691
+ _array.pop_back();
2692
+ } else {
2693
+ Parent::set(_array.back(), pos);
2694
+ _array[pos] = _array.back();
2695
+ _array.pop_back();
2696
+ }
2697
+ Parent::erase(key);
2698
+ }
2699
+
2700
+ virtual void erase(const std::vector<Key>& keys) {
2701
+ for (int i = 0; i < int(keys.size()); ++i) {
2702
+ int pos = position(keys[i]);
2703
+ if (pos < _sep) {
2704
+ --_sep;
2705
+ Parent::set(_array[_sep], pos);
2706
+ _array[pos] = _array[_sep];
2707
+ Parent::set(_array.back(), _sep);
2708
+ _array[_sep] = _array.back();
2709
+ _array.pop_back();
2710
+ } else {
2711
+ Parent::set(_array.back(), pos);
2712
+ _array[pos] = _array.back();
2713
+ _array.pop_back();
2714
+ }
2715
+ }
2716
+ Parent::erase(keys);
2717
+ }
2718
+
2719
+ virtual void build() {
2720
+ Parent::build();
2721
+ typename Parent::Notifier* nf = Parent::notifier();
2722
+ Key it;
2723
+ for (nf->first(it); it != INVALID; nf->next(it)) {
2724
+ Parent::set(it, _array.size());
2725
+ _array.push_back(it);
2726
+ }
2727
+ _sep = 0;
2728
+ }
2729
+
2730
+ virtual void clear() {
2731
+ _array.clear();
2732
+ _sep = 0;
2733
+ Parent::clear();
2734
+ }
2735
+
2736
+ };
2737
+
2738
+
2739
+ namespace _maps_bits {
2740
+ template <typename Item>
2741
+ struct IterableIntMapNode {
2742
+ IterableIntMapNode() : value(-1) {}
2743
+ IterableIntMapNode(int _value) : value(_value) {}
2744
+ Item prev, next;
2745
+ int value;
2746
+ };
2747
+ }
2748
+
2749
+ /// \brief Dynamic iterable integer map.
2750
+ ///
2751
+ /// This class provides a special graph map type which can store an
2752
+ /// integer value for graph items (\c Node, \c Arc or \c Edge).
2753
+ /// For each non-negative value it is possible to iterate on the keys
2754
+ /// mapped to the value.
2755
+ ///
2756
+ /// This map is intended to be used with small integer values, for which
2757
+ /// it is efficient, and supports iteration only for non-negative values.
2758
+ /// If you need large values and/or iteration for negative integers,
2759
+ /// consider to use \ref IterableValueMap instead.
2760
+ ///
2761
+ /// This type is a reference map, so it can be modified with the
2762
+ /// subscript operator.
2763
+ ///
2764
+ /// \note The size of the data structure depends on the largest
2765
+ /// value in the map.
2766
+ ///
2767
+ /// \tparam GR The graph type.
2768
+ /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2769
+ /// \c GR::Edge).
2770
+ ///
2771
+ /// \see IterableBoolMap, IterableValueMap
2772
+ /// \see CrossRefMap
2773
+ template <typename GR, typename K>
2774
+ class IterableIntMap
2775
+ : protected ItemSetTraits<GR, K>::
2776
+ template Map<_maps_bits::IterableIntMapNode<K> >::Type {
2777
+ public:
2778
+ typedef typename ItemSetTraits<GR, K>::
2779
+ template Map<_maps_bits::IterableIntMapNode<K> >::Type Parent;
2780
+
2781
+ /// The key type
2782
+ typedef K Key;
2783
+ /// The value type
2784
+ typedef int Value;
2785
+ /// The graph type
2786
+ typedef GR Graph;
2787
+
2788
+ /// \brief Constructor of the map.
2789
+ ///
2790
+ /// Constructor of the map. It sets all values to -1.
2791
+ explicit IterableIntMap(const Graph& graph)
2792
+ : Parent(graph) {}
2793
+
2794
+ /// \brief Constructor of the map with a given value.
2795
+ ///
2796
+ /// Constructor of the map with a given value.
2797
+ explicit IterableIntMap(const Graph& graph, int value)
2798
+ : Parent(graph, _maps_bits::IterableIntMapNode<K>(value)) {
2799
+ if (value >= 0) {
2800
+ for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
2801
+ lace(it);
2802
+ }
2803
+ }
2804
+ }
2805
+
2806
+ private:
2807
+
2808
+ void unlace(const Key& key) {
2809
+ typename Parent::Value& node = Parent::operator[](key);
2810
+ if (node.value < 0) return;
2811
+ if (node.prev != INVALID) {
2812
+ Parent::operator[](node.prev).next = node.next;
2813
+ } else {
2814
+ _first[node.value] = node.next;
2815
+ }
2816
+ if (node.next != INVALID) {
2817
+ Parent::operator[](node.next).prev = node.prev;
2818
+ }
2819
+ while (!_first.empty() && _first.back() == INVALID) {
2820
+ _first.pop_back();
2821
+ }
2822
+ }
2823
+
2824
+ void lace(const Key& key) {
2825
+ typename Parent::Value& node = Parent::operator[](key);
2826
+ if (node.value < 0) return;
2827
+ if (node.value >= int(_first.size())) {
2828
+ _first.resize(node.value + 1, INVALID);
2829
+ }
2830
+ node.prev = INVALID;
2831
+ node.next = _first[node.value];
2832
+ if (node.next != INVALID) {
2833
+ Parent::operator[](node.next).prev = key;
2834
+ }
2835
+ _first[node.value] = key;
2836
+ }
2837
+
2838
+ public:
2839
+
2840
+ /// Indicates that the map is reference map.
2841
+ typedef True ReferenceMapTag;
2842
+
2843
+ /// \brief Reference to the value of the map.
2844
+ ///
2845
+ /// This class is similar to the \c int type. It can
2846
+ /// be converted to \c int and it has the same operators.
2847
+ class Reference {
2848
+ friend class IterableIntMap;
2849
+ private:
2850
+ Reference(IterableIntMap& map, const Key& key)
2851
+ : _key(key), _map(map) {}
2852
+ public:
2853
+
2854
+ Reference& operator=(const Reference& value) {
2855
+ _map.set(_key, static_cast<const int&>(value));
2856
+ return *this;
2857
+ }
2858
+
2859
+ operator const int&() const {
2860
+ return static_cast<const IterableIntMap&>(_map)[_key];
2861
+ }
2862
+
2863
+ Reference& operator=(int value) {
2864
+ _map.set(_key, value);
2865
+ return *this;
2866
+ }
2867
+ Reference& operator++() {
2868
+ _map.set(_key, _map[_key] + 1);
2869
+ return *this;
2870
+ }
2871
+ int operator++(int) {
2872
+ int value = _map[_key];
2873
+ _map.set(_key, value + 1);
2874
+ return value;
2875
+ }
2876
+ Reference& operator--() {
2877
+ _map.set(_key, _map[_key] - 1);
2878
+ return *this;
2879
+ }
2880
+ int operator--(int) {
2881
+ int value = _map[_key];
2882
+ _map.set(_key, value - 1);
2883
+ return value;
2884
+ }
2885
+ Reference& operator+=(int value) {
2886
+ _map.set(_key, _map[_key] + value);
2887
+ return *this;
2888
+ }
2889
+ Reference& operator-=(int value) {
2890
+ _map.set(_key, _map[_key] - value);
2891
+ return *this;
2892
+ }
2893
+ Reference& operator*=(int value) {
2894
+ _map.set(_key, _map[_key] * value);
2895
+ return *this;
2896
+ }
2897
+ Reference& operator/=(int value) {
2898
+ _map.set(_key, _map[_key] / value);
2899
+ return *this;
2900
+ }
2901
+ Reference& operator%=(int value) {
2902
+ _map.set(_key, _map[_key] % value);
2903
+ return *this;
2904
+ }
2905
+ Reference& operator&=(int value) {
2906
+ _map.set(_key, _map[_key] & value);
2907
+ return *this;
2908
+ }
2909
+ Reference& operator|=(int value) {
2910
+ _map.set(_key, _map[_key] | value);
2911
+ return *this;
2912
+ }
2913
+ Reference& operator^=(int value) {
2914
+ _map.set(_key, _map[_key] ^ value);
2915
+ return *this;
2916
+ }
2917
+ Reference& operator<<=(int value) {
2918
+ _map.set(_key, _map[_key] << value);
2919
+ return *this;
2920
+ }
2921
+ Reference& operator>>=(int value) {
2922
+ _map.set(_key, _map[_key] >> value);
2923
+ return *this;
2924
+ }
2925
+
2926
+ private:
2927
+ Key _key;
2928
+ IterableIntMap& _map;
2929
+ };
2930
+
2931
+ /// The const reference type.
2932
+ typedef const Value& ConstReference;
2933
+
2934
+ /// \brief Gives back the maximal value plus one.
2935
+ ///
2936
+ /// Gives back the maximal value plus one.
2937
+ int size() const {
2938
+ return _first.size();
2939
+ }
2940
+
2941
+ /// \brief Set operation of the map.
2942
+ ///
2943
+ /// Set operation of the map.
2944
+ void set(const Key& key, const Value& value) {
2945
+ unlace(key);
2946
+ Parent::operator[](key).value = value;
2947
+ lace(key);
2948
+ }
2949
+
2950
+ /// \brief Const subscript operator of the map.
2951
+ ///
2952
+ /// Const subscript operator of the map.
2953
+ const Value& operator[](const Key& key) const {
2954
+ return Parent::operator[](key).value;
2955
+ }
2956
+
2957
+ /// \brief Subscript operator of the map.
2958
+ ///
2959
+ /// Subscript operator of the map.
2960
+ Reference operator[](const Key& key) {
2961
+ return Reference(*this, key);
2962
+ }
2963
+
2964
+ /// \brief Iterator for the keys with the same value.
2965
+ ///
2966
+ /// Iterator for the keys with the same value. It works
2967
+ /// like a graph item iterator, it can be converted to
2968
+ /// the item type of the map, incremented with \c ++ operator, and
2969
+ /// if the iterator leaves the last valid item, it will be equal to
2970
+ /// \c INVALID.
2971
+ class ItemIt : public Key {
2972
+ public:
2973
+ typedef Key Parent;
2974
+
2975
+ /// \brief Invalid constructor \& conversion.
2976
+ ///
2977
+ /// This constructor initializes the iterator to be invalid.
2978
+ /// \sa Invalid for more details.
2979
+ ItemIt(Invalid) : Parent(INVALID), _map(0) {}
2980
+
2981
+ /// \brief Creates an iterator with a value.
2982
+ ///
2983
+ /// Creates an iterator with a value. It iterates on the
2984
+ /// keys mapped to the given value.
2985
+ /// \param map The IterableIntMap.
2986
+ /// \param value The value.
2987
+ ItemIt(const IterableIntMap& map, int value) : _map(&map) {
2988
+ if (value < 0 || value >= int(_map->_first.size())) {
2989
+ Parent::operator=(INVALID);
2990
+ } else {
2991
+ Parent::operator=(_map->_first[value]);
2992
+ }
2993
+ }
2994
+
2995
+ /// \brief Increment operator.
2996
+ ///
2997
+ /// Increment operator.
2998
+ ItemIt& operator++() {
2999
+ Parent::operator=(_map->IterableIntMap::Parent::
3000
+ operator[](static_cast<Parent&>(*this)).next);
3001
+ return *this;
3002
+ }
3003
+
3004
+ private:
3005
+ const IterableIntMap* _map;
3006
+ };
3007
+
3008
+ protected:
3009
+
3010
+ virtual void erase(const Key& key) {
3011
+ unlace(key);
3012
+ Parent::erase(key);
3013
+ }
3014
+
3015
+ virtual void erase(const std::vector<Key>& keys) {
3016
+ for (int i = 0; i < int(keys.size()); ++i) {
3017
+ unlace(keys[i]);
3018
+ }
3019
+ Parent::erase(keys);
3020
+ }
3021
+
3022
+ virtual void clear() {
3023
+ _first.clear();
3024
+ Parent::clear();
3025
+ }
3026
+
3027
+ private:
3028
+ std::vector<Key> _first;
3029
+ };
3030
+
3031
+ namespace _maps_bits {
3032
+ template <typename Item, typename Value>
3033
+ struct IterableValueMapNode {
3034
+ IterableValueMapNode(Value _value = Value()) : value(_value) {}
3035
+ Item prev, next;
3036
+ Value value;
3037
+ };
3038
+ }
3039
+
3040
+ /// \brief Dynamic iterable map for comparable values.
3041
+ ///
3042
+ /// This class provides a special graph map type which can store a
3043
+ /// comparable value for graph items (\c Node, \c Arc or \c Edge).
3044
+ /// For each value it is possible to iterate on the keys mapped to
3045
+ /// the value (\c ItemIt), and the values of the map can be accessed
3046
+ /// with an STL compatible forward iterator (\c ValueIt).
3047
+ /// The map stores a linked list for each value, which contains
3048
+ /// the items mapped to the value, and the used values are stored
3049
+ /// in balanced binary tree (\c std::map).
3050
+ ///
3051
+ /// \ref IterableBoolMap and \ref IterableIntMap are similar classes
3052
+ /// specialized for \c bool and \c int values, respectively.
3053
+ ///
3054
+ /// This type is not reference map, so it cannot be modified with
3055
+ /// the subscript operator.
3056
+ ///
3057
+ /// \tparam GR The graph type.
3058
+ /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
3059
+ /// \c GR::Edge).
3060
+ /// \tparam V The value type of the map. It can be any comparable
3061
+ /// value type.
3062
+ ///
3063
+ /// \see IterableBoolMap, IterableIntMap
3064
+ /// \see CrossRefMap
3065
+ template <typename GR, typename K, typename V>
3066
+ class IterableValueMap
3067
+ : protected ItemSetTraits<GR, K>::
3068
+ template Map<_maps_bits::IterableValueMapNode<K, V> >::Type {
3069
+ public:
3070
+ typedef typename ItemSetTraits<GR, K>::
3071
+ template Map<_maps_bits::IterableValueMapNode<K, V> >::Type Parent;
3072
+
3073
+ /// The key type
3074
+ typedef K Key;
3075
+ /// The value type
3076
+ typedef V Value;
3077
+ /// The graph type
3078
+ typedef GR Graph;
3079
+
3080
+ public:
3081
+
3082
+ /// \brief Constructor of the map with a given value.
3083
+ ///
3084
+ /// Constructor of the map with a given value.
3085
+ explicit IterableValueMap(const Graph& graph,
3086
+ const Value& value = Value())
3087
+ : Parent(graph, _maps_bits::IterableValueMapNode<K, V>(value)) {
3088
+ for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
3089
+ lace(it);
3090
+ }
3091
+ }
3092
+
3093
+ protected:
3094
+
3095
+ void unlace(const Key& key) {
3096
+ typename Parent::Value& node = Parent::operator[](key);
3097
+ if (node.prev != INVALID) {
3098
+ Parent::operator[](node.prev).next = node.next;
3099
+ } else {
3100
+ if (node.next != INVALID) {
3101
+ _first[node.value] = node.next;
3102
+ } else {
3103
+ _first.erase(node.value);
3104
+ }
3105
+ }
3106
+ if (node.next != INVALID) {
3107
+ Parent::operator[](node.next).prev = node.prev;
3108
+ }
3109
+ }
3110
+
3111
+ void lace(const Key& key) {
3112
+ typename Parent::Value& node = Parent::operator[](key);
3113
+ typename std::map<Value, Key>::iterator it = _first.find(node.value);
3114
+ if (it == _first.end()) {
3115
+ node.prev = node.next = INVALID;
3116
+ _first.insert(std::make_pair(node.value, key));
3117
+ } else {
3118
+ node.prev = INVALID;
3119
+ node.next = it->second;
3120
+ if (node.next != INVALID) {
3121
+ Parent::operator[](node.next).prev = key;
3122
+ }
3123
+ it->second = key;
3124
+ }
3125
+ }
3126
+
3127
+ public:
3128
+
3129
+ /// \brief Forward iterator for values.
3130
+ ///
3131
+ /// This iterator is an STL compatible forward
3132
+ /// iterator on the values of the map. The values can
3133
+ /// be accessed in the <tt>[beginValue, endValue)</tt> range.
3134
+ class ValueIt
3135
+ : public std::iterator<std::forward_iterator_tag, Value> {
3136
+ friend class IterableValueMap;
3137
+ private:
3138
+ ValueIt(typename std::map<Value, Key>::const_iterator _it)
3139
+ : it(_it) {}
3140
+ public:
3141
+
3142
+ /// Constructor
3143
+ ValueIt() {}
3144
+
3145
+ /// \e
3146
+ ValueIt& operator++() { ++it; return *this; }
3147
+ /// \e
3148
+ ValueIt operator++(int) {
3149
+ ValueIt tmp(*this);
3150
+ operator++();
3151
+ return tmp;
3152
+ }
3153
+
3154
+ /// \e
3155
+ const Value& operator*() const { return it->first; }
3156
+ /// \e
3157
+ const Value* operator->() const { return &(it->first); }
3158
+
3159
+ /// \e
3160
+ bool operator==(ValueIt jt) const { return it == jt.it; }
3161
+ /// \e
3162
+ bool operator!=(ValueIt jt) const { return it != jt.it; }
3163
+
3164
+ private:
3165
+ typename std::map<Value, Key>::const_iterator it;
3166
+ };
3167
+
3168
+ /// \brief Returns an iterator to the first value.
3169
+ ///
3170
+ /// Returns an STL compatible iterator to the
3171
+ /// first value of the map. The values of the
3172
+ /// map can be accessed in the <tt>[beginValue, endValue)</tt>
3173
+ /// range.
3174
+ ValueIt beginValue() const {
3175
+ return ValueIt(_first.begin());
3176
+ }
3177
+
3178
+ /// \brief Returns an iterator after the last value.
3179
+ ///
3180
+ /// Returns an STL compatible iterator after the
3181
+ /// last value of the map. The values of the
3182
+ /// map can be accessed in the <tt>[beginValue, endValue)</tt>
3183
+ /// range.
3184
+ ValueIt endValue() const {
3185
+ return ValueIt(_first.end());
3186
+ }
3187
+
3188
+ /// \brief Set operation of the map.
3189
+ ///
3190
+ /// Set operation of the map.
3191
+ void set(const Key& key, const Value& value) {
3192
+ unlace(key);
3193
+ Parent::operator[](key).value = value;
3194
+ lace(key);
3195
+ }
3196
+
3197
+ /// \brief Const subscript operator of the map.
3198
+ ///
3199
+ /// Const subscript operator of the map.
3200
+ const Value& operator[](const Key& key) const {
3201
+ return Parent::operator[](key).value;
3202
+ }
3203
+
3204
+ /// \brief Iterator for the keys with the same value.
3205
+ ///
3206
+ /// Iterator for the keys with the same value. It works
3207
+ /// like a graph item iterator, it can be converted to
3208
+ /// the item type of the map, incremented with \c ++ operator, and
3209
+ /// if the iterator leaves the last valid item, it will be equal to
3210
+ /// \c INVALID.
3211
+ class ItemIt : public Key {
3212
+ public:
3213
+ typedef Key Parent;
3214
+
3215
+ /// \brief Invalid constructor \& conversion.
3216
+ ///
3217
+ /// This constructor initializes the iterator to be invalid.
3218
+ /// \sa Invalid for more details.
3219
+ ItemIt(Invalid) : Parent(INVALID), _map(0) {}
3220
+
3221
+ /// \brief Creates an iterator with a value.
3222
+ ///
3223
+ /// Creates an iterator with a value. It iterates on the
3224
+ /// keys which have the given value.
3225
+ /// \param map The IterableValueMap
3226
+ /// \param value The value
3227
+ ItemIt(const IterableValueMap& map, const Value& value) : _map(&map) {
3228
+ typename std::map<Value, Key>::const_iterator it =
3229
+ map._first.find(value);
3230
+ if (it == map._first.end()) {
3231
+ Parent::operator=(INVALID);
3232
+ } else {
3233
+ Parent::operator=(it->second);
3234
+ }
3235
+ }
3236
+
3237
+ /// \brief Increment operator.
3238
+ ///
3239
+ /// Increment Operator.
3240
+ ItemIt& operator++() {
3241
+ Parent::operator=(_map->IterableValueMap::Parent::
3242
+ operator[](static_cast<Parent&>(*this)).next);
3243
+ return *this;
3244
+ }
3245
+
3246
+
3247
+ private:
3248
+ const IterableValueMap* _map;
3249
+ };
3250
+
3251
+ protected:
3252
+
3253
+ virtual void add(const Key& key) {
3254
+ Parent::add(key);
3255
+ lace(key);
3256
+ }
3257
+
3258
+ virtual void add(const std::vector<Key>& keys) {
3259
+ Parent::add(keys);
3260
+ for (int i = 0; i < int(keys.size()); ++i) {
3261
+ lace(keys[i]);
3262
+ }
3263
+ }
3264
+
3265
+ virtual void erase(const Key& key) {
3266
+ unlace(key);
3267
+ Parent::erase(key);
3268
+ }
3269
+
3270
+ virtual void erase(const std::vector<Key>& keys) {
3271
+ for (int i = 0; i < int(keys.size()); ++i) {
3272
+ unlace(keys[i]);
3273
+ }
3274
+ Parent::erase(keys);
3275
+ }
3276
+
3277
+ virtual void build() {
3278
+ Parent::build();
3279
+ for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
3280
+ lace(it);
3281
+ }
3282
+ }
3283
+
3284
+ virtual void clear() {
3285
+ _first.clear();
3286
+ Parent::clear();
3287
+ }
3288
+
3289
+ private:
3290
+ std::map<Value, Key> _first;
3291
+ };
3292
+
3293
+ /// \brief Map of the source nodes of arcs in a digraph.
3294
+ ///
3295
+ /// SourceMap provides access for the source node of each arc in a digraph,
3296
+ /// which is returned by the \c source() function of the digraph.
3297
+ /// \tparam GR The digraph type.
3298
+ /// \see TargetMap
3299
+ template <typename GR>
3300
+ class SourceMap {
3301
+ public:
3302
+
3303
+ /// The key type (the \c Arc type of the digraph).
3304
+ typedef typename GR::Arc Key;
3305
+ /// The value type (the \c Node type of the digraph).
3306
+ typedef typename GR::Node Value;
3307
+
3308
+ /// \brief Constructor
3309
+ ///
3310
+ /// Constructor.
3311
+ /// \param digraph The digraph that the map belongs to.
3312
+ explicit SourceMap(const GR& digraph) : _graph(digraph) {}
3313
+
3314
+ /// \brief Returns the source node of the given arc.
3315
+ ///
3316
+ /// Returns the source node of the given arc.
3317
+ Value operator[](const Key& arc) const {
3318
+ return _graph.source(arc);
3319
+ }
3320
+
3321
+ private:
3322
+ const GR& _graph;
3323
+ };
3324
+
3325
+ /// \brief Returns a \c SourceMap class.
3326
+ ///
3327
+ /// This function just returns an \c SourceMap class.
3328
+ /// \relates SourceMap
3329
+ template <typename GR>
3330
+ inline SourceMap<GR> sourceMap(const GR& graph) {
3331
+ return SourceMap<GR>(graph);
3332
+ }
3333
+
3334
+ /// \brief Map of the target nodes of arcs in a digraph.
3335
+ ///
3336
+ /// TargetMap provides access for the target node of each arc in a digraph,
3337
+ /// which is returned by the \c target() function of the digraph.
3338
+ /// \tparam GR The digraph type.
3339
+ /// \see SourceMap
3340
+ template <typename GR>
3341
+ class TargetMap {
3342
+ public:
3343
+
3344
+ /// The key type (the \c Arc type of the digraph).
3345
+ typedef typename GR::Arc Key;
3346
+ /// The value type (the \c Node type of the digraph).
3347
+ typedef typename GR::Node Value;
3348
+
3349
+ /// \brief Constructor
3350
+ ///
3351
+ /// Constructor.
3352
+ /// \param digraph The digraph that the map belongs to.
3353
+ explicit TargetMap(const GR& digraph) : _graph(digraph) {}
3354
+
3355
+ /// \brief Returns the target node of the given arc.
3356
+ ///
3357
+ /// Returns the target node of the given arc.
3358
+ Value operator[](const Key& e) const {
3359
+ return _graph.target(e);
3360
+ }
3361
+
3362
+ private:
3363
+ const GR& _graph;
3364
+ };
3365
+
3366
+ /// \brief Returns a \c TargetMap class.
3367
+ ///
3368
+ /// This function just returns a \c TargetMap class.
3369
+ /// \relates TargetMap
3370
+ template <typename GR>
3371
+ inline TargetMap<GR> targetMap(const GR& graph) {
3372
+ return TargetMap<GR>(graph);
3373
+ }
3374
+
3375
+ /// \brief Map of the "forward" directed arc view of edges in a graph.
3376
+ ///
3377
+ /// ForwardMap provides access for the "forward" directed arc view of
3378
+ /// each edge in a graph, which is returned by the \c direct() function
3379
+ /// of the graph with \c true parameter.
3380
+ /// \tparam GR The graph type.
3381
+ /// \see BackwardMap
3382
+ template <typename GR>
3383
+ class ForwardMap {
3384
+ public:
3385
+
3386
+ /// The key type (the \c Edge type of the digraph).
3387
+ typedef typename GR::Edge Key;
3388
+ /// The value type (the \c Arc type of the digraph).
3389
+ typedef typename GR::Arc Value;
3390
+
3391
+ /// \brief Constructor
3392
+ ///
3393
+ /// Constructor.
3394
+ /// \param graph The graph that the map belongs to.
3395
+ explicit ForwardMap(const GR& graph) : _graph(graph) {}
3396
+
3397
+ /// \brief Returns the "forward" directed arc view of the given edge.
3398
+ ///
3399
+ /// Returns the "forward" directed arc view of the given edge.
3400
+ Value operator[](const Key& key) const {
3401
+ return _graph.direct(key, true);
3402
+ }
3403
+
3404
+ private:
3405
+ const GR& _graph;
3406
+ };
3407
+
3408
+ /// \brief Returns a \c ForwardMap class.
3409
+ ///
3410
+ /// This function just returns an \c ForwardMap class.
3411
+ /// \relates ForwardMap
3412
+ template <typename GR>
3413
+ inline ForwardMap<GR> forwardMap(const GR& graph) {
3414
+ return ForwardMap<GR>(graph);
3415
+ }
3416
+
3417
+ /// \brief Map of the "backward" directed arc view of edges in a graph.
3418
+ ///
3419
+ /// BackwardMap provides access for the "backward" directed arc view of
3420
+ /// each edge in a graph, which is returned by the \c direct() function
3421
+ /// of the graph with \c false parameter.
3422
+ /// \tparam GR The graph type.
3423
+ /// \see ForwardMap
3424
+ template <typename GR>
3425
+ class BackwardMap {
3426
+ public:
3427
+
3428
+ /// The key type (the \c Edge type of the digraph).
3429
+ typedef typename GR::Edge Key;
3430
+ /// The value type (the \c Arc type of the digraph).
3431
+ typedef typename GR::Arc Value;
3432
+
3433
+ /// \brief Constructor
3434
+ ///
3435
+ /// Constructor.
3436
+ /// \param graph The graph that the map belongs to.
3437
+ explicit BackwardMap(const GR& graph) : _graph(graph) {}
3438
+
3439
+ /// \brief Returns the "backward" directed arc view of the given edge.
3440
+ ///
3441
+ /// Returns the "backward" directed arc view of the given edge.
3442
+ Value operator[](const Key& key) const {
3443
+ return _graph.direct(key, false);
3444
+ }
3445
+
3446
+ private:
3447
+ const GR& _graph;
3448
+ };
3449
+
3450
+ /// \brief Returns a \c BackwardMap class
3451
+
3452
+ /// This function just returns a \c BackwardMap class.
3453
+ /// \relates BackwardMap
3454
+ template <typename GR>
3455
+ inline BackwardMap<GR> backwardMap(const GR& graph) {
3456
+ return BackwardMap<GR>(graph);
3457
+ }
3458
+
3459
+ /// \brief Map of the in-degrees of nodes in a digraph.
3460
+ ///
3461
+ /// This map returns the in-degree of a node. Once it is constructed,
3462
+ /// the degrees are stored in a standard \c NodeMap, so each query is done
3463
+ /// in constant time. On the other hand, the values are updated automatically
3464
+ /// whenever the digraph changes.
3465
+ ///
3466
+ /// \warning Besides \c addNode() and \c addArc(), a digraph structure
3467
+ /// may provide alternative ways to modify the digraph.
3468
+ /// The correct behavior of InDegMap is not guarantied if these additional
3469
+ /// features are used. For example, the functions
3470
+ /// \ref ListDigraph::changeSource() "changeSource()",
3471
+ /// \ref ListDigraph::changeTarget() "changeTarget()" and
3472
+ /// \ref ListDigraph::reverseArc() "reverseArc()"
3473
+ /// of \ref ListDigraph will \e not update the degree values correctly.
3474
+ ///
3475
+ /// \sa OutDegMap
3476
+ template <typename GR>
3477
+ class InDegMap
3478
+ : protected ItemSetTraits<GR, typename GR::Arc>
3479
+ ::ItemNotifier::ObserverBase {
3480
+
3481
+ public:
3482
+
3483
+ /// The graph type of InDegMap
3484
+ typedef GR Graph;
3485
+ typedef GR Digraph;
3486
+ /// The key type
3487
+ typedef typename Digraph::Node Key;
3488
+ /// The value type
3489
+ typedef int Value;
3490
+
3491
+ typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
3492
+ ::ItemNotifier::ObserverBase Parent;
3493
+
3494
+ private:
3495
+
3496
+ class AutoNodeMap
3497
+ : public ItemSetTraits<Digraph, Key>::template Map<int>::Type {
3498
+ public:
3499
+
3500
+ typedef typename ItemSetTraits<Digraph, Key>::
3501
+ template Map<int>::Type Parent;
3502
+
3503
+ AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
3504
+
3505
+ virtual void add(const Key& key) {
3506
+ Parent::add(key);
3507
+ Parent::set(key, 0);
3508
+ }
3509
+
3510
+ virtual void add(const std::vector<Key>& keys) {
3511
+ Parent::add(keys);
3512
+ for (int i = 0; i < int(keys.size()); ++i) {
3513
+ Parent::set(keys[i], 0);
3514
+ }
3515
+ }
3516
+
3517
+ virtual void build() {
3518
+ Parent::build();
3519
+ Key it;
3520
+ typename Parent::Notifier* nf = Parent::notifier();
3521
+ for (nf->first(it); it != INVALID; nf->next(it)) {
3522
+ Parent::set(it, 0);
3523
+ }
3524
+ }
3525
+ };
3526
+
3527
+ public:
3528
+
3529
+ /// \brief Constructor.
3530
+ ///
3531
+ /// Constructor for creating an in-degree map.
3532
+ explicit InDegMap(const Digraph& graph)
3533
+ : _digraph(graph), _deg(graph) {
3534
+ Parent::attach(_digraph.notifier(typename Digraph::Arc()));
3535
+
3536
+ for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
3537
+ _deg[it] = countInArcs(_digraph, it);
3538
+ }
3539
+ }
3540
+
3541
+ /// \brief Gives back the in-degree of a Node.
3542
+ ///
3543
+ /// Gives back the in-degree of a Node.
3544
+ int operator[](const Key& key) const {
3545
+ return _deg[key];
3546
+ }
3547
+
3548
+ protected:
3549
+
3550
+ typedef typename Digraph::Arc Arc;
3551
+
3552
+ virtual void add(const Arc& arc) {
3553
+ ++_deg[_digraph.target(arc)];
3554
+ }
3555
+
3556
+ virtual void add(const std::vector<Arc>& arcs) {
3557
+ for (int i = 0; i < int(arcs.size()); ++i) {
3558
+ ++_deg[_digraph.target(arcs[i])];
3559
+ }
3560
+ }
3561
+
3562
+ virtual void erase(const Arc& arc) {
3563
+ --_deg[_digraph.target(arc)];
3564
+ }
3565
+
3566
+ virtual void erase(const std::vector<Arc>& arcs) {
3567
+ for (int i = 0; i < int(arcs.size()); ++i) {
3568
+ --_deg[_digraph.target(arcs[i])];
3569
+ }
3570
+ }
3571
+
3572
+ virtual void build() {
3573
+ for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
3574
+ _deg[it] = countInArcs(_digraph, it);
3575
+ }
3576
+ }
3577
+
3578
+ virtual void clear() {
3579
+ for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
3580
+ _deg[it] = 0;
3581
+ }
3582
+ }
3583
+ private:
3584
+
3585
+ const Digraph& _digraph;
3586
+ AutoNodeMap _deg;
3587
+ };
3588
+
3589
+ /// \brief Map of the out-degrees of nodes in a digraph.
3590
+ ///
3591
+ /// This map returns the out-degree of a node. Once it is constructed,
3592
+ /// the degrees are stored in a standard \c NodeMap, so each query is done
3593
+ /// in constant time. On the other hand, the values are updated automatically
3594
+ /// whenever the digraph changes.
3595
+ ///
3596
+ /// \warning Besides \c addNode() and \c addArc(), a digraph structure
3597
+ /// may provide alternative ways to modify the digraph.
3598
+ /// The correct behavior of OutDegMap is not guarantied if these additional
3599
+ /// features are used. For example, the functions
3600
+ /// \ref ListDigraph::changeSource() "changeSource()",
3601
+ /// \ref ListDigraph::changeTarget() "changeTarget()" and
3602
+ /// \ref ListDigraph::reverseArc() "reverseArc()"
3603
+ /// of \ref ListDigraph will \e not update the degree values correctly.
3604
+ ///
3605
+ /// \sa InDegMap
3606
+ template <typename GR>
3607
+ class OutDegMap
3608
+ : protected ItemSetTraits<GR, typename GR::Arc>
3609
+ ::ItemNotifier::ObserverBase {
3610
+
3611
+ public:
3612
+
3613
+ /// The graph type of OutDegMap
3614
+ typedef GR Graph;
3615
+ typedef GR Digraph;
3616
+ /// The key type
3617
+ typedef typename Digraph::Node Key;
3618
+ /// The value type
3619
+ typedef int Value;
3620
+
3621
+ typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
3622
+ ::ItemNotifier::ObserverBase Parent;
3623
+
3624
+ private:
3625
+
3626
+ class AutoNodeMap
3627
+ : public ItemSetTraits<Digraph, Key>::template Map<int>::Type {
3628
+ public:
3629
+
3630
+ typedef typename ItemSetTraits<Digraph, Key>::
3631
+ template Map<int>::Type Parent;
3632
+
3633
+ AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
3634
+
3635
+ virtual void add(const Key& key) {
3636
+ Parent::add(key);
3637
+ Parent::set(key, 0);
3638
+ }
3639
+ virtual void add(const std::vector<Key>& keys) {
3640
+ Parent::add(keys);
3641
+ for (int i = 0; i < int(keys.size()); ++i) {
3642
+ Parent::set(keys[i], 0);
3643
+ }
3644
+ }
3645
+ virtual void build() {
3646
+ Parent::build();
3647
+ Key it;
3648
+ typename Parent::Notifier* nf = Parent::notifier();
3649
+ for (nf->first(it); it != INVALID; nf->next(it)) {
3650
+ Parent::set(it, 0);
3651
+ }
3652
+ }
3653
+ };
3654
+
3655
+ public:
3656
+
3657
+ /// \brief Constructor.
3658
+ ///
3659
+ /// Constructor for creating an out-degree map.
3660
+ explicit OutDegMap(const Digraph& graph)
3661
+ : _digraph(graph), _deg(graph) {
3662
+ Parent::attach(_digraph.notifier(typename Digraph::Arc()));
3663
+
3664
+ for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
3665
+ _deg[it] = countOutArcs(_digraph, it);
3666
+ }
3667
+ }
3668
+
3669
+ /// \brief Gives back the out-degree of a Node.
3670
+ ///
3671
+ /// Gives back the out-degree of a Node.
3672
+ int operator[](const Key& key) const {
3673
+ return _deg[key];
3674
+ }
3675
+
3676
+ protected:
3677
+
3678
+ typedef typename Digraph::Arc Arc;
3679
+
3680
+ virtual void add(const Arc& arc) {
3681
+ ++_deg[_digraph.source(arc)];
3682
+ }
3683
+
3684
+ virtual void add(const std::vector<Arc>& arcs) {
3685
+ for (int i = 0; i < int(arcs.size()); ++i) {
3686
+ ++_deg[_digraph.source(arcs[i])];
3687
+ }
3688
+ }
3689
+
3690
+ virtual void erase(const Arc& arc) {
3691
+ --_deg[_digraph.source(arc)];
3692
+ }
3693
+
3694
+ virtual void erase(const std::vector<Arc>& arcs) {
3695
+ for (int i = 0; i < int(arcs.size()); ++i) {
3696
+ --_deg[_digraph.source(arcs[i])];
3697
+ }
3698
+ }
3699
+
3700
+ virtual void build() {
3701
+ for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
3702
+ _deg[it] = countOutArcs(_digraph, it);
3703
+ }
3704
+ }
3705
+
3706
+ virtual void clear() {
3707
+ for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
3708
+ _deg[it] = 0;
3709
+ }
3710
+ }
3711
+ private:
3712
+
3713
+ const Digraph& _digraph;
3714
+ AutoNodeMap _deg;
3715
+ };
3716
+
3717
+ /// \brief Potential difference map
3718
+ ///
3719
+ /// PotentialDifferenceMap returns the difference between the potentials of
3720
+ /// the source and target nodes of each arc in a digraph, i.e. it returns
3721
+ /// \code
3722
+ /// potential[gr.target(arc)] - potential[gr.source(arc)].
3723
+ /// \endcode
3724
+ /// \tparam GR The digraph type.
3725
+ /// \tparam POT A node map storing the potentials.
3726
+ template <typename GR, typename POT>
3727
+ class PotentialDifferenceMap {
3728
+ public:
3729
+ /// Key type
3730
+ typedef typename GR::Arc Key;
3731
+ /// Value type
3732
+ typedef typename POT::Value Value;
3733
+
3734
+ /// \brief Constructor
3735
+ ///
3736
+ /// Contructor of the map.
3737
+ explicit PotentialDifferenceMap(const GR& gr,
3738
+ const POT& potential)
3739
+ : _digraph(gr), _potential(potential) {}
3740
+
3741
+ /// \brief Returns the potential difference for the given arc.
3742
+ ///
3743
+ /// Returns the potential difference for the given arc, i.e.
3744
+ /// \code
3745
+ /// potential[gr.target(arc)] - potential[gr.source(arc)].
3746
+ /// \endcode
3747
+ Value operator[](const Key& arc) const {
3748
+ return _potential[_digraph.target(arc)] -
3749
+ _potential[_digraph.source(arc)];
3750
+ }
3751
+
3752
+ private:
3753
+ const GR& _digraph;
3754
+ const POT& _potential;
3755
+ };
3756
+
3757
+ /// \brief Returns a PotentialDifferenceMap.
3758
+ ///
3759
+ /// This function just returns a PotentialDifferenceMap.
3760
+ /// \relates PotentialDifferenceMap
3761
+ template <typename GR, typename POT>
3762
+ PotentialDifferenceMap<GR, POT>
3763
+ potentialDifferenceMap(const GR& gr, const POT& potential) {
3764
+ return PotentialDifferenceMap<GR, POT>(gr, potential);
3765
+ }
3766
+
3767
+
3768
+ /// \brief Copy the values of a graph map to another map.
3769
+ ///
3770
+ /// This function copies the values of a graph map to another graph map.
3771
+ /// \c To::Key must be equal or convertible to \c From::Key and
3772
+ /// \c From::Value must be equal or convertible to \c To::Value.
3773
+ ///
3774
+ /// For example, an edge map of \c int value type can be copied to
3775
+ /// an arc map of \c double value type in an undirected graph, but
3776
+ /// an arc map cannot be copied to an edge map.
3777
+ /// Note that even a \ref ConstMap can be copied to a standard graph map,
3778
+ /// but \ref mapFill() can also be used for this purpose.
3779
+ ///
3780
+ /// \param gr The graph for which the maps are defined.
3781
+ /// \param from The map from which the values have to be copied.
3782
+ /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
3783
+ /// \param to The map to which the values have to be copied.
3784
+ /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
3785
+ template <typename GR, typename From, typename To>
3786
+ void mapCopy(const GR& gr, const From& from, To& to) {
3787
+ typedef typename To::Key Item;
3788
+ typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
3789
+
3790
+ for (ItemIt it(gr); it != INVALID; ++it) {
3791
+ to.set(it, from[it]);
3792
+ }
3793
+ }
3794
+
3795
+ /// \brief Compare two graph maps.
3796
+ ///
3797
+ /// This function compares the values of two graph maps. It returns
3798
+ /// \c true if the maps assign the same value for all items in the graph.
3799
+ /// The \c Key type of the maps (\c Node, \c Arc or \c Edge) must be equal
3800
+ /// and their \c Value types must be comparable using \c %operator==().
3801
+ ///
3802
+ /// \param gr The graph for which the maps are defined.
3803
+ /// \param map1 The first map.
3804
+ /// \param map2 The second map.
3805
+ template <typename GR, typename Map1, typename Map2>
3806
+ bool mapCompare(const GR& gr, const Map1& map1, const Map2& map2) {
3807
+ typedef typename Map2::Key Item;
3808
+ typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
3809
+
3810
+ for (ItemIt it(gr); it != INVALID; ++it) {
3811
+ if (!(map1[it] == map2[it])) return false;
3812
+ }
3813
+ return true;
3814
+ }
3815
+
3816
+ /// \brief Return an item having minimum value of a graph map.
3817
+ ///
3818
+ /// This function returns an item (\c Node, \c Arc or \c Edge) having
3819
+ /// minimum value of the given graph map.
3820
+ /// If the item set is empty, it returns \c INVALID.
3821
+ ///
3822
+ /// \param gr The graph for which the map is defined.
3823
+ /// \param map The graph map.
3824
+ template <typename GR, typename Map>
3825
+ typename Map::Key mapMin(const GR& gr, const Map& map) {
3826
+ return mapMin(gr, map, std::less<typename Map::Value>());
3827
+ }
3828
+
3829
+ /// \brief Return an item having minimum value of a graph map.
3830
+ ///
3831
+ /// This function returns an item (\c Node, \c Arc or \c Edge) having
3832
+ /// minimum value of the given graph map.
3833
+ /// If the item set is empty, it returns \c INVALID.
3834
+ ///
3835
+ /// \param gr The graph for which the map is defined.
3836
+ /// \param map The graph map.
3837
+ /// \param comp Comparison function object.
3838
+ template <typename GR, typename Map, typename Comp>
3839
+ typename Map::Key mapMin(const GR& gr, const Map& map, const Comp& comp) {
3840
+ typedef typename Map::Key Item;
3841
+ typedef typename Map::Value Value;
3842
+ typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
3843
+
3844
+ ItemIt min_item(gr);
3845
+ if (min_item == INVALID) return INVALID;
3846
+ Value min = map[min_item];
3847
+ for (ItemIt it(gr); it != INVALID; ++it) {
3848
+ if (comp(map[it], min)) {
3849
+ min = map[it];
3850
+ min_item = it;
3851
+ }
3852
+ }
3853
+ return min_item;
3854
+ }
3855
+
3856
+ /// \brief Return an item having maximum value of a graph map.
3857
+ ///
3858
+ /// This function returns an item (\c Node, \c Arc or \c Edge) having
3859
+ /// maximum value of the given graph map.
3860
+ /// If the item set is empty, it returns \c INVALID.
3861
+ ///
3862
+ /// \param gr The graph for which the map is defined.
3863
+ /// \param map The graph map.
3864
+ template <typename GR, typename Map>
3865
+ typename Map::Key mapMax(const GR& gr, const Map& map) {
3866
+ return mapMax(gr, map, std::less<typename Map::Value>());
3867
+ }
3868
+
3869
+ /// \brief Return an item having maximum value of a graph map.
3870
+ ///
3871
+ /// This function returns an item (\c Node, \c Arc or \c Edge) having
3872
+ /// maximum value of the given graph map.
3873
+ /// If the item set is empty, it returns \c INVALID.
3874
+ ///
3875
+ /// \param gr The graph for which the map is defined.
3876
+ /// \param map The graph map.
3877
+ /// \param comp Comparison function object.
3878
+ template <typename GR, typename Map, typename Comp>
3879
+ typename Map::Key mapMax(const GR& gr, const Map& map, const Comp& comp) {
3880
+ typedef typename Map::Key Item;
3881
+ typedef typename Map::Value Value;
3882
+ typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
3883
+
3884
+ ItemIt max_item(gr);
3885
+ if (max_item == INVALID) return INVALID;
3886
+ Value max = map[max_item];
3887
+ for (ItemIt it(gr); it != INVALID; ++it) {
3888
+ if (comp(max, map[it])) {
3889
+ max = map[it];
3890
+ max_item = it;
3891
+ }
3892
+ }
3893
+ return max_item;
3894
+ }
3895
+
3896
+ /// \brief Return the minimum value of a graph map.
3897
+ ///
3898
+ /// This function returns the minimum value of the given graph map.
3899
+ /// The corresponding item set of the graph must not be empty.
3900
+ ///
3901
+ /// \param gr The graph for which the map is defined.
3902
+ /// \param map The graph map.
3903
+ template <typename GR, typename Map>
3904
+ typename Map::Value mapMinValue(const GR& gr, const Map& map) {
3905
+ return map[mapMin(gr, map, std::less<typename Map::Value>())];
3906
+ }
3907
+
3908
+ /// \brief Return the minimum value of a graph map.
3909
+ ///
3910
+ /// This function returns the minimum value of the given graph map.
3911
+ /// The corresponding item set of the graph must not be empty.
3912
+ ///
3913
+ /// \param gr The graph for which the map is defined.
3914
+ /// \param map The graph map.
3915
+ /// \param comp Comparison function object.
3916
+ template <typename GR, typename Map, typename Comp>
3917
+ typename Map::Value
3918
+ mapMinValue(const GR& gr, const Map& map, const Comp& comp) {
3919
+ return map[mapMin(gr, map, comp)];
3920
+ }
3921
+
3922
+ /// \brief Return the maximum value of a graph map.
3923
+ ///
3924
+ /// This function returns the maximum value of the given graph map.
3925
+ /// The corresponding item set of the graph must not be empty.
3926
+ ///
3927
+ /// \param gr The graph for which the map is defined.
3928
+ /// \param map The graph map.
3929
+ template <typename GR, typename Map>
3930
+ typename Map::Value mapMaxValue(const GR& gr, const Map& map) {
3931
+ return map[mapMax(gr, map, std::less<typename Map::Value>())];
3932
+ }
3933
+
3934
+ /// \brief Return the maximum value of a graph map.
3935
+ ///
3936
+ /// This function returns the maximum value of the given graph map.
3937
+ /// The corresponding item set of the graph must not be empty.
3938
+ ///
3939
+ /// \param gr The graph for which the map is defined.
3940
+ /// \param map The graph map.
3941
+ /// \param comp Comparison function object.
3942
+ template <typename GR, typename Map, typename Comp>
3943
+ typename Map::Value
3944
+ mapMaxValue(const GR& gr, const Map& map, const Comp& comp) {
3945
+ return map[mapMax(gr, map, comp)];
3946
+ }
3947
+
3948
+ /// \brief Return an item having a specified value in a graph map.
3949
+ ///
3950
+ /// This function returns an item (\c Node, \c Arc or \c Edge) having
3951
+ /// the specified assigned value in the given graph map.
3952
+ /// If no such item exists, it returns \c INVALID.
3953
+ ///
3954
+ /// \param gr The graph for which the map is defined.
3955
+ /// \param map The graph map.
3956
+ /// \param val The value that have to be found.
3957
+ template <typename GR, typename Map>
3958
+ typename Map::Key
3959
+ mapFind(const GR& gr, const Map& map, const typename Map::Value& val) {
3960
+ typedef typename Map::Key Item;
3961
+ typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
3962
+
3963
+ for (ItemIt it(gr); it != INVALID; ++it) {
3964
+ if (map[it] == val) return it;
3965
+ }
3966
+ return INVALID;
3967
+ }
3968
+
3969
+ /// \brief Return an item having value for which a certain predicate is
3970
+ /// true in a graph map.
3971
+ ///
3972
+ /// This function returns an item (\c Node, \c Arc or \c Edge) having
3973
+ /// such assigned value for which the specified predicate is true
3974
+ /// in the given graph map.
3975
+ /// If no such item exists, it returns \c INVALID.
3976
+ ///
3977
+ /// \param gr The graph for which the map is defined.
3978
+ /// \param map The graph map.
3979
+ /// \param pred The predicate function object.
3980
+ template <typename GR, typename Map, typename Pred>
3981
+ typename Map::Key
3982
+ mapFindIf(const GR& gr, const Map& map, const Pred& pred) {
3983
+ typedef typename Map::Key Item;
3984
+ typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
3985
+
3986
+ for (ItemIt it(gr); it != INVALID; ++it) {
3987
+ if (pred(map[it])) return it;
3988
+ }
3989
+ return INVALID;
3990
+ }
3991
+
3992
+ /// \brief Return the number of items having a specified value in a
3993
+ /// graph map.
3994
+ ///
3995
+ /// This function returns the number of items (\c Node, \c Arc or \c Edge)
3996
+ /// having the specified assigned value in the given graph map.
3997
+ ///
3998
+ /// \param gr The graph for which the map is defined.
3999
+ /// \param map The graph map.
4000
+ /// \param val The value that have to be counted.
4001
+ template <typename GR, typename Map>
4002
+ int mapCount(const GR& gr, const Map& map, const typename Map::Value& val) {
4003
+ typedef typename Map::Key Item;
4004
+ typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
4005
+
4006
+ int cnt = 0;
4007
+ for (ItemIt it(gr); it != INVALID; ++it) {
4008
+ if (map[it] == val) ++cnt;
4009
+ }
4010
+ return cnt;
4011
+ }
4012
+
4013
+ /// \brief Return the number of items having values for which a certain
4014
+ /// predicate is true in a graph map.
4015
+ ///
4016
+ /// This function returns the number of items (\c Node, \c Arc or \c Edge)
4017
+ /// having such assigned values for which the specified predicate is true
4018
+ /// in the given graph map.
4019
+ ///
4020
+ /// \param gr The graph for which the map is defined.
4021
+ /// \param map The graph map.
4022
+ /// \param pred The predicate function object.
4023
+ template <typename GR, typename Map, typename Pred>
4024
+ int mapCountIf(const GR& gr, const Map& map, const Pred& pred) {
4025
+ typedef typename Map::Key Item;
4026
+ typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
4027
+
4028
+ int cnt = 0;
4029
+ for (ItemIt it(gr); it != INVALID; ++it) {
4030
+ if (pred(map[it])) ++cnt;
4031
+ }
4032
+ return cnt;
4033
+ }
4034
+
4035
+ /// \brief Fill a graph map with a certain value.
4036
+ ///
4037
+ /// This function sets the specified value for all items (\c Node,
4038
+ /// \c Arc or \c Edge) in the given graph map.
4039
+ ///
4040
+ /// \param gr The graph for which the map is defined.
4041
+ /// \param map The graph map. It must conform to the
4042
+ /// \ref concepts::WriteMap "WriteMap" concept.
4043
+ /// \param val The value.
4044
+ template <typename GR, typename Map>
4045
+ void mapFill(const GR& gr, Map& map, const typename Map::Value& val) {
4046
+ typedef typename Map::Key Item;
4047
+ typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
4048
+
4049
+ for (ItemIt it(gr); it != INVALID; ++it) {
4050
+ map.set(it, val);
4051
+ }
4052
+ }
4053
+
4054
+ /// @}
4055
+ }
4056
+
4057
+ #endif // LEMON_MAPS_H