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