lemon/maps.h
author athos
Thu, 07 Jul 2005 09:04:39 +0000
changeset 1541 305ce06287c9
parent 1536 308150155bb5
child 1547 dd57a540ff5f
permissions -rw-r--r--
Decided not to \include the sample.lgf in the quicktour: so it can be bigger.
     1 /* -*- C++ -*-
     2  * lemon/maps.h - Part of LEMON, a generic C++ optimization library
     3  *
     4  * Copyright (C) 2005 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     5  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     6  *
     7  * Permission to use, modify and distribute this software is granted
     8  * provided that this copyright notice appears in all copies. For
     9  * precise terms see the accompanying LICENSE file.
    10  *
    11  * This software is provided "AS IS" with no warranty of any kind,
    12  * express or implied, and with no claim as to its suitability for any
    13  * purpose.
    14  *
    15  */
    16 
    17 #ifndef LEMON_MAPS_H
    18 #define LEMON_MAPS_H
    19 
    20 #include <lemon/graph_utils.h>
    21 #include <lemon/utility.h>
    22 
    23 
    24 ///\file
    25 ///\ingroup maps
    26 ///\brief Miscellaneous property maps
    27 ///
    28 ///\todo This file has the same name as the concept file in concept/,
    29 /// and this is not easily detectable in docs...
    30 
    31 #include <map>
    32 
    33 namespace lemon {
    34 
    35   /// \addtogroup maps
    36   /// @{
    37 
    38   /// Base class of maps.
    39 
    40   /// Base class of maps.
    41   /// It provides the necessary <tt>typedef</tt>s required by the map concept.
    42   template<typename K, typename T>
    43   class MapBase
    44   {
    45   public:
    46     ///\e
    47     typedef K Key;
    48     ///\e
    49     typedef T Value;
    50   };
    51 
    52   /// Null map. (a.k.a. DoNothingMap)
    53 
    54   /// If you have to provide a map only for its type definitions,
    55   /// or if you have to provide a writable map, but
    56   /// data written to it will sent to <tt>/dev/null</tt>...
    57   template<typename K, typename T>
    58   class NullMap : public MapBase<K,T>
    59   {
    60   public:
    61     
    62     typedef True NeedCopy;
    63 
    64     /// Gives back a default constructed element.
    65     T operator[](const K&) const { return T(); }
    66     /// Absorbs the value.
    67     void set(const K&, const T&) {}
    68   };
    69 
    70   template <typename K, typename V> 
    71   NullMap<K, V> nullMap() {
    72     return NullMap<K, V>();
    73   }
    74 
    75 
    76   /// Constant map.
    77 
    78   /// This is a readable map which assigns a specified value to each key.
    79   /// In other aspects it is equivalent to the \ref NullMap.
    80   /// \todo set could be used to set the value.
    81   template<typename K, typename T>
    82   class ConstMap : public MapBase<K,T>
    83   {
    84     T v;
    85   public:
    86 
    87     typedef True NeedCopy;
    88 
    89     /// Default constructor
    90 
    91     /// The value of the map will be uninitialized. 
    92     /// (More exactly it will be default constructed.)
    93     ConstMap() {}
    94     ///\e
    95 
    96     /// \param _v The initial value of the map.
    97     ///
    98     ConstMap(const T &_v) : v(_v) {}
    99 
   100     T operator[](const K&) const { return v; }
   101     void set(const K&, const T&) {}
   102 
   103     template<typename T1>
   104     struct rebind {
   105       typedef ConstMap<K,T1> other;
   106     };
   107 
   108     template<typename T1>
   109     ConstMap(const ConstMap<K,T1> &, const T &_v) : v(_v) {}
   110   };
   111 
   112   ///Returns a \ref ConstMap class
   113 
   114   ///This function just returns a \ref ConstMap class.
   115   ///\relates ConstMap
   116   template<class V,class K> 
   117   inline ConstMap<V,K> constMap(const K &k) 
   118   {
   119     return ConstMap<V,K>(k);
   120   }
   121 
   122 
   123   //to document later
   124   template<typename T, T v>
   125   struct Const { };
   126   //to document later
   127   template<typename K, typename V, V v>
   128   class ConstMap<K, Const<V, v> > : public MapBase<K, V>
   129   {
   130   public:
   131     ConstMap() { }
   132     V operator[](const K&) const { return v; }
   133     void set(const K&, const V&) { }
   134   };
   135 
   136   /// \c std::map wrapper
   137 
   138   /// This is essentially a wrapper for \c std::map. With addition that
   139   /// you can specify a default value different from \c Value() .
   140   ///
   141   /// \todo Provide allocator parameter...
   142   template <typename K, typename T, typename Compare = std::less<K> >
   143   class StdMap : public std::map<K,T,Compare> {
   144     typedef std::map<K,T,Compare> parent;
   145     T v;
   146     typedef typename parent::value_type PairType;
   147 
   148   public:
   149     ///\e
   150     typedef K Key;
   151     ///\e
   152     typedef T Value;
   153     ///\e
   154     typedef T& Reference;
   155     ///\e
   156     typedef const T& ConstReference;
   157 
   158 
   159     StdMap() : v() {}
   160     /// Constructor with specified default value
   161     StdMap(const T& _v) : v(_v) {}
   162 
   163     /// \brief Constructs the map from an appropriate std::map.
   164     ///
   165     /// \warning Inefficient: copies the content of \c m !
   166     StdMap(const parent &m) : parent(m) {}
   167     /// \brief Constructs the map from an appropriate std::map, and explicitly
   168     /// specifies a default value.
   169     ///
   170     /// \warning Inefficient: copies the content of \c m !
   171     StdMap(const parent &m, const T& _v) : parent(m), v(_v) {}
   172     
   173     template<typename T1, typename Comp1>
   174     StdMap(const StdMap<Key,T1,Comp1> &m, const T &_v) { 
   175       //FIXME; 
   176     }
   177 
   178     Reference operator[](const Key &k) {
   179       return insert(PairType(k,v)).first -> second;
   180     }
   181     ConstReference operator[](const Key &k) const {
   182       typename parent::iterator i = lower_bound(k);
   183       if (i == parent::end() || parent::key_comp()(k, (*i).first))
   184 	return v;
   185       return (*i).second;
   186     }
   187     void set(const Key &k, const T &t) {
   188       parent::operator[](k) = t;
   189     }
   190 
   191     /// Changes the default value of the map.
   192     /// \return Returns the previous default value.
   193     ///
   194     /// \warning The value of some keys (which has already been queried, but
   195     /// the value has been unchanged from the default) may change!
   196     T setDefault(const T &_v) { T old=v; v=_v; return old; }
   197 
   198     template<typename T1>
   199     struct rebind {
   200       typedef StdMap<Key,T1,Compare> other;
   201     };
   202   };
   203 
   204   /// @}
   205 
   206   /// \addtogroup map_adaptors
   207   /// @{
   208 
   209   /// \brief Identity mapping.
   210   ///
   211   /// This mapping gives back the given key as value without any
   212   /// modification. 
   213   template <typename T>
   214   class IdentityMap {
   215   public:
   216     typedef T Key;
   217     typedef T Value;
   218 
   219     const Value& operator[](const Key& t) const {
   220       return t;
   221     }
   222   };
   223 
   224   ///Convert the \c Value of a maps to another type.
   225 
   226   ///This \ref concept::ReadMap "read only map"
   227   ///converts the \c Value of a maps to type \c T.
   228   ///Its \c Value is inherited from \c M.
   229   ///
   230   ///\bug wrong documentation
   231   template<class M, class T> 
   232   class ConvertMap {
   233     typename SmartConstReference<M>::Type m;
   234   public:
   235 
   236     typedef True NeedCopy;
   237 
   238     ///\e
   239     typedef typename M::Key Key;
   240     ///\e
   241     typedef T Value;
   242 
   243     ///Constructor
   244 
   245     ///Constructor
   246     ///\param _m is the underlying map
   247     ConvertMap(const M &_m) : m(_m) {};
   248 
   249     /// \brief The subscript operator.
   250     ///
   251     /// The subscript operator.
   252     /// \param k The key
   253     /// \return The target of the edge 
   254     Value operator[](Key k) const {return m[k];}
   255   };
   256   
   257   ///Returns an \ref ConvertMap class
   258 
   259   ///This function just returns an \ref ConvertMap class.
   260   ///\relates ConvertMap
   261   ///\todo The order of the template parameters are changed.
   262   template<class T, class M>
   263   inline ConvertMap<M,T> convertMap(const M &m) 
   264   {
   265     return ConvertMap<M,T>(m);
   266   }
   267 
   268   ///Sum of two maps
   269 
   270   ///This \ref concept::ReadMap "read only map" returns the sum of the two
   271   ///given maps. Its \c Key and \c Value will be inherited from \c M1.
   272   ///The \c Key and \c Value of M2 must be convertible to those of \c M1.
   273 
   274   template<class M1,class M2> 
   275   class AddMap
   276   {
   277     typename SmartConstReference<M1>::Type m1;
   278     typename SmartConstReference<M2>::Type m2;
   279 
   280   public:
   281 
   282     typedef True NeedCopy;
   283 
   284     ///\e
   285     typedef typename M1::Key Key;
   286     ///\e
   287     typedef typename M1::Value Value;
   288 
   289     ///Constructor
   290     AddMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
   291     Value operator[](Key k) const {return m1[k]+m2[k];}
   292   };
   293   
   294   ///Returns an \ref AddMap class
   295 
   296   ///This function just returns an \ref AddMap class.
   297   ///\todo How to call these type of functions?
   298   ///
   299   ///\relates AddMap
   300   ///\todo Wrong scope in Doxygen when \c \\relates is used
   301   template<class M1,class M2> 
   302   inline AddMap<M1,M2> addMap(const M1 &m1,const M2 &m2) 
   303   {
   304     return AddMap<M1,M2>(m1,m2);
   305   }
   306 
   307   ///Shift a maps with a constant.
   308 
   309   ///This \ref concept::ReadMap "read only map" returns the sum of the
   310   ///given map and a constant value.
   311   ///Its \c Key and \c Value is inherited from \c M.
   312   ///
   313   ///Actually,
   314   ///\code
   315   ///  ShiftMap<X> sh(x,v);
   316   ///\endcode
   317   ///it is equivalent with
   318   ///\code
   319   ///  ConstMap<X::Key, X::Value> c_tmp(v);
   320   ///  AddMap<X, ConstMap<X::Key, X::Value> > sh(x,v);
   321   ///\endcode
   322   template<class M> 
   323   class ShiftMap
   324   {
   325     typename SmartConstReference<M>::Type m;
   326     typename M::Value v;
   327   public:
   328 
   329     typedef True NeedCopy;
   330     ///\e
   331     typedef typename M::Key Key;
   332     ///\e
   333     typedef typename M::Value Value;
   334 
   335     ///Constructor
   336 
   337     ///Constructor
   338     ///\param _m is the undelying map
   339     ///\param _v is the shift value
   340     ShiftMap(const M &_m,const Value &_v ) : m(_m), v(_v) {};
   341     Value operator[](Key k) const {return m[k]+v;}
   342   };
   343   
   344   ///Returns an \ref ShiftMap class
   345 
   346   ///This function just returns an \ref ShiftMap class.
   347   ///\relates ShiftMap
   348   ///\todo A better name is required.
   349   template<class M> 
   350   inline ShiftMap<M> shiftMap(const M &m,const typename M::Value &v) 
   351   {
   352     return ShiftMap<M>(m,v);
   353   }
   354 
   355   ///Difference of two maps
   356 
   357   ///This \ref concept::ReadMap "read only map" returns the difference
   358   ///of the values returned by the two
   359   ///given maps. Its \c Key and \c Value will be inherited from \c M1.
   360   ///The \c Key and \c Value of \c M2 must be convertible to those of \c M1.
   361 
   362   template<class M1,class M2> 
   363   class SubMap
   364   {
   365     typename SmartConstReference<M1>::Type m1;
   366     typename SmartConstReference<M2>::Type m2;
   367   public:
   368 
   369     typedef True NeedCopy;
   370     ///\e
   371     typedef typename M1::Key Key;
   372     ///\e
   373     typedef typename M1::Value Value;
   374 
   375     ///Constructor
   376     SubMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
   377     Value operator[](Key k) const {return m1[k]-m2[k];}
   378   };
   379   
   380   ///Returns a \ref SubMap class
   381 
   382   ///This function just returns a \ref SubMap class.
   383   ///
   384   ///\relates SubMap
   385   template<class M1,class M2> 
   386   inline SubMap<M1,M2> subMap(const M1 &m1,const M2 &m2) 
   387   {
   388     return SubMap<M1,M2>(m1,m2);
   389   }
   390 
   391   ///Product of two maps
   392 
   393   ///This \ref concept::ReadMap "read only map" returns the product of the
   394   ///values returned by the two
   395   ///given
   396   ///maps. Its \c Key and \c Value will be inherited from \c M1.
   397   ///The \c Key and \c Value of \c M2 must be convertible to those of \c M1.
   398 
   399   template<class M1,class M2> 
   400   class MulMap
   401   {
   402     typename SmartConstReference<M1>::Type m1;
   403     typename SmartConstReference<M2>::Type m2;
   404   public:
   405 
   406     typedef True NeedCopy;
   407     ///\e
   408     typedef typename M1::Key Key;
   409     ///\e
   410     typedef typename M1::Value Value;
   411 
   412     ///Constructor
   413     MulMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
   414     Value operator[](Key k) const {return m1[k]*m2[k];}
   415   };
   416   
   417   ///Returns a \ref MulMap class
   418 
   419   ///This function just returns a \ref MulMap class.
   420   ///\relates MulMap
   421   template<class M1,class M2> 
   422   inline MulMap<M1,M2> mulMap(const M1 &m1,const M2 &m2) 
   423   {
   424     return MulMap<M1,M2>(m1,m2);
   425   }
   426  
   427   ///Scale a maps with a constant.
   428 
   429   ///This \ref concept::ReadMap "read only map" returns the value of the
   430   ///given map multipied with a constant value.
   431   ///Its \c Key and \c Value is inherited from \c M.
   432   ///
   433   ///Actually,
   434   ///\code
   435   ///  ScaleMap<X> sc(x,v);
   436   ///\endcode
   437   ///it is equivalent with
   438   ///\code
   439   ///  ConstMap<X::Key, X::Value> c_tmp(v);
   440   ///  MulMap<X, ConstMap<X::Key, X::Value> > sc(x,v);
   441   ///\endcode
   442   template<class M> 
   443   class ScaleMap
   444   {
   445     typename SmartConstReference<M>::Type m;
   446     typename M::Value v;
   447   public:
   448 
   449     typedef True NeedCopy;
   450     ///\e
   451     typedef typename M::Key Key;
   452     ///\e
   453     typedef typename M::Value Value;
   454 
   455     ///Constructor
   456 
   457     ///Constructor
   458     ///\param _m is the undelying map
   459     ///\param _v is the scaling value
   460     ScaleMap(const M &_m,const Value &_v ) : m(_m), v(_v) {};
   461     Value operator[](Key k) const {return m[k]*v;}
   462   };
   463   
   464   ///Returns an \ref ScaleMap class
   465 
   466   ///This function just returns an \ref ScaleMap class.
   467   ///\relates ScaleMap
   468   ///\todo A better name is required.
   469   template<class M> 
   470   inline ScaleMap<M> scaleMap(const M &m,const typename M::Value &v) 
   471   {
   472     return ScaleMap<M>(m,v);
   473   }
   474 
   475   ///Quotient of two maps
   476 
   477   ///This \ref concept::ReadMap "read only map" returns the quotient of the
   478   ///values returned by the two
   479   ///given maps. Its \c Key and \c Value will be inherited from \c M1.
   480   ///The \c Key and \c Value of \c M2 must be convertible to those of \c M1.
   481 
   482   template<class M1,class M2> 
   483   class DivMap
   484   {
   485     typename SmartConstReference<M1>::Type m1;
   486     typename SmartConstReference<M2>::Type m2;
   487   public:
   488 
   489     typedef True NeedCopy;
   490     ///\e
   491     typedef typename M1::Key Key;
   492     ///\e
   493     typedef typename M1::Value Value;
   494 
   495     ///Constructor
   496     DivMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
   497     Value operator[](Key k) const {return m1[k]/m2[k];}
   498   };
   499   
   500   ///Returns a \ref DivMap class
   501 
   502   ///This function just returns a \ref DivMap class.
   503   ///\relates DivMap
   504   template<class M1,class M2> 
   505   inline DivMap<M1,M2> divMap(const M1 &m1,const M2 &m2) 
   506   {
   507     return DivMap<M1,M2>(m1,m2);
   508   }
   509   
   510   ///Composition of two maps
   511 
   512   ///This \ref concept::ReadMap "read only map" returns the composition of
   513   ///two
   514   ///given maps. That is to say, if \c m1 is of type \c M1 and \c m2 is
   515   ///of \c M2,
   516   ///then for
   517   ///\code
   518   ///  ComposeMap<M1,M2> cm(m1,m2);
   519   ///\endcode
   520   /// <tt>cm[x]</tt> will be equal to <tt>m1[m2[x]]</tt>
   521   ///
   522   ///Its \c Key is inherited from \c M2 and its \c Value is from
   523   ///\c M1.
   524   ///The \c M2::Value must be convertible to \c M1::Key.
   525   ///\todo Check the requirements.
   526 
   527   template<class M1,class M2> 
   528   class ComposeMap
   529   {
   530     typename SmartConstReference<M1>::Type m1;
   531     typename SmartConstReference<M2>::Type m2;
   532   public:
   533 
   534     typedef True NeedCopy;
   535     ///\e
   536     typedef typename M2::Key Key;
   537     ///\e
   538     typedef typename M1::Value Value;
   539 
   540     ///Constructor
   541     ComposeMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
   542     Value operator[](Key k) const {return m1[m2[k]];}
   543   };
   544   ///Returns a \ref ComposeMap class
   545 
   546   ///This function just returns a \ref ComposeMap class.
   547   ///
   548   ///\relates ComposeMap
   549   template<class M1,class M2> 
   550   inline ComposeMap<M1,M2> composeMap(const M1 &m1,const M2 &m2) 
   551   {
   552     return ComposeMap<M1,M2>(m1,m2);
   553   }
   554   
   555   ///Combine of two maps using an STL (binary) functor.
   556 
   557   ///Combine of two maps using an STL (binary) functor.
   558   ///
   559   ///
   560   ///This \ref concept::ReadMap "read only map" takes to maps and a
   561   ///binary functor and returns the composition of
   562   ///two
   563   ///given maps unsing the functor. 
   564   ///That is to say, if \c m1 and \c m2 is of type \c M1 and \c M2
   565   ///and \c f is of \c F,
   566   ///then for
   567   ///\code
   568   ///  CombineMap<M1,M2,F,V> cm(m1,m2,f);
   569   ///\endcode
   570   /// <tt>cm[x]</tt> will be equal to <tt>f(m1[x],m2[x])</tt>
   571   ///
   572   ///Its \c Key is inherited from \c M1 and its \c Value is \c V.
   573   ///The \c M2::Value and \c M1::Value must be convertible to the corresponding
   574   ///input parameter of \c F and the return type of \c F must be convertible
   575   ///to \c V.
   576   ///\todo Check the requirements.
   577 
   578   template<class M1,class M2,class F,class V = typename F::result_type> 
   579   class CombineMap
   580   {
   581     typename SmartConstReference<M1>::Type m1;
   582     typename SmartConstReference<M2>::Type m2;
   583     F f;
   584   public:
   585 
   586     typedef True NeedCopy;
   587     ///\e
   588     typedef typename M1::Key Key;
   589     ///\e
   590     typedef V Value;
   591 
   592     ///Constructor
   593     CombineMap(const M1 &_m1,const M2 &_m2,const F &_f)
   594       : m1(_m1), m2(_m2), f(_f) {};
   595     Value operator[](Key k) const {return f(m1[k],m2[k]);}
   596   };
   597   
   598   ///Returns a \ref CombineMap class
   599 
   600   ///This function just returns a \ref CombineMap class.
   601   ///
   602   ///Only the first template parameter (the value type) must be given.
   603   ///
   604   ///For example if \c m1 and \c m2 are both \c double valued maps, then 
   605   ///\code
   606   ///combineMap<double>(m1,m2,std::plus<double>)
   607   ///\endcode
   608   ///is equivalent with
   609   ///\code
   610   ///addMap(m1,m2)
   611   ///\endcode
   612   ///
   613   ///\relates CombineMap
   614   template<class M1,class M2,class F> 
   615   inline CombineMap<M1,M2,F> combineMap(const M1 &m1,const M2 &m2,const F &f) 
   616   {
   617     return CombineMap<M1,M2,F>(m1,m2,f);
   618   }
   619 
   620   ///Negative value of a map
   621 
   622   ///This \ref concept::ReadMap "read only map" returns the negative
   623   ///value of the
   624   ///value returned by the
   625   ///given map. Its \c Key and \c Value will be inherited from \c M.
   626   ///The unary \c - operator must be defined for \c Value, of course.
   627 
   628   template<class M> 
   629   class NegMap
   630   {
   631     typename SmartConstReference<M>::Type m;
   632   public:
   633 
   634     typedef True NeedCopy;
   635     ///\e
   636     typedef typename M::Key Key;
   637     ///\e
   638     typedef typename M::Value Value;
   639 
   640     ///Constructor
   641     NegMap(const M &_m) : m(_m) {};
   642     Value operator[](Key k) const {return -m[k];}
   643   };
   644   
   645   ///Returns a \ref NegMap class
   646 
   647   ///This function just returns a \ref NegMap class.
   648   ///\relates NegMap
   649   template<class M> 
   650   inline NegMap<M> negMap(const M &m) 
   651   {
   652     return NegMap<M>(m);
   653   }
   654 
   655 
   656   ///Absolute value of a map
   657 
   658   ///This \ref concept::ReadMap "read only map" returns the absolute value
   659   ///of the
   660   ///value returned by the
   661   ///given map. Its \c Key and \c Value will be inherited
   662   ///from <tt>M</tt>. <tt>Value</tt>
   663   ///must be comparable to <tt>0</tt> and the unary <tt>-</tt>
   664   ///operator must be defined for it, of course.
   665   ///
   666   ///\bug We need a unified way to handle the situation below:
   667   ///\code
   668   ///  struct _UnConvertible {};
   669   ///  template<class A> inline A t_abs(A a) {return _UnConvertible();}
   670   ///  template<> inline int t_abs<>(int n) {return abs(n);}
   671   ///  template<> inline long int t_abs<>(long int n) {return labs(n);}
   672   ///  template<> inline long long int t_abs<>(long long int n) {return ::llabs(n);}
   673   ///  template<> inline float t_abs<>(float n) {return fabsf(n);}
   674   ///  template<> inline double t_abs<>(double n) {return fabs(n);}
   675   ///  template<> inline long double t_abs<>(long double n) {return fabsl(n);}
   676   ///\endcode
   677   
   678 
   679   template<class M> 
   680   class AbsMap
   681   {
   682     typename SmartConstReference<M>::Type m;
   683   public:
   684 
   685     typedef True NeedCopy;
   686     ///\e
   687     typedef typename M::Key Key;
   688     ///\e
   689     typedef typename M::Value Value;
   690 
   691     ///Constructor
   692     AbsMap(const M &_m) : m(_m) {};
   693     Value operator[](Key k) const {Value tmp=m[k]; return tmp>=0?tmp:-tmp;}
   694   };
   695   
   696   ///Returns a \ref AbsMap class
   697 
   698   ///This function just returns a \ref AbsMap class.
   699   ///\relates AbsMap
   700   template<class M> 
   701   inline AbsMap<M> absMap(const M &m) 
   702   {
   703     return AbsMap<M>(m);
   704   }
   705 
   706   ///Converts an STL style functor to a map
   707 
   708   ///This \ref concept::ReadMap "read only map" returns the value
   709   ///of a
   710   ///given map.
   711   ///
   712   ///Template parameters \c K and \c V will become its
   713   ///\c Key and \c Value. They must be given explicitely
   714   ///because a functor does not provide such typedefs.
   715   ///
   716   ///Parameter \c F is the type of the used functor.
   717   
   718 
   719   template<class K,class V,class F> 
   720   class FunctorMap
   721   {
   722     const F &f;
   723   public:
   724 
   725     typedef True NeedCopy;
   726     ///\e
   727     typedef K Key;
   728     ///\e
   729     typedef V Value;
   730 
   731     ///Constructor
   732     FunctorMap(const F &_f) : f(_f) {};
   733     Value operator[](Key k) const {return f(k);}
   734   };
   735   
   736   ///Returns a \ref FunctorMap class
   737 
   738   ///This function just returns a \ref FunctorMap class.
   739   ///
   740   ///The third template parameter isn't necessary to be given.
   741   ///\relates FunctorMap
   742   template<class K,class V, class F>
   743   inline FunctorMap<K,V,F> functorMap(const F &f) 
   744   {
   745     return FunctorMap<K,V,F>(f);
   746   }
   747 
   748   ///Converts a map to an STL style (unary) functor
   749 
   750   ///This class Converts a map to an STL style (unary) functor.
   751   ///that is it provides an <tt>operator()</tt> to read its values.
   752   ///
   753   ///For the sake of convenience it also works as
   754   ///a ususal \ref concept::ReadMap "readable map",
   755   ///i.e. <tt>operator[]</tt> and the \c Key and \c Value typedefs also exist.
   756 
   757   template<class M> 
   758   class MapFunctor
   759   {
   760     typename SmartConstReference<M>::Type m;
   761   public:
   762 
   763     typedef True NeedCopy;
   764     ///\e
   765     typedef typename M::Key argument_type;
   766     ///\e
   767     typedef typename M::Value result_type;
   768     ///\e
   769     typedef typename M::Key Key;
   770     ///\e
   771     typedef typename M::Value Value;
   772 
   773     ///Constructor
   774     MapFunctor(const M &_m) : m(_m) {};
   775     ///Returns a value of the map
   776     Value operator()(Key k) const {return m[k];}
   777     ///\e
   778     Value operator[](Key k) const {return m[k];}
   779   };
   780   
   781   ///Returns a \ref MapFunctor class
   782 
   783   ///This function just returns a \ref MapFunctor class.
   784   ///\relates MapFunctor
   785   template<class M> 
   786   inline MapFunctor<M> mapFunctor(const M &m) 
   787   {
   788     return MapFunctor<M>(m);
   789   }
   790 
   791 
   792   ///Apply all map setting operations to two maps
   793 
   794   ///This map has two \ref concept::WriteMap "writable map"
   795   ///parameters and each write request will be passed to both of them.
   796   ///If \c M1 is also \ref concept::ReadMap "readable",
   797   ///then the read operations will return the
   798   ///corresponding values of \c M1.
   799   ///
   800   ///The \c Key and \c Value will be inherited from \c M1.
   801   ///The \c Key and \c Value of M2 must be convertible from those of \c M1.
   802 
   803   template<class M1,class M2> 
   804   class ForkMap
   805   {
   806     typename SmartConstReference<M1>::Type m1;
   807     typename SmartConstReference<M2>::Type m2;
   808   public:
   809 
   810     typedef True NeedCopy;
   811     ///\e
   812     typedef typename M1::Key Key;
   813     ///\e
   814     typedef typename M1::Value Value;
   815 
   816     ///Constructor
   817     ForkMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
   818     Value operator[](Key k) const {return m1[k];}
   819     void set(Key k,const Value &v) {m1.set(k,v); m2.set(k,v);}
   820   };
   821   
   822   ///Returns an \ref ForkMap class
   823 
   824   ///This function just returns an \ref ForkMap class.
   825   ///\todo How to call these type of functions?
   826   ///
   827   ///\relates ForkMap
   828   ///\todo Wrong scope in Doxygen when \c \\relates is used
   829   template<class M1,class M2> 
   830   inline ForkMap<M1,M2> forkMap(const M1 &m1,const M2 &m2) 
   831   {
   832     return ForkMap<M1,M2>(m1,m2);
   833   }
   834 
   835 
   836   
   837   /* ************* BOOL MAPS ******************* */
   838   
   839   ///Logical 'not' of a map
   840   
   841   ///This bool \ref concept::ReadMap "read only map" returns the 
   842   ///logical negation of
   843   ///value returned by the
   844   ///given map. Its \c Key and will be inherited from \c M,
   845   ///its Value is <tt>bool</tt>.
   846 
   847   template<class M> 
   848   class NotMap
   849   {
   850     typename SmartConstReference<M>::Type m;
   851   public:
   852 
   853     typedef True NeedCopy;
   854     ///\e
   855     typedef typename M::Key Key;
   856     ///\e
   857     typedef bool Value;
   858 
   859     ///Constructor
   860     NotMap(const M &_m) : m(_m) {};
   861     Value operator[](Key k) const {return !m[k];}
   862   };
   863   
   864   ///Returns a \ref NotMap class
   865   
   866   ///This function just returns a \ref NotMap class.
   867   ///\relates NotMap
   868   template<class M> 
   869   inline NotMap<M> notMap(const M &m) 
   870   {
   871     return NotMap<M>(m);
   872   }
   873 
   874 
   875 
   876 
   877 
   878 
   879 
   880 
   881 
   882 
   883 
   884   /// @}
   885 }
   886 
   887 #endif // LEMON_MAPS_H