3 * This file is a part of LEMON, a generic C++ optimization library
5 * Copyright (C) 2003-2006
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
24 #include <lemon/bits/utility.h>
25 #include <lemon/bits/traits.h>
29 ///\brief Miscellaneous property maps
31 ///\todo This file has the same name as the concept file in concept/,
32 /// and this is not easily detectable in docs...
41 /// Base class of maps.
43 /// Base class of maps.
44 /// It provides the necessary <tt>typedef</tt>s required by the map concept.
45 template<typename K, typename T>
54 /// Null map. (a.k.a. DoNothingMap)
56 /// If you have to provide a map only for its type definitions,
57 /// or if you have to provide a writable map, but
58 /// data written to it will sent to <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 template <typename K, typename V>
73 NullMap<K, V> nullMap() {
74 return NullMap<K, V>();
80 /// This is a readable map which assigns a specified value to each key.
81 /// In other aspects it is equivalent to the \ref NullMap.
82 /// \todo set could be used to set the value.
83 template<typename K, typename T>
84 class ConstMap : public MapBase<K, T> {
89 typedef MapBase<K, T> Parent;
90 typedef typename Parent::Key Key;
91 typedef typename Parent::Value Value;
93 /// Default constructor
95 /// The value of the map will be uninitialized.
96 /// (More exactly it will be default constructed.)
100 /// \param _v The initial value of the map.
102 ConstMap(const T &_v) : v(_v) {}
104 T operator[](const K&) const { return v; }
105 void set(const K&, const T&) {}
107 template<typename T1>
109 typedef ConstMap<K, T1> other;
112 template<typename T1>
113 ConstMap(const ConstMap<K, T1> &, const T &_v) : v(_v) {}
116 ///Returns a \ref ConstMap class
118 ///This function just returns a \ref ConstMap class.
120 template<typename K, typename V>
121 inline ConstMap<K, V> constMap(const V &v) {
122 return ConstMap<K, V>(v);
126 //\todo to document later
127 template<typename T, T v>
130 //\todo to document later
131 template<typename K, typename V, V v>
132 class ConstMap<K, Const<V, v> > : public MapBase<K, V> {
134 typedef MapBase<K, V> Parent;
135 typedef typename Parent::Key Key;
136 typedef typename Parent::Value Value;
139 V operator[](const K&) const { return v; }
140 void set(const K&, const V&) { }
143 ///Returns a \ref ConstMap class
145 ///This function just returns a \ref ConstMap class.
147 template<typename K, typename V, V v>
148 inline ConstMap<K, Const<V, v> > constMap() {
149 return ConstMap<K, Const<V, v> >();
152 /// \c std::map wrapper
154 /// This is essentially a wrapper for \c std::map. With addition that
155 /// you can specify a default value different from \c Value() .
157 /// \todo Provide allocator parameter...
158 template <typename K, typename T, typename Compare = std::less<K> >
159 class StdMap : public std::map<K, T, Compare> {
160 typedef std::map<K, T, Compare> parent;
162 typedef typename parent::value_type PairType;
170 typedef T& Reference;
172 typedef const T& ConstReference;
176 /// Constructor with specified default value
177 StdMap(const T& _v) : v(_v) {}
179 /// \brief Constructs the map from an appropriate std::map.
181 /// \warning Inefficient: copies the content of \c m !
182 StdMap(const parent &m) : parent(m) {}
183 /// \brief Constructs the map from an appropriate std::map, and explicitly
184 /// specifies a default value.
186 /// \warning Inefficient: copies the content of \c m !
187 StdMap(const parent &m, const T& _v) : parent(m), v(_v) {}
189 template<typename T1, typename Comp1>
190 StdMap(const StdMap<Key, T1,Comp1> &m, const T &_v) {
194 Reference operator[](const Key &k) {
195 return insert(PairType(k,v)).first -> second;
198 ConstReference operator[](const Key &k) const {
199 typename parent::iterator i = lower_bound(k);
200 if (i == parent::end() || parent::key_comp()(k, (*i).first))
204 void set(const Key &k, const T &t) {
205 parent::operator[](k) = t;
208 /// Changes the default value of the map.
209 /// \return Returns the previous default value.
211 /// \warning The value of some keys (which has already been queried, but
212 /// the value has been unchanged from the default) may change!
213 T setDefault(const T &_v) { T old=v; v=_v; return old; }
215 template<typename T1>
217 typedef StdMap<Key, T1,Compare> other;
223 /// \addtogroup map_adaptors
226 /// \brief Identity mapping.
228 /// This mapping gives back the given key as value without any
230 template <typename T>
231 class IdentityMap : public MapBase<T, T> {
233 typedef MapBase<T, T> Parent;
234 typedef typename Parent::Key Key;
235 typedef typename Parent::Value Value;
237 const T& operator[](const T& t) const {
242 ///Returns an \ref IdentityMap class
244 ///This function just returns an \ref IdentityMap class.
245 ///\relates IdentityMap
247 inline IdentityMap<T> identityMap() {
248 return IdentityMap<T>();
252 ///Convert the \c Value of a map to another type.
254 ///This \ref concept::ReadMap "read only map"
255 ///converts the \c Value of a maps to type \c T.
256 ///Its \c Key is inherited from \c M.
257 template <typename M, typename T>
258 class ConvertMap : public MapBase<typename M::Key, T> {
261 typedef MapBase<typename M::Key, T> Parent;
262 typedef typename Parent::Key Key;
263 typedef typename Parent::Value Value;
268 ///\param _m is the underlying map
269 ConvertMap(const M &_m) : m(_m) {};
271 /// \brief The subscript operator.
273 /// The subscript operator.
275 /// \return The target of the edge
276 Value operator[](const Key& k) const {return m[k];}
279 ///Returns an \ref ConvertMap class
281 ///This function just returns an \ref ConvertMap class.
282 ///\relates ConvertMap
283 ///\todo The order of the template parameters are changed.
284 template<typename T, typename M>
285 inline ConvertMap<M, T> convertMap(const M &m) {
286 return ConvertMap<M, T>(m);
291 ///This \ref concept::ReadMap "read only map" returns the sum of the two
292 ///given maps. Its \c Key and \c Value will be inherited from \c M1.
293 ///The \c Key and \c Value of M2 must be convertible to those of \c M1.
295 template<typename M1, typename M2>
296 class AddMap : public MapBase<typename M1::Key, typename M1::Value> {
301 typedef MapBase<typename M1::Key, typename M1::Value> Parent;
302 typedef typename Parent::Key Key;
303 typedef typename Parent::Value Value;
306 AddMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
307 Value operator[](Key k) const {return m1[k]+m2[k];}
310 ///Returns an \ref AddMap class
312 ///This function just returns an \ref AddMap class.
313 ///\todo How to call these type of functions?
316 ///\todo Wrong scope in Doxygen when \c \\relates is used
317 template<typename M1, typename M2>
318 inline AddMap<M1, M2> addMap(const M1 &m1,const M2 &m2) {
319 return AddMap<M1, M2>(m1,m2);
322 ///Shift a map with a constant.
324 ///This \ref concept::ReadMap "read only map" returns the sum of the
325 ///given map and a constant value.
326 ///Its \c Key and \c Value is inherited from \c M.
330 /// ShiftMap<X> sh(x,v);
332 ///is equivalent with
334 /// ConstMap<X::Key, X::Value> c_tmp(v);
335 /// AddMap<X, ConstMap<X::Key, X::Value> > sh(x,v);
337 template<typename M, typename C = typename M::Value>
338 class ShiftMap : public MapBase<typename M::Key, typename M::Value> {
342 typedef MapBase<typename M::Key, typename M::Value> Parent;
343 typedef typename Parent::Key Key;
344 typedef typename Parent::Value Value;
349 ///\param _m is the undelying map
350 ///\param _v is the shift value
351 ShiftMap(const M &_m, const C &_v ) : m(_m), v(_v) {};
352 Value operator[](Key k) const {return m[k] + v;}
355 ///Shift a map with a constant.
357 ///This \ref concept::ReadWriteMap "read-write map" returns the sum of the
358 ///given map and a constant value. It makes also possible to write the map.
359 ///Its \c Key and \c Value is inherited from \c M.
363 /// ShiftMap<X> sh(x,v);
365 ///is equivalent with
367 /// ConstMap<X::Key, X::Value> c_tmp(v);
368 /// AddMap<X, ConstMap<X::Key, X::Value> > sh(x,v);
370 template<typename M, typename C = typename M::Value>
371 class ShiftWriteMap : public MapBase<typename M::Key, typename M::Value> {
375 typedef MapBase<typename M::Key, typename M::Value> Parent;
376 typedef typename Parent::Key Key;
377 typedef typename Parent::Value Value;
382 ///\param _m is the undelying map
383 ///\param _v is the shift value
384 ShiftWriteMap(const M &_m, const C &_v ) : m(_m), v(_v) {};
385 Value operator[](Key k) const {return m[k] + v;}
386 void set(Key k, const Value& c) { m.set(k, c - v); }
389 ///Returns an \ref ShiftMap class
391 ///This function just returns an \ref ShiftMap class.
393 ///\todo A better name is required.
394 template<typename M, typename C>
395 inline ShiftMap<M, C> shiftMap(const M &m,const C &v) {
396 return ShiftMap<M, C>(m,v);
399 template<typename M, typename C>
400 inline ShiftWriteMap<M, C> shiftMap(M &m,const C &v) {
401 return ShiftWriteMap<M, C>(m,v);
404 ///Difference of two maps
406 ///This \ref concept::ReadMap "read only map" returns the difference
407 ///of the values of the two
408 ///given maps. Its \c Key and \c Value will be inherited from \c M1.
409 ///The \c Key and \c Value of \c M2 must be convertible to those of \c M1.
411 template<typename M1, typename M2>
412 class SubMap : public MapBase<typename M1::Key, typename M1::Value> {
416 typedef MapBase<typename M1::Key, typename M1::Value> Parent;
417 typedef typename Parent::Key Key;
418 typedef typename Parent::Value Value;
421 SubMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
422 Value operator[](Key k) const {return m1[k]-m2[k];}
425 ///Returns a \ref SubMap class
427 ///This function just returns a \ref SubMap class.
430 template<typename M1, typename M2>
431 inline SubMap<M1, M2> subMap(const M1 &m1, const M2 &m2) {
432 return SubMap<M1, M2>(m1, m2);
435 ///Product of two maps
437 ///This \ref concept::ReadMap "read only map" returns the product of the
440 ///maps. Its \c Key and \c Value will be inherited from \c M1.
441 ///The \c Key and \c Value of \c M2 must be convertible to those of \c M1.
443 template<typename M1, typename M2>
444 class MulMap : public MapBase<typename M1::Key, typename M1::Value> {
448 typedef MapBase<typename M1::Key, typename M1::Value> Parent;
449 typedef typename Parent::Key Key;
450 typedef typename Parent::Value Value;
453 MulMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
454 Value operator[](Key k) const {return m1[k]*m2[k];}
457 ///Returns a \ref MulMap class
459 ///This function just returns a \ref MulMap class.
461 template<typename M1, typename M2>
462 inline MulMap<M1, M2> mulMap(const M1 &m1,const M2 &m2) {
463 return MulMap<M1, M2>(m1,m2);
466 ///Scales a maps with a constant.
468 ///This \ref concept::ReadMap "read only map" returns the value of the
469 ///given map multiplied from the left side with a constant value.
470 ///Its \c Key and \c Value is inherited from \c M.
474 /// ScaleMap<X> sc(x,v);
476 ///is equivalent with
478 /// ConstMap<X::Key, X::Value> c_tmp(v);
479 /// MulMap<X, ConstMap<X::Key, X::Value> > sc(x,v);
481 template<typename M, typename C = typename M::Value>
482 class ScaleMap : public MapBase<typename M::Key, typename M::Value> {
486 typedef MapBase<typename M::Key, typename M::Value> Parent;
487 typedef typename Parent::Key Key;
488 typedef typename Parent::Value Value;
493 ///\param _m is the undelying map
494 ///\param _v is the scaling value
495 ScaleMap(const M &_m, const C &_v ) : m(_m), v(_v) {};
496 Value operator[](Key k) const {return v * m[k];}
499 ///Scales a maps with a constant.
501 ///This \ref concept::ReadWriteMap "read-write map" returns the value of the
502 ///given map multiplied from the left side with a constant value. It can
503 ///be used as write map also if the given multiplier is not zero.
504 ///Its \c Key and \c Value is inherited from \c M.
505 template<typename M, typename C = typename M::Value>
506 class ScaleWriteMap : public MapBase<typename M::Key, typename M::Value> {
510 typedef MapBase<typename M::Key, typename M::Value> Parent;
511 typedef typename Parent::Key Key;
512 typedef typename Parent::Value Value;
517 ///\param _m is the undelying map
518 ///\param _v is the scaling value
519 ScaleWriteMap(M &_m, const C &_v ) : m(_m), v(_v) {};
520 Value operator[](Key k) const {return v * m[k];}
521 void set(Key k, const Value& c) { m.set(k, c / v);}
524 ///Returns an \ref ScaleMap class
526 ///This function just returns an \ref ScaleMap class.
528 ///\todo A better name is required.
529 template<typename M, typename C>
530 inline ScaleMap<M, C> scaleMap(const M &m,const C &v) {
531 return ScaleMap<M, C>(m,v);
534 template<typename M, typename C>
535 inline ScaleWriteMap<M, C> scaleMap(M &m,const C &v) {
536 return ScaleWriteMap<M, C>(m,v);
539 ///Quotient of two maps
541 ///This \ref concept::ReadMap "read only map" returns the quotient of the
543 ///given maps. Its \c Key and \c Value will be inherited from \c M1.
544 ///The \c Key and \c Value of \c M2 must be convertible to those of \c M1.
546 template<typename M1, typename M2>
547 class DivMap : public MapBase<typename M1::Key, typename M1::Value> {
551 typedef MapBase<typename M1::Key, typename M1::Value> Parent;
552 typedef typename Parent::Key Key;
553 typedef typename Parent::Value Value;
556 DivMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
557 Value operator[](Key k) const {return m1[k]/m2[k];}
560 ///Returns a \ref DivMap class
562 ///This function just returns a \ref DivMap class.
564 template<typename M1, typename M2>
565 inline DivMap<M1, M2> divMap(const M1 &m1,const M2 &m2) {
566 return DivMap<M1, M2>(m1,m2);
569 ///Composition of two maps
571 ///This \ref concept::ReadMap "read only map" returns the composition of
573 ///given maps. That is to say, if \c m1 is of type \c M1 and \c m2 is
577 /// ComposeMap<M1, M2> cm(m1,m2);
579 /// <tt>cm[x]</tt> will be equal to <tt>m1[m2[x]]</tt>
581 ///Its \c Key is inherited from \c M2 and its \c Value is from
583 ///The \c M2::Value must be convertible to \c M1::Key.
584 ///\todo Check the requirements.
586 template <typename M1, typename M2>
587 class ComposeMap : public MapBase<typename M2::Key, typename M1::Value> {
591 typedef MapBase<typename M2::Key, typename M1::Value> Parent;
592 typedef typename Parent::Key Key;
593 typedef typename Parent::Value Value;
596 ComposeMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
598 typename MapTraits<M1>::ConstReturnValue
599 operator[](Key k) const {return m1[m2[k]];}
601 ///Returns a \ref ComposeMap class
603 ///This function just returns a \ref ComposeMap class.
605 ///\relates ComposeMap
606 template <typename M1, typename M2>
607 inline ComposeMap<M1, M2> composeMap(const M1 &m1,const M2 &m2) {
608 return ComposeMap<M1, M2>(m1,m2);
611 ///Combines of two maps using an STL (binary) functor.
613 ///Combines of two maps using an STL (binary) functor.
616 ///This \ref concept::ReadMap "read only map" takes two maps and a
617 ///binary functor and returns the composition of
619 ///given maps unsing the functor.
620 ///That is to say, if \c m1 and \c m2 is of type \c M1 and \c M2
621 ///and \c f is of \c F,
624 /// CombineMap<M1, M2,F,V> cm(m1,m2,f);
626 /// <tt>cm[x]</tt> will be equal to <tt>f(m1[x],m2[x])</tt>
628 ///Its \c Key is inherited from \c M1 and its \c Value is \c V.
629 ///The \c M2::Value and \c M1::Value must be convertible to the corresponding
630 ///input parameter of \c F and the return type of \c F must be convertible
632 ///\todo Check the requirements.
634 template<typename M1, typename M2, typename F,
635 typename V = typename F::result_type,
637 class CombineMap : public MapBase<typename M1::Key, V> {
642 typedef MapBase<typename M1::Key, V> Parent;
643 typedef typename Parent::Key Key;
644 typedef typename Parent::Value Value;
647 CombineMap(const M1 &_m1,const M2 &_m2,const F &_f)
648 : m1(_m1), m2(_m2), f(_f) {};
649 Value operator[](Key k) const {return f(m1[k],m2[k]);}
652 ///Returns a \ref CombineMap class
654 ///This function just returns a \ref CombineMap class.
656 ///Only the first template parameter (the value type) must be given.
658 ///For example if \c m1 and \c m2 are both \c double valued maps, then
660 ///combineMap<double>(m1,m2,std::plus<double>)
662 ///is equivalent with
667 ///\relates CombineMap
668 template<typename M1, typename M2, typename F, typename V>
669 inline CombineMap<M1, M2, F, V>
670 combineMap(const M1& m1,const M2& m2, const F& f) {
671 return CombineMap<M1, M2, F, V>(m1,m2,f);
674 template<typename M1, typename M2, typename F>
675 inline CombineMap<M1, M2, F, typename F::result_type>
676 combineMap(const M1& m1, const M2& m2, const F& f) {
677 return combineMap<M1, M2, F, typename F::result_type>(m1,m2,f);
680 template<typename M1, typename M2, typename K1, typename K2, typename V>
681 inline CombineMap<M1, M2, V (*)(K1, K2), V>
682 combineMap(const M1 &m1, const M2 &m2, V (*f)(K1, K2)) {
683 return combineMap<M1, M2, V (*)(K1, K2), V>(m1,m2,f);
686 ///Negative value of a map
688 ///This \ref concept::ReadMap "read only map" returns the negative
690 ///value returned by the
691 ///given map. Its \c Key and \c Value will be inherited from \c M.
692 ///The unary \c - operator must be defined for \c Value, of course.
695 class NegMap : public MapBase<typename M::Key, typename M::Value> {
698 typedef MapBase<typename M::Key, typename M::Value> Parent;
699 typedef typename Parent::Key Key;
700 typedef typename Parent::Value Value;
703 NegMap(const M &_m) : m(_m) {};
704 Value operator[](Key k) const {return -m[k];}
707 ///Negative value of a map
709 ///This \ref concept::ReadWriteMap "read-write map" returns the negative
710 ///value of the value returned by the
711 ///given map. Its \c Key and \c Value will be inherited from \c M.
712 ///The unary \c - operator must be defined for \c Value, of course.
715 class NegWriteMap : public MapBase<typename M::Key, typename M::Value> {
718 typedef MapBase<typename M::Key, typename M::Value> Parent;
719 typedef typename Parent::Key Key;
720 typedef typename Parent::Value Value;
723 NegWriteMap(M &_m) : m(_m) {};
724 Value operator[](Key k) const {return -m[k];}
725 void set(Key k, const Value& v) { m.set(k, -v); }
728 ///Returns a \ref NegMap class
730 ///This function just returns a \ref NegMap class.
732 template <typename M>
733 inline NegMap<M> negMap(const M &m) {
737 template <typename M>
738 inline NegWriteMap<M> negMap(M &m) {
739 return NegWriteMap<M>(m);
742 ///Absolute value of a map
744 ///This \ref concept::ReadMap "read only map" returns the absolute value
746 ///value returned by the
747 ///given map. Its \c Key and \c Value will be inherited
748 ///from <tt>M</tt>. <tt>Value</tt>
749 ///must be comparable to <tt>0</tt> and the unary <tt>-</tt>
750 ///operator must be defined for it, of course.
752 ///\bug We need a unified way to handle the situation below:
754 /// struct _UnConvertible {};
755 /// template<class A> inline A t_abs(A a) {return _UnConvertible();}
756 /// template<> inline int t_abs<>(int n) {return abs(n);}
757 /// template<> inline long int t_abs<>(long int n) {return labs(n);}
758 /// template<> inline long long int t_abs<>(long long int n) {return ::llabs(n);}
759 /// template<> inline float t_abs<>(float n) {return fabsf(n);}
760 /// template<> inline double t_abs<>(double n) {return fabs(n);}
761 /// template<> inline long double t_abs<>(long double n) {return fabsl(n);}
766 class AbsMap : public MapBase<typename M::Key, typename M::Value> {
769 typedef MapBase<typename M::Key, typename M::Value> Parent;
770 typedef typename Parent::Key Key;
771 typedef typename Parent::Value Value;
774 AbsMap(const M &_m) : m(_m) {};
775 Value operator[](Key k) const {
777 return tmp >= 0 ? tmp : -tmp;
782 ///Returns a \ref AbsMap class
784 ///This function just returns a \ref AbsMap class.
787 inline AbsMap<M> absMap(const M &m) {
791 ///Converts an STL style functor to a map
793 ///This \ref concept::ReadMap "read only map" returns the value
797 ///Template parameters \c K and \c V will become its
798 ///\c Key and \c Value. They must be given explicitely
799 ///because a functor does not provide such typedefs.
801 ///Parameter \c F is the type of the used functor.
805 typename K = typename F::argument_type,
806 typename V = typename F::result_type,
808 class FunctorMap : public MapBase<K, V> {
811 typedef MapBase<K, V> Parent;
812 typedef typename Parent::Key Key;
813 typedef typename Parent::Value Value;
816 FunctorMap(const F &_f) : f(_f) {}
818 Value operator[](Key k) const { return f(k);}
821 ///Returns a \ref FunctorMap class
823 ///This function just returns a \ref FunctorMap class.
825 ///The third template parameter isn't necessary to be given.
826 ///\relates FunctorMap
827 template<typename K, typename V, typename F> inline
828 FunctorMap<F, K, V> functorMap(const F &f) {
829 return FunctorMap<F, K, V>(f);
832 template <typename F> inline
833 FunctorMap<F, typename F::argument_type, typename F::result_type>
834 functorMap(const F &f) {
835 return FunctorMap<F, typename F::argument_type,
836 typename F::result_type>(f);
839 template <typename K, typename V> inline
840 FunctorMap<V (*)(K), K, V> functorMap(V (*f)(K)) {
841 return FunctorMap<V (*)(K), K, V>(f);
845 ///Converts a map to an STL style (unary) functor
847 ///This class Converts a map to an STL style (unary) functor.
848 ///that is it provides an <tt>operator()</tt> to read its values.
850 ///For the sake of convenience it also works as
851 ///a ususal \ref concept::ReadMap "readable map",
852 ///i.e. <tt>operator[]</tt> and the \c Key and \c Value typedefs also exist.
854 template <typename M>
855 class MapFunctor : public MapBase<typename M::Key, typename M::Value> {
858 typedef MapBase<typename M::Key, typename M::Value> Parent;
859 typedef typename Parent::Key Key;
860 typedef typename Parent::Value Value;
863 typedef typename M::Key argument_type;
865 typedef typename M::Value result_type;
868 MapFunctor(const M &_m) : m(_m) {};
869 ///Returns a value of the map
870 Value operator()(Key k) const {return m[k];}
872 Value operator[](Key k) const {return m[k];}
875 ///Returns a \ref MapFunctor class
877 ///This function just returns a \ref MapFunctor class.
878 ///\relates MapFunctor
880 inline MapFunctor<M> mapFunctor(const M &m) {
881 return MapFunctor<M>(m);
884 ///Applies all map setting operations to two maps
886 ///This map has two \ref concept::ReadMap "readable map"
887 ///parameters and each read request will be passed just to the
888 ///first map. This class is the just readable map type of the ForkWriteMap.
890 ///The \c Key and \c Value will be inherited from \c M1.
891 ///The \c Key and \c Value of M2 must be convertible from those of \c M1.
893 template<typename M1, typename M2>
894 class ForkMap : public MapBase<typename M1::Key, typename M1::Value> {
898 typedef MapBase<typename M1::Key, typename M1::Value> Parent;
899 typedef typename Parent::Key Key;
900 typedef typename Parent::Value Value;
903 ForkMap(const M1 &_m1, const M2 &_m2) : m1(_m1), m2(_m2) {};
904 Value operator[](Key k) const {return m1[k];}
908 ///Applies all map setting operations to two maps
910 ///This map has two \ref concept::WriteMap "writable map"
911 ///parameters and each write request will be passed to both of them.
912 ///If \c M1 is also \ref concept::ReadMap "readable",
913 ///then the read operations will return the
914 ///corresponding values of \c M1.
916 ///The \c Key and \c Value will be inherited from \c M1.
917 ///The \c Key and \c Value of M2 must be convertible from those of \c M1.
919 template<typename M1, typename M2>
920 class ForkWriteMap : public MapBase<typename M1::Key, typename M1::Value> {
924 typedef MapBase<typename M1::Key, typename M1::Value> Parent;
925 typedef typename Parent::Key Key;
926 typedef typename Parent::Value Value;
929 ForkWriteMap(M1 &_m1, M2 &_m2) : m1(_m1), m2(_m2) {};
930 Value operator[](Key k) const {return m1[k];}
931 void set(Key k, const Value &v) {m1.set(k,v); m2.set(k,v);}
934 ///Returns an \ref ForkMap class
936 ///This function just returns an \ref ForkMap class.
937 ///\todo How to call these type of functions?
940 ///\todo Wrong scope in Doxygen when \c \\relates is used
941 template <typename M1, typename M2>
942 inline ForkMap<M1, M2> forkMap(const M1 &m1, const M2 &m2) {
943 return ForkMap<M1, M2>(m1,m2);
946 template <typename M1, typename M2>
947 inline ForkWriteMap<M1, M2> forkMap(M1 &m1, M2 &m2) {
948 return ForkWriteMap<M1, M2>(m1,m2);
953 /* ************* BOOL MAPS ******************* */
955 ///Logical 'not' of a map
957 ///This bool \ref concept::ReadMap "read only map" returns the
958 ///logical negation of
959 ///value returned by the
960 ///given map. Its \c Key and will be inherited from \c M,
961 ///its Value is <tt>bool</tt>.
963 template <typename M>
964 class NotMap : public MapBase<typename M::Key, bool> {
967 typedef MapBase<typename M::Key, bool> Parent;
968 typedef typename Parent::Key Key;
969 typedef typename Parent::Value Value;
972 NotMap(const M &_m) : m(_m) {};
973 Value operator[](Key k) const {return !m[k];}
976 ///Logical 'not' of a map with writing possibility
978 ///This bool \ref concept::ReadWriteMap "read-write map" returns the
979 ///logical negation of value returned by the given map. It is setted
980 ///then the negation of the value be setted to the original map.
981 ///Its \c Key and will be inherited from \c M,
982 ///its Value is <tt>bool</tt>.
983 template <typename M>
984 class NotWriteMap : public MapBase<typename M::Key, bool> {
987 typedef MapBase<typename M::Key, bool> Parent;
988 typedef typename Parent::Key Key;
989 typedef typename Parent::Value Value;
992 NotWriteMap(M &_m) : m(_m) {};
993 Value operator[](Key k) const {return !m[k];}
994 void set(Key k, bool v) { m.set(k, !v); }
997 ///Returns a \ref NotMap class
999 ///This function just returns a \ref NotMap class.
1001 template <typename M>
1002 inline NotMap<M> notMap(const M &m) {
1003 return NotMap<M>(m);
1006 template <typename M>
1007 inline NotWriteMap<M> notMap(M &m) {
1008 return NotWriteMap<M>(m);
1011 /// \brief Writable bool map for store each true assigned elements.
1013 /// Writable bool map for store each true assigned elements. It will
1014 /// copies all the true setted keys to the given iterator.
1016 /// \note The container of the iterator should contain for each element.
1017 template <typename _Iterator>
1018 class StoreBoolMap {
1020 typedef _Iterator Iterator;
1022 typedef typename std::iterator_traits<Iterator>::value_type Key;
1026 StoreBoolMap(Iterator it) : _begin(it), _end(it) {}
1028 /// Gives back the given first setted iterator.
1029 Iterator begin() const {
1033 /// Gives back the iterator after the last setted.
1034 Iterator end() const {
1038 /// Setter function of the map
1039 void set(const Key& key, Value value) {
1046 Iterator _begin, _end;
1049 /// \brief Writable bool map for store each true assigned elements in
1050 /// a back insertable container.
1052 /// Writable bool map for store each true assigned elements in a back
1053 /// insertable container. It will push back all the true setted keys into
1055 template <typename Container>
1056 class BackInserterBoolMap {
1058 typedef typename Container::value_type Key;
1062 BackInserterBoolMap(Container& _container) : container(_container) {}
1064 /// Setter function of the map
1065 void set(const Key& key, Value value) {
1067 container.push_back(key);
1072 Container& container;
1075 /// \brief Writable bool map for store each true assigned elements in
1076 /// a front insertable container.
1078 /// Writable bool map for store each true assigned elements in a front
1079 /// insertable container. It will push front all the true setted keys into
1081 template <typename Container>
1082 class FrontInserterBoolMap {
1084 typedef typename Container::value_type Key;
1088 FrontInserterBoolMap(Container& _container) : container(_container) {}
1090 /// Setter function of the map
1091 void set(const Key& key, Value value) {
1093 container.push_front(key);
1098 Container& container;
1101 /// \brief Writable bool map for store each true assigned elements in
1102 /// an insertable container.
1104 /// Writable bool map for store each true assigned elements in an
1105 /// insertable container. It will insert all the true setted keys into
1107 template <typename Container>
1108 class InserterBoolMap {
1110 typedef typename Container::value_type Key;
1114 InserterBoolMap(Container& _container) : container(_container) {}
1116 /// Setter function of the map
1117 void set(const Key& key, Value value) {
1119 container.insert(key);
1124 Container& container;
1127 /// \brief Fill the true setted elements with a given value.
1129 /// Writable bool map for fill the true setted elements with a given value.
1130 /// The value can be setted
1132 template <typename Map>
1135 typedef typename Map::Key Key;
1139 FillBoolMap(Map& _map, const typename Map::Value& _fill)
1140 : map(_map), fill(_fill) {}
1143 FillBoolMap(Map& _map)
1144 : map(_map), fill() {}
1146 /// Gives back the current fill value
1147 typename Map::Value fillValue() const {
1151 /// Sets the current fill value
1152 void fillValue(const typename Map::Value& _fill) {
1156 /// Setter function of the map
1157 void set(const Key& key, Value value) {
1165 typename Map::Value fill;
1169 /// \brief Writable bool map which stores for each true assigned elements
1170 /// the setting order number.
1172 /// Writable bool map which stores for each true assigned elements
1173 /// the setting order number.
1174 template <typename Map>
1175 class SettingOrderBoolMap {
1177 typedef typename Map::Key Key;
1181 SettingOrderBoolMap(Map& _map)
1182 : map(_map), counter(0) {}
1184 /// Number of setted keys.
1189 /// Setter function of the map
1190 void set(const Key& key, Value value) {
1192 map.set(key, counter++);
1204 #endif // LEMON_MAPS_H