More exact concept checking for map concepts.
3 * This file is a part of LEMON, a generic C++ optimization library
5 * Copyright (C) 2003-2008
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 * (Egervary Research Group on Combinatorial Optimization, EGRES).
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.
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
26 #include <lemon/bits/utility.h>
27 // #include <lemon/bits/traits.h>
31 ///\brief Miscellaneous property maps
40 /// Base class of maps.
42 /// Base class of maps.
43 /// It provides the necessary <tt>typedef</tt>s required by the map concept.
44 template<typename K, typename T>
47 /// The key type of the map.
49 /// The value type of the map. (The type of objects associated with the keys).
53 /// Null map. (a.k.a. DoNothingMap)
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 template<typename K, typename T>
60 class NullMap : public MapBase<K, T> {
62 typedef MapBase<K, T> Parent;
63 typedef typename Parent::Key Key;
64 typedef typename Parent::Value Value;
66 /// Gives back a default constructed element.
67 T operator[](const K&) const { return T(); }
68 /// Absorbs the value.
69 void set(const K&, const T&) {}
72 ///Returns a \c NullMap class
74 ///This function just returns a \c NullMap class.
76 template <typename K, typename V>
77 NullMap<K, V> nullMap() {
78 return NullMap<K, V>();
84 /// This is a \ref concepts::ReadMap "readable" map which assigns a
85 /// specified value to each key.
86 /// In other aspects it is equivalent to \c NullMap.
87 template<typename K, typename T>
88 class ConstMap : public MapBase<K, T> {
93 typedef MapBase<K, T> Parent;
94 typedef typename Parent::Key Key;
95 typedef typename Parent::Value Value;
97 /// Default constructor
99 /// Default constructor.
100 /// The value of the map will be uninitialized.
101 /// (More exactly it will be default constructed.)
104 /// Constructor with specified initial value
106 /// Constructor with specified initial value.
107 /// \param _v is the initial value of the map.
108 ConstMap(const T &_v) : v(_v) {}
111 T operator[](const K&) const { return v; }
114 void setAll(const T &t) {
118 template<typename T1>
119 ConstMap(const ConstMap<K, T1> &, const T &_v) : v(_v) {}
122 ///Returns a \c ConstMap class
124 ///This function just returns a \c ConstMap class.
126 template<typename K, typename V>
127 inline ConstMap<K, V> constMap(const V &v) {
128 return ConstMap<K, V>(v);
132 template<typename T, T v>
135 /// Constant map with inlined constant value.
137 /// This is a \ref concepts::ReadMap "readable" map which assigns a
138 /// specified value to each key.
139 /// In other aspects it is equivalent to \c NullMap.
140 template<typename K, typename V, V v>
141 class ConstMap<K, Const<V, v> > : public MapBase<K, V> {
143 typedef MapBase<K, V> Parent;
144 typedef typename Parent::Key Key;
145 typedef typename Parent::Value Value;
149 V operator[](const K&) const { return v; }
151 void set(const K&, const V&) { }
154 ///Returns a \c ConstMap class with inlined value
156 ///This function just returns a \c ConstMap class with inlined value.
158 template<typename K, typename V, V v>
159 inline ConstMap<K, Const<V, v> > constMap() {
160 return ConstMap<K, Const<V, v> >();
163 ///Map based on \c std::map
165 ///This is essentially a wrapper for \c std::map with addition that
166 ///you can specify a default value different from \c Value().
167 ///It meets the \ref concepts::ReferenceMap "ReferenceMap" concept.
168 template <typename K, typename T, typename Compare = std::less<K> >
169 class StdMap : public MapBase<K, T> {
170 template <typename K1, typename T1, typename C1>
174 typedef MapBase<K, T> Parent;
176 typedef typename Parent::Key Key;
178 typedef typename Parent::Value Value;
180 typedef T& Reference;
181 ///Const reference type
182 typedef const T& ConstReference;
184 typedef True ReferenceMapTag;
188 typedef std::map<K, T, Compare> Map;
194 /// Constructor with specified default value
195 StdMap(const T& value = T()) : _value(value) {}
196 /// \brief Constructs the map from an appropriate \c std::map, and
197 /// explicitly specifies a default value.
198 template <typename T1, typename Comp1>
199 StdMap(const std::map<Key, T1, Comp1> &map, const T& value = T())
200 : _map(map.begin(), map.end()), _value(value) {}
202 /// \brief Constructs a map from an other \ref StdMap.
203 template<typename T1, typename Comp1>
204 StdMap(const StdMap<Key, T1, Comp1> &c)
205 : _map(c._map.begin(), c._map.end()), _value(c._value) {}
209 StdMap& operator=(const StdMap&);
214 Reference operator[](const Key &k) {
215 typename Map::iterator it = _map.lower_bound(k);
216 if (it != _map.end() && !_map.key_comp()(k, it->first))
219 return _map.insert(it, std::make_pair(k, _value))->second;
223 ConstReference operator[](const Key &k) const {
224 typename Map::const_iterator it = _map.find(k);
225 if (it != _map.end())
232 void set(const Key &k, const T &t) {
233 typename Map::iterator it = _map.lower_bound(k);
234 if (it != _map.end() && !_map.key_comp()(k, it->first))
237 _map.insert(it, std::make_pair(k, t));
241 void setAll(const T &t) {
248 ///Returns a \c StdMap class
250 ///This function just returns a \c StdMap class with specified
253 template<typename K, typename V, typename Compare>
254 inline StdMap<K, V, Compare> stdMap(const V& value = V()) {
255 return StdMap<K, V, Compare>(value);
258 ///Returns a \c StdMap class
260 ///This function just returns a \c StdMap class with specified
263 template<typename K, typename V>
264 inline StdMap<K, V, std::less<K> > stdMap(const V& value = V()) {
265 return StdMap<K, V, std::less<K> >(value);
268 ///Returns a \c StdMap class created from an appropriate std::map
270 ///This function just returns a \c StdMap class created from an
271 ///appropriate std::map.
273 template<typename K, typename V, typename Compare>
274 inline StdMap<K, V, Compare> stdMap( const std::map<K, V, Compare> &map,
275 const V& value = V() ) {
276 return StdMap<K, V, Compare>(map, value);
279 ///Returns a \c StdMap class created from an appropriate std::map
281 ///This function just returns a \c StdMap class created from an
282 ///appropriate std::map.
284 template<typename K, typename V>
285 inline StdMap<K, V, std::less<K> > stdMap( const std::map<K, V, std::less<K> > &map,
286 const V& value = V() ) {
287 return StdMap<K, V, std::less<K> >(map, value);
290 /// \brief Map for storing values for keys from the range <tt>[0..size-1]</tt>
292 /// This map has the <tt>[0..size-1]</tt> keyset and the values
293 /// are stored in a \c std::vector<T> container. It can be used with
294 /// some data structures, for example \c UnionFind, \c BinHeap, when
295 /// the used items are small integer numbers.
296 /// This map meets the \ref concepts::ReferenceMap "ReferenceMap" concept.
298 /// \todo Revise its name
299 template <typename T>
300 class IntegerMap : public MapBase<int, T> {
302 template <typename T1>
303 friend class IntegerMap;
307 typedef MapBase<int, T> Parent;
309 typedef typename Parent::Key Key;
311 typedef typename Parent::Value Value;
313 typedef T& Reference;
315 typedef const T& ConstReference;
317 typedef True ReferenceMapTag;
321 typedef std::vector<T> Vector;
326 /// Constructor with specified default value
327 IntegerMap(int size = 0, const T& value = T()) : _vector(size, value) {}
329 /// \brief Constructs the map from an appropriate \c std::vector.
330 template <typename T1>
331 IntegerMap(const std::vector<T1>& vector)
332 : _vector(vector.begin(), vector.end()) {}
334 /// \brief Constructs a map from an other \ref IntegerMap.
335 template <typename T1>
336 IntegerMap(const IntegerMap<T1> &c)
337 : _vector(c._vector.begin(), c._vector.end()) {}
339 /// \brief Resize the container
340 void resize(int size, const T& value = T()) {
341 _vector.resize(size, value);
346 IntegerMap& operator=(const IntegerMap&);
351 Reference operator[](Key k) {
356 ConstReference operator[](Key k) const {
361 void set(const Key &k, const T& t) {
367 ///Returns an \c IntegerMap class
369 ///This function just returns an \c IntegerMap class.
370 ///\relates IntegerMap
372 inline IntegerMap<T> integerMap(int size = 0, const T& value = T()) {
373 return IntegerMap<T>(size, value);
378 /// \addtogroup map_adaptors
381 /// \brief Identity map.
383 /// This map gives back the given key as value without any
385 template <typename T>
386 class IdentityMap : public MapBase<T, T> {
388 typedef MapBase<T, T> Parent;
389 typedef typename Parent::Key Key;
390 typedef typename Parent::Value Value;
393 const T& operator[](const T& t) const {
398 ///Returns an \c IdentityMap class
400 ///This function just returns an \c IdentityMap class.
401 ///\relates IdentityMap
403 inline IdentityMap<T> identityMap() {
404 return IdentityMap<T>();
408 ///\brief Convert the \c Value of a map to another type using
409 ///the default conversion.
411 ///This \ref concepts::ReadMap "read only map"
412 ///converts the \c Value of a map to type \c T.
413 ///Its \c Key is inherited from \c M.
414 template <typename M, typename T>
415 class ConvertMap : public MapBase<typename M::Key, T> {
418 typedef MapBase<typename M::Key, T> Parent;
419 typedef typename Parent::Key Key;
420 typedef typename Parent::Value Value;
425 ///\param _m is the underlying map.
426 ConvertMap(const M &_m) : m(_m) {};
429 Value operator[](const Key& k) const {return m[k];}
432 ///Returns a \c ConvertMap class
434 ///This function just returns a \c ConvertMap class.
435 ///\relates ConvertMap
436 template<typename T, typename M>
437 inline ConvertMap<M, T> convertMap(const M &m) {
438 return ConvertMap<M, T>(m);
441 ///Simple wrapping of a map
443 ///This \ref concepts::ReadMap "read only map" returns the simple
444 ///wrapping of the given map. Sometimes the reference maps cannot be
445 ///combined with simple read maps. This map adaptor wraps the given
446 ///map to simple read map.
448 ///\sa SimpleWriteMap
450 /// \todo Revise the misleading name
452 class SimpleMap : public MapBase<typename M::Key, typename M::Value> {
456 typedef MapBase<typename M::Key, typename M::Value> Parent;
457 typedef typename Parent::Key Key;
458 typedef typename Parent::Value Value;
461 SimpleMap(const M &_m) : m(_m) {};
463 Value operator[](Key k) const {return m[k];}
466 ///Returns a \c SimpleMap class
468 ///This function just returns a \c SimpleMap class.
469 ///\relates SimpleMap
471 inline SimpleMap<M> simpleMap(const M &m) {
472 return SimpleMap<M>(m);
475 ///Simple writable wrapping of a map
477 ///This \ref concepts::ReadWriteMap "read-write map" returns the simple
478 ///wrapping of the given map. Sometimes the reference maps cannot be
479 ///combined with simple read-write maps. This map adaptor wraps the
480 ///given map to simple read-write map.
484 /// \todo Revise the misleading name
486 class SimpleWriteMap : public MapBase<typename M::Key, typename M::Value> {
490 typedef MapBase<typename M::Key, typename M::Value> Parent;
491 typedef typename Parent::Key Key;
492 typedef typename Parent::Value Value;
495 SimpleWriteMap(M &_m) : m(_m) {};
497 Value operator[](Key k) const {return m[k];}
499 void set(Key k, const Value& c) { m.set(k, c); }
502 ///Returns a \c SimpleWriteMap class
504 ///This function just returns a \c SimpleWriteMap class.
505 ///\relates SimpleWriteMap
507 inline SimpleWriteMap<M> simpleWriteMap(M &m) {
508 return SimpleWriteMap<M>(m);
513 ///This \ref concepts::ReadMap "read only map" returns the sum of the two
515 ///Its \c Key and \c Value are inherited from \c M1.
516 ///The \c Key and \c Value of \c M2 must be convertible to those of \c M1.
517 template<typename M1, typename M2>
518 class AddMap : public MapBase<typename M1::Key, typename M1::Value> {
523 typedef MapBase<typename M1::Key, typename M1::Value> Parent;
524 typedef typename Parent::Key Key;
525 typedef typename Parent::Value Value;
528 AddMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
530 Value operator[](Key k) const {return m1[k]+m2[k];}
533 ///Returns an \c AddMap class
535 ///This function just returns an \c AddMap class.
536 ///\todo Extend the documentation: how to call these type of functions?
539 template<typename M1, typename M2>
540 inline AddMap<M1, M2> addMap(const M1 &m1,const M2 &m2) {
541 return AddMap<M1, M2>(m1,m2);
544 ///Shift a map with a constant.
546 ///This \ref concepts::ReadMap "read only map" returns the sum of the
547 ///given map and a constant value.
548 ///Its \c Key and \c Value are inherited from \c M.
552 /// ShiftMap<X> sh(x,v);
556 /// ConstMap<X::Key, X::Value> c_tmp(v);
557 /// AddMap<X, ConstMap<X::Key, X::Value> > sh(x,v);
561 template<typename M, typename C = typename M::Value>
562 class ShiftMap : public MapBase<typename M::Key, typename M::Value> {
566 typedef MapBase<typename M::Key, typename M::Value> Parent;
567 typedef typename Parent::Key Key;
568 typedef typename Parent::Value Value;
573 ///\param _m is the undelying map.
574 ///\param _v is the shift value.
575 ShiftMap(const M &_m, const C &_v ) : m(_m), v(_v) {};
577 Value operator[](Key k) const {return m[k] + v;}
580 ///Shift a map with a constant (ReadWrite version).
582 ///This \ref concepts::ReadWriteMap "read-write map" returns the sum of the
583 ///given map and a constant value. It makes also possible to write the map.
584 ///Its \c Key and \c Value are inherited from \c M.
587 template<typename M, typename C = typename M::Value>
588 class ShiftWriteMap : public MapBase<typename M::Key, typename M::Value> {
592 typedef MapBase<typename M::Key, typename M::Value> Parent;
593 typedef typename Parent::Key Key;
594 typedef typename Parent::Value Value;
599 ///\param _m is the undelying map.
600 ///\param _v is the shift value.
601 ShiftWriteMap(M &_m, const C &_v ) : m(_m), v(_v) {};
603 Value operator[](Key k) const {return m[k] + v;}
605 void set(Key k, const Value& c) { m.set(k, c - v); }
608 ///Returns a \c ShiftMap class
610 ///This function just returns a \c ShiftMap class.
612 template<typename M, typename C>
613 inline ShiftMap<M, C> shiftMap(const M &m,const C &v) {
614 return ShiftMap<M, C>(m,v);
617 ///Returns a \c ShiftWriteMap class
619 ///This function just returns a \c ShiftWriteMap class.
620 ///\relates ShiftWriteMap
621 template<typename M, typename C>
622 inline ShiftWriteMap<M, C> shiftMap(M &m,const C &v) {
623 return ShiftWriteMap<M, C>(m,v);
626 ///Difference of two maps
628 ///This \ref concepts::ReadMap "read only map" returns the difference
629 ///of the values of the two given maps.
630 ///Its \c Key and \c Value are inherited from \c M1.
631 ///The \c Key and \c Value of \c M2 must be convertible to those of \c M1.
633 /// \todo Revise the misleading name
634 template<typename M1, typename M2>
635 class SubMap : public MapBase<typename M1::Key, typename M1::Value> {
639 typedef MapBase<typename M1::Key, typename M1::Value> Parent;
640 typedef typename Parent::Key Key;
641 typedef typename Parent::Value Value;
644 SubMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
646 Value operator[](Key k) const {return m1[k]-m2[k];}
649 ///Returns a \c SubMap class
651 ///This function just returns a \c SubMap class.
654 template<typename M1, typename M2>
655 inline SubMap<M1, M2> subMap(const M1 &m1, const M2 &m2) {
656 return SubMap<M1, M2>(m1, m2);
659 ///Product of two maps
661 ///This \ref concepts::ReadMap "read only map" returns the product of the
662 ///values of the two given maps.
663 ///Its \c Key and \c Value are inherited from \c M1.
664 ///The \c Key and \c Value of \c M2 must be convertible to those of \c M1.
665 template<typename M1, typename M2>
666 class MulMap : public MapBase<typename M1::Key, typename M1::Value> {
670 typedef MapBase<typename M1::Key, typename M1::Value> Parent;
671 typedef typename Parent::Key Key;
672 typedef typename Parent::Value Value;
675 MulMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
677 Value operator[](Key k) const {return m1[k]*m2[k];}
680 ///Returns a \c MulMap class
682 ///This function just returns a \c MulMap class.
684 template<typename M1, typename M2>
685 inline MulMap<M1, M2> mulMap(const M1 &m1,const M2 &m2) {
686 return MulMap<M1, M2>(m1,m2);
689 ///Scales a map with a constant.
691 ///This \ref concepts::ReadMap "read only map" returns the value of the
692 ///given map multiplied from the left side with a constant value.
693 ///Its \c Key and \c Value are inherited from \c M.
697 /// ScaleMap<X> sc(x,v);
701 /// ConstMap<X::Key, X::Value> c_tmp(v);
702 /// MulMap<X, ConstMap<X::Key, X::Value> > sc(x,v);
706 template<typename M, typename C = typename M::Value>
707 class ScaleMap : public MapBase<typename M::Key, typename M::Value> {
711 typedef MapBase<typename M::Key, typename M::Value> Parent;
712 typedef typename Parent::Key Key;
713 typedef typename Parent::Value Value;
718 ///\param _m is the undelying map.
719 ///\param _v is the scaling value.
720 ScaleMap(const M &_m, const C &_v ) : m(_m), v(_v) {};
722 Value operator[](Key k) const {return v * m[k];}
725 ///Scales a map with a constant (ReadWrite version).
727 ///This \ref concepts::ReadWriteMap "read-write map" returns the value of the
728 ///given map multiplied from the left side with a constant value. It can
729 ///also be used as write map if the \c / operator is defined between
730 ///\c Value and \c C and the given multiplier is not zero.
731 ///Its \c Key and \c Value are inherited from \c M.
734 template<typename M, typename C = typename M::Value>
735 class ScaleWriteMap : public MapBase<typename M::Key, typename M::Value> {
739 typedef MapBase<typename M::Key, typename M::Value> Parent;
740 typedef typename Parent::Key Key;
741 typedef typename Parent::Value Value;
746 ///\param _m is the undelying map.
747 ///\param _v is the scaling value.
748 ScaleWriteMap(M &_m, const C &_v ) : m(_m), v(_v) {};
750 Value operator[](Key k) const {return v * m[k];}
752 void set(Key k, const Value& c) { m.set(k, c / v);}
755 ///Returns a \c ScaleMap class
757 ///This function just returns a \c ScaleMap class.
759 template<typename M, typename C>
760 inline ScaleMap<M, C> scaleMap(const M &m,const C &v) {
761 return ScaleMap<M, C>(m,v);
764 ///Returns a \c ScaleWriteMap class
766 ///This function just returns a \c ScaleWriteMap class.
767 ///\relates ScaleWriteMap
768 template<typename M, typename C>
769 inline ScaleWriteMap<M, C> scaleMap(M &m,const C &v) {
770 return ScaleWriteMap<M, C>(m,v);
773 ///Quotient of two maps
775 ///This \ref concepts::ReadMap "read only map" returns the quotient of the
776 ///values of the two given maps.
777 ///Its \c Key and \c Value are inherited from \c M1.
778 ///The \c Key and \c Value of \c M2 must be convertible to those of \c M1.
779 template<typename M1, typename M2>
780 class DivMap : public MapBase<typename M1::Key, typename M1::Value> {
784 typedef MapBase<typename M1::Key, typename M1::Value> Parent;
785 typedef typename Parent::Key Key;
786 typedef typename Parent::Value Value;
789 DivMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
791 Value operator[](Key k) const {return m1[k]/m2[k];}
794 ///Returns a \c DivMap class
796 ///This function just returns a \c DivMap class.
798 template<typename M1, typename M2>
799 inline DivMap<M1, M2> divMap(const M1 &m1,const M2 &m2) {
800 return DivMap<M1, M2>(m1,m2);
803 ///Composition of two maps
805 ///This \ref concepts::ReadMap "read only map" returns the composition of
807 ///That is to say, if \c m1 is of type \c M1 and \c m2 is of \c M2,
810 /// ComposeMap<M1, M2> cm(m1,m2);
812 /// <tt>cm[x]</tt> will be equal to <tt>m1[m2[x]]</tt>.
814 ///Its \c Key is inherited from \c M2 and its \c Value is from \c M1.
815 ///\c M2::Value must be convertible to \c M1::Key.
819 ///\todo Check the requirements.
820 template <typename M1, typename M2>
821 class ComposeMap : public MapBase<typename M2::Key, typename M1::Value> {
825 typedef MapBase<typename M2::Key, typename M1::Value> Parent;
826 typedef typename Parent::Key Key;
827 typedef typename Parent::Value Value;
830 ComposeMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
835 /// \todo Use the MapTraits once it is ported.
838 //typename MapTraits<M1>::ConstReturnValue
840 operator[](Key k) const {return m1[m2[k]];}
843 ///Returns a \c ComposeMap class
845 ///This function just returns a \c ComposeMap class.
846 ///\relates ComposeMap
847 template <typename M1, typename M2>
848 inline ComposeMap<M1, M2> composeMap(const M1 &m1,const M2 &m2) {
849 return ComposeMap<M1, M2>(m1,m2);
852 ///Combine of two maps using an STL (binary) functor.
854 ///Combine of two maps using an STL (binary) functor.
856 ///This \ref concepts::ReadMap "read only map" takes two maps and a
857 ///binary functor and returns the composition of the two
858 ///given maps unsing the functor.
859 ///That is to say, if \c m1 and \c m2 is of type \c M1 and \c M2
860 ///and \c f is of \c F, then for
862 /// CombineMap<M1,M2,F,V> cm(m1,m2,f);
864 /// <tt>cm[x]</tt> will be equal to <tt>f(m1[x],m2[x])</tt>
866 ///Its \c Key is inherited from \c M1 and its \c Value is \c V.
867 ///\c M2::Value and \c M1::Value must be convertible to the corresponding
868 ///input parameter of \c F and the return type of \c F must be convertible
873 ///\todo Check the requirements.
874 template<typename M1, typename M2, typename F,
875 typename V = typename F::result_type>
876 class CombineMap : public MapBase<typename M1::Key, V> {
881 typedef MapBase<typename M1::Key, V> Parent;
882 typedef typename Parent::Key Key;
883 typedef typename Parent::Value Value;
886 CombineMap(const M1 &_m1,const M2 &_m2,const F &_f = F())
887 : m1(_m1), m2(_m2), f(_f) {};
889 Value operator[](Key k) const {return f(m1[k],m2[k]);}
892 ///Returns a \c CombineMap class
894 ///This function just returns a \c CombineMap class.
896 ///For example if \c m1 and \c m2 are both \c double valued maps, then
898 ///combineMap(m1,m2,std::plus<double>())
905 ///This function is specialized for adaptable binary function
906 ///classes and C++ functions.
908 ///\relates CombineMap
909 template<typename M1, typename M2, typename F, typename V>
910 inline CombineMap<M1, M2, F, V>
911 combineMap(const M1& m1,const M2& m2, const F& f) {
912 return CombineMap<M1, M2, F, V>(m1,m2,f);
915 template<typename M1, typename M2, typename F>
916 inline CombineMap<M1, M2, F, typename F::result_type>
917 combineMap(const M1& m1, const M2& m2, const F& f) {
918 return combineMap<M1, M2, F, typename F::result_type>(m1,m2,f);
921 template<typename M1, typename M2, typename K1, typename K2, typename V>
922 inline CombineMap<M1, M2, V (*)(K1, K2), V>
923 combineMap(const M1 &m1, const M2 &m2, V (*f)(K1, K2)) {
924 return combineMap<M1, M2, V (*)(K1, K2), V>(m1,m2,f);
927 ///Negative value of a map
929 ///This \ref concepts::ReadMap "read only map" returns the negative
930 ///value of the value returned by the given map.
931 ///Its \c Key and \c Value are inherited from \c M.
932 ///The unary \c - operator must be defined for \c Value, of course.
936 class NegMap : public MapBase<typename M::Key, typename M::Value> {
939 typedef MapBase<typename M::Key, typename M::Value> Parent;
940 typedef typename Parent::Key Key;
941 typedef typename Parent::Value Value;
944 NegMap(const M &_m) : m(_m) {};
946 Value operator[](Key k) const {return -m[k];}
949 ///Negative value of a map (ReadWrite version)
951 ///This \ref concepts::ReadWriteMap "read-write map" returns the negative
952 ///value of the value returned by the given map.
953 ///Its \c Key and \c Value are inherited from \c M.
954 ///The unary \c - operator must be defined for \c Value, of course.
958 class NegWriteMap : public MapBase<typename M::Key, typename M::Value> {
961 typedef MapBase<typename M::Key, typename M::Value> Parent;
962 typedef typename Parent::Key Key;
963 typedef typename Parent::Value Value;
966 NegWriteMap(M &_m) : m(_m) {};
968 Value operator[](Key k) const {return -m[k];}
970 void set(Key k, const Value& v) { m.set(k, -v); }
973 ///Returns a \c NegMap class
975 ///This function just returns a \c NegMap class.
977 template <typename M>
978 inline NegMap<M> negMap(const M &m) {
982 ///Returns a \c NegWriteMap class
984 ///This function just returns a \c NegWriteMap class.
985 ///\relates NegWriteMap
986 template <typename M>
987 inline NegWriteMap<M> negMap(M &m) {
988 return NegWriteMap<M>(m);
991 ///Absolute value of a map
993 ///This \ref concepts::ReadMap "read only map" returns the absolute value
994 ///of the value returned by the given map.
995 ///Its \c Key and \c Value are inherited from \c M.
996 ///\c Value must be comparable to \c 0 and the unary \c -
997 ///operator must be defined for it, of course.
999 class AbsMap : public MapBase<typename M::Key, typename M::Value> {
1002 typedef MapBase<typename M::Key, typename M::Value> Parent;
1003 typedef typename Parent::Key Key;
1004 typedef typename Parent::Value Value;
1007 AbsMap(const M &_m) : m(_m) {};
1009 Value operator[](Key k) const {
1011 return tmp >= 0 ? tmp : -tmp;
1016 ///Returns an \c AbsMap class
1018 ///This function just returns an \c AbsMap class.
1020 template<typename M>
1021 inline AbsMap<M> absMap(const M &m) {
1022 return AbsMap<M>(m);
1025 ///Converts an STL style functor to a map
1027 ///This \ref concepts::ReadMap "read only map" returns the value
1028 ///of a given functor.
1030 ///Template parameters \c K and \c V will become its
1031 ///\c Key and \c Value.
1032 ///In most cases they have to be given explicitly because a
1033 ///functor typically does not provide \c argument_type and
1034 ///\c result_type typedefs.
1036 ///Parameter \c F is the type of the used functor.
1039 template<typename F,
1040 typename K = typename F::argument_type,
1041 typename V = typename F::result_type>
1042 class FunctorMap : public MapBase<K, V> {
1045 typedef MapBase<K, V> Parent;
1046 typedef typename Parent::Key Key;
1047 typedef typename Parent::Value Value;
1050 FunctorMap(const F &_f = F()) : f(_f) {}
1052 Value operator[](Key k) const { return f(k);}
1055 ///Returns a \c FunctorMap class
1057 ///This function just returns a \c FunctorMap class.
1059 ///This function is specialized for adaptable binary function
1060 ///classes and C++ functions.
1062 ///\relates FunctorMap
1063 template<typename K, typename V, typename F> inline
1064 FunctorMap<F, K, V> functorMap(const F &f) {
1065 return FunctorMap<F, K, V>(f);
1068 template <typename F> inline
1069 FunctorMap<F, typename F::argument_type, typename F::result_type>
1070 functorMap(const F &f) {
1071 return FunctorMap<F, typename F::argument_type,
1072 typename F::result_type>(f);
1075 template <typename K, typename V> inline
1076 FunctorMap<V (*)(K), K, V> functorMap(V (*f)(K)) {
1077 return FunctorMap<V (*)(K), K, V>(f);
1081 ///Converts a map to an STL style (unary) functor
1083 ///This class Converts a map to an STL style (unary) functor.
1084 ///That is it provides an <tt>operator()</tt> to read its values.
1086 ///For the sake of convenience it also works as
1087 ///a ususal \ref concepts::ReadMap "readable map",
1088 ///i.e. <tt>operator[]</tt> and the \c Key and \c Value typedefs also exist.
1091 template <typename M>
1092 class MapFunctor : public MapBase<typename M::Key, typename M::Value> {
1095 typedef MapBase<typename M::Key, typename M::Value> Parent;
1096 typedef typename Parent::Key Key;
1097 typedef typename Parent::Value Value;
1099 typedef typename M::Key argument_type;
1100 typedef typename M::Value result_type;
1103 MapFunctor(const M &_m) : m(_m) {};
1105 Value operator()(Key k) const {return m[k];}
1107 Value operator[](Key k) const {return m[k];}
1110 ///Returns a \c MapFunctor class
1112 ///This function just returns a \c MapFunctor class.
1113 ///\relates MapFunctor
1114 template<typename M>
1115 inline MapFunctor<M> mapFunctor(const M &m) {
1116 return MapFunctor<M>(m);
1119 ///Just readable version of \ref ForkWriteMap
1121 ///This map has two \ref concepts::ReadMap "readable map"
1122 ///parameters and each read request will be passed just to the
1123 ///first map. This class is the just readable map type of \c ForkWriteMap.
1125 ///The \c Key and \c Value are inherited from \c M1.
1126 ///The \c Key and \c Value of \c M2 must be convertible from those of \c M1.
1130 /// \todo Why is it needed?
1131 template<typename M1, typename M2>
1132 class ForkMap : public MapBase<typename M1::Key, typename M1::Value> {
1136 typedef MapBase<typename M1::Key, typename M1::Value> Parent;
1137 typedef typename Parent::Key Key;
1138 typedef typename Parent::Value Value;
1141 ForkMap(const M1 &_m1, const M2 &_m2) : m1(_m1), m2(_m2) {};
1143 Value operator[](Key k) const {return m1[k];}
1147 ///Applies all map setting operations to two maps
1149 ///This map has two \ref concepts::WriteMap "writable map"
1150 ///parameters and each write request will be passed to both of them.
1151 ///If \c M1 is also \ref concepts::ReadMap "readable",
1152 ///then the read operations will return the
1153 ///corresponding values of \c M1.
1155 ///The \c Key and \c Value are inherited from \c M1.
1156 ///The \c Key and \c Value of \c M2 must be convertible from those of \c M1.
1159 template<typename M1, typename M2>
1160 class ForkWriteMap : public MapBase<typename M1::Key, typename M1::Value> {
1164 typedef MapBase<typename M1::Key, typename M1::Value> Parent;
1165 typedef typename Parent::Key Key;
1166 typedef typename Parent::Value Value;
1169 ForkWriteMap(M1 &_m1, M2 &_m2) : m1(_m1), m2(_m2) {};
1171 Value operator[](Key k) const {return m1[k];}
1173 void set(Key k, const Value &v) {m1.set(k,v); m2.set(k,v);}
1176 ///Returns a \c ForkMap class
1178 ///This function just returns a \c ForkMap class.
1180 template <typename M1, typename M2>
1181 inline ForkMap<M1, M2> forkMap(const M1 &m1, const M2 &m2) {
1182 return ForkMap<M1, M2>(m1,m2);
1185 ///Returns a \c ForkWriteMap class
1187 ///This function just returns a \c ForkWriteMap class.
1188 ///\relates ForkWriteMap
1189 template <typename M1, typename M2>
1190 inline ForkWriteMap<M1, M2> forkMap(M1 &m1, M2 &m2) {
1191 return ForkWriteMap<M1, M2>(m1,m2);
1196 /* ************* BOOL MAPS ******************* */
1198 ///Logical 'not' of a map
1200 ///This bool \ref concepts::ReadMap "read only map" returns the
1201 ///logical negation of the value returned by the given map.
1202 ///Its \c Key is inherited from \c M, its \c Value is \c bool.
1205 template <typename M>
1206 class NotMap : public MapBase<typename M::Key, bool> {
1209 typedef MapBase<typename M::Key, bool> Parent;
1210 typedef typename Parent::Key Key;
1211 typedef typename Parent::Value Value;
1214 NotMap(const M &_m) : m(_m) {};
1216 Value operator[](Key k) const {return !m[k];}
1219 ///Logical 'not' of a map (ReadWrie version)
1221 ///This bool \ref concepts::ReadWriteMap "read-write map" returns the
1222 ///logical negation of the value returned by the given map. When it is set,
1223 ///the opposite value is set to the original map.
1224 ///Its \c Key is inherited from \c M, its \c Value is \c bool.
1227 template <typename M>
1228 class NotWriteMap : public MapBase<typename M::Key, bool> {
1231 typedef MapBase<typename M::Key, bool> Parent;
1232 typedef typename Parent::Key Key;
1233 typedef typename Parent::Value Value;
1236 NotWriteMap(M &_m) : m(_m) {};
1238 Value operator[](Key k) const {return !m[k];}
1240 void set(Key k, bool v) { m.set(k, !v); }
1243 ///Returns a \c NotMap class
1245 ///This function just returns a \c NotMap class.
1247 template <typename M>
1248 inline NotMap<M> notMap(const M &m) {
1249 return NotMap<M>(m);
1252 ///Returns a \c NotWriteMap class
1254 ///This function just returns a \c NotWriteMap class.
1255 ///\relates NotWriteMap
1256 template <typename M>
1257 inline NotWriteMap<M> notMap(M &m) {
1258 return NotWriteMap<M>(m);
1261 namespace _maps_bits {
1263 template <typename Value>
1265 typedef Value argument_type;
1266 typedef Value result_type;
1267 Value operator()(const Value& val) const {
1272 template <typename _Iterator, typename Enable = void>
1273 struct IteratorTraits {
1274 typedef typename std::iterator_traits<_Iterator>::value_type Value;
1277 template <typename _Iterator>
1278 struct IteratorTraits<_Iterator,
1279 typename exists<typename _Iterator::container_type>::type>
1281 typedef typename _Iterator::container_type::value_type Value;
1287 /// \brief Writable bool map for logging each \c true assigned element
1289 /// A \ref concepts::ReadWriteMap "read-write" bool map for logging
1290 /// each \c true assigned element, i.e it copies all the keys set
1291 /// to \c true to the given iterator.
1293 /// \note The container of the iterator should contain space
1294 /// for each element.
1296 /// The following example shows how you can write the edges found by
1297 /// the \ref Prim algorithm directly to the standard output.
1299 /// typedef IdMap<Graph, Edge> EdgeIdMap;
1300 /// EdgeIdMap edgeId(graph);
1302 /// typedef MapFunctor<EdgeIdMap> EdgeIdFunctor;
1303 /// EdgeIdFunctor edgeIdFunctor(edgeId);
1305 /// StoreBoolMap<ostream_iterator<int>, EdgeIdFunctor>
1306 /// writerMap(ostream_iterator<int>(cout, " "), edgeIdFunctor);
1308 /// prim(graph, cost, writerMap);
1311 ///\sa BackInserterBoolMap
1312 ///\sa FrontInserterBoolMap
1313 ///\sa InserterBoolMap
1315 ///\todo Revise the name of this class and the related ones.
1316 template <typename _Iterator,
1318 _maps_bits::Identity<typename _maps_bits::
1319 IteratorTraits<_Iterator>::Value> >
1320 class StoreBoolMap {
1322 typedef _Iterator Iterator;
1324 typedef typename _Functor::argument_type Key;
1327 typedef _Functor Functor;
1330 StoreBoolMap(Iterator it, const Functor& functor = Functor())
1331 : _begin(it), _end(it), _functor(functor) {}
1333 /// Gives back the given iterator set for the first key
1334 Iterator begin() const {
1338 /// Gives back the the 'after the last' iterator
1339 Iterator end() const {
1343 /// The \c set function of the map
1344 void set(const Key& key, Value value) const {
1346 *_end++ = _functor(key);
1352 mutable Iterator _end;
1356 /// \brief Writable bool map for logging each \c true assigned element in
1357 /// a back insertable container.
1359 /// Writable bool map for logging each \c true assigned element by pushing
1360 /// them into a back insertable container.
1361 /// It can be used to retrieve the items into a standard
1362 /// container. The next example shows how you can store the
1363 /// edges found by the Prim algorithm in a vector.
1366 /// vector<Edge> span_tree_edges;
1367 /// BackInserterBoolMap<vector<Edge> > inserter_map(span_tree_edges);
1368 /// prim(graph, cost, inserter_map);
1372 ///\sa FrontInserterBoolMap
1373 ///\sa InserterBoolMap
1374 template <typename Container,
1376 _maps_bits::Identity<typename Container::value_type> >
1377 class BackInserterBoolMap {
1379 typedef typename Functor::argument_type Key;
1383 BackInserterBoolMap(Container& _container,
1384 const Functor& _functor = Functor())
1385 : container(_container), functor(_functor) {}
1387 /// The \c set function of the map
1388 void set(const Key& key, Value value) {
1390 container.push_back(functor(key));
1395 Container& container;
1399 /// \brief Writable bool map for logging each \c true assigned element in
1400 /// a front insertable container.
1402 /// Writable bool map for logging each \c true assigned element by pushing
1403 /// them into a front insertable container.
1404 /// It can be used to retrieve the items into a standard
1405 /// container. For example see \ref BackInserterBoolMap.
1407 ///\sa BackInserterBoolMap
1408 ///\sa InserterBoolMap
1409 template <typename Container,
1411 _maps_bits::Identity<typename Container::value_type> >
1412 class FrontInserterBoolMap {
1414 typedef typename Functor::argument_type Key;
1418 FrontInserterBoolMap(Container& _container,
1419 const Functor& _functor = Functor())
1420 : container(_container), functor(_functor) {}
1422 /// The \c set function of the map
1423 void set(const Key& key, Value value) {
1425 container.push_front(functor(key));
1430 Container& container;
1434 /// \brief Writable bool map for storing each \c true assigned element in
1435 /// an insertable container.
1437 /// Writable bool map for storing each \c true assigned element in an
1438 /// insertable container. It will insert all the keys set to \c true into
1441 /// For example, if you want to store the cut arcs of the strongly
1442 /// connected components in a set you can use the next code:
1445 /// set<Arc> cut_arcs;
1446 /// InserterBoolMap<set<Arc> > inserter_map(cut_arcs);
1447 /// stronglyConnectedCutArcs(digraph, cost, inserter_map);
1450 ///\sa BackInserterBoolMap
1451 ///\sa FrontInserterBoolMap
1452 template <typename Container,
1454 _maps_bits::Identity<typename Container::value_type> >
1455 class InserterBoolMap {
1457 typedef typename Container::value_type Key;
1460 /// Constructor with specified iterator
1462 /// Constructor with specified iterator.
1463 /// \param _container The container for storing the elements.
1464 /// \param _it The elements will be inserted before this iterator.
1465 /// \param _functor The functor that is used when an element is stored.
1466 InserterBoolMap(Container& _container, typename Container::iterator _it,
1467 const Functor& _functor = Functor())
1468 : container(_container), it(_it), functor(_functor) {}
1472 /// Constructor without specified iterator.
1473 /// The elements will be inserted before <tt>_container.end()</tt>.
1474 /// \param _container The container for storing the elements.
1475 /// \param _functor The functor that is used when an element is stored.
1476 InserterBoolMap(Container& _container, const Functor& _functor = Functor())
1477 : container(_container), it(_container.end()), functor(_functor) {}
1479 /// The \c set function of the map
1480 void set(const Key& key, Value value) {
1482 it = container.insert(it, functor(key));
1488 Container& container;
1489 typename Container::iterator it;
1493 /// \brief Writable bool map for filling each \c true assigned element with a
1496 /// Writable bool map for filling each \c true assigned element with a
1497 /// given value. The value can set the container.
1499 /// The following code finds the connected components of a graph
1500 /// and stores it in the \c comp map:
1502 /// typedef Graph::NodeMap<int> ComponentMap;
1503 /// ComponentMap comp(graph);
1504 /// typedef FillBoolMap<Graph::NodeMap<int> > ComponentFillerMap;
1505 /// ComponentFillerMap filler(comp, 0);
1507 /// Dfs<Graph>::DefProcessedMap<ComponentFillerMap>::Create dfs(graph);
1508 /// dfs.processedMap(filler);
1510 /// for (NodeIt it(graph); it != INVALID; ++it) {
1511 /// if (!dfs.reached(it)) {
1512 /// dfs.addSource(it);
1514 /// ++filler.fillValue();
1518 template <typename Map>
1521 typedef typename Map::Key Key;
1525 FillBoolMap(Map& _map, const typename Map::Value& _fill)
1526 : map(_map), fill(_fill) {}
1529 FillBoolMap(Map& _map)
1530 : map(_map), fill() {}
1532 /// Gives back the current fill value
1533 const typename Map::Value& fillValue() const {
1537 /// Gives back the current fill value
1538 typename Map::Value& fillValue() {
1542 /// Sets the current fill value
1543 void fillValue(const typename Map::Value& _fill) {
1547 /// The \c set function of the map
1548 void set(const Key& key, Value value) {
1556 typename Map::Value fill;
1560 /// \brief Writable bool map for storing the sequence number of
1561 /// \c true assignments.
1563 /// Writable bool map that stores for each \c true assigned elements
1564 /// the sequence number of this setting.
1565 /// It makes it easy to calculate the leaving
1566 /// order of the nodes in the \c Dfs algorithm.
1569 /// typedef Digraph::NodeMap<int> OrderMap;
1570 /// OrderMap order(digraph);
1571 /// typedef SettingOrderBoolMap<OrderMap> OrderSetterMap;
1572 /// OrderSetterMap setter(order);
1573 /// Dfs<Digraph>::DefProcessedMap<OrderSetterMap>::Create dfs(digraph);
1574 /// dfs.processedMap(setter);
1576 /// for (NodeIt it(digraph); it != INVALID; ++it) {
1577 /// if (!dfs.reached(it)) {
1578 /// dfs.addSource(it);
1584 /// The storing of the discovering order is more difficult because the
1585 /// ReachedMap should be readable in the dfs algorithm but the setting
1586 /// order map is not readable. Thus we must use the fork map:
1589 /// typedef Digraph::NodeMap<int> OrderMap;
1590 /// OrderMap order(digraph);
1591 /// typedef SettingOrderBoolMap<OrderMap> OrderSetterMap;
1592 /// OrderSetterMap setter(order);
1593 /// typedef Digraph::NodeMap<bool> StoreMap;
1594 /// StoreMap store(digraph);
1596 /// typedef ForkWriteMap<StoreMap, OrderSetterMap> ReachedMap;
1597 /// ReachedMap reached(store, setter);
1599 /// Dfs<Digraph>::DefReachedMap<ReachedMap>::Create dfs(digraph);
1600 /// dfs.reachedMap(reached);
1602 /// for (NodeIt it(digraph); it != INVALID; ++it) {
1603 /// if (!dfs.reached(it)) {
1604 /// dfs.addSource(it);
1609 template <typename Map>
1610 class SettingOrderBoolMap {
1612 typedef typename Map::Key Key;
1616 SettingOrderBoolMap(Map& _map)
1617 : map(_map), counter(0) {}
1619 /// Number of set operations.
1624 /// The \c set function of the map
1625 void set(const Key& key, Value value) {
1627 map.set(key, counter++);
1639 #endif // LEMON_MAPS_H