lemon/maps.h
changeset 25 751cd8f9bb1c
child 26 61bf7f22a6d6
equal deleted inserted replaced
-1:000000000000 0:a78a92aed4d0
       
     1 /* -*- C++ -*-
       
     2  *
       
     3  * This file is a part of LEMON, a generic C++ optimization library
       
     4  *
       
     5  * Copyright (C) 2003-2007
       
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
       
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
       
     8  *
       
     9  * Permission to use, modify and distribute this software is granted
       
    10  * provided that this copyright notice appears in all copies. For
       
    11  * precise terms see the accompanying LICENSE file.
       
    12  *
       
    13  * This software is provided "AS IS" with no warranty of any kind,
       
    14  * express or implied, and with no claim as to its suitability for any
       
    15  * purpose.
       
    16  *
       
    17  */
       
    18 
       
    19 #ifndef LEMON_MAPS_H
       
    20 #define LEMON_MAPS_H
       
    21 
       
    22 #include <iterator>
       
    23 #include <functional>
       
    24 #include <vector>
       
    25 
       
    26 #include <lemon/bits/utility.h>
       
    27 // #include <lemon/bits/traits.h>
       
    28 
       
    29 ///\file
       
    30 ///\ingroup maps
       
    31 ///\brief Miscellaneous property maps
       
    32 ///
       
    33 #include <map>
       
    34 
       
    35 namespace lemon {
       
    36 
       
    37   /// \addtogroup maps
       
    38   /// @{
       
    39 
       
    40   /// Base class of maps.
       
    41 
       
    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>
       
    45   class MapBase {
       
    46   public:
       
    47     ///\e
       
    48     typedef K Key;
       
    49     ///\e
       
    50     typedef T Value;
       
    51   };
       
    52 
       
    53   /// Null map. (a.k.a. DoNothingMap)
       
    54 
       
    55   /// If you have to provide a map only for its type definitions,
       
    56   /// or if you have to provide a writable map, but
       
    57   /// data written to it will sent to <tt>/dev/null</tt>...
       
    58   template<typename K, typename T>
       
    59   class NullMap : public MapBase<K, T> {
       
    60   public:
       
    61     typedef MapBase<K, T> Parent;
       
    62     typedef typename Parent::Key Key;
       
    63     typedef typename Parent::Value Value;
       
    64     
       
    65     /// Gives back a default constructed element.
       
    66     T operator[](const K&) const { return T(); }
       
    67     /// Absorbs the value.
       
    68     void set(const K&, const T&) {}
       
    69   };
       
    70 
       
    71   template <typename K, typename V> 
       
    72   NullMap<K, V> nullMap() {
       
    73     return NullMap<K, V>();
       
    74   }
       
    75 
       
    76 
       
    77   /// Constant map.
       
    78 
       
    79   /// This is a readable map which assigns a specified value to each key.
       
    80   /// In other aspects it is equivalent to the \c NullMap.
       
    81   template<typename K, typename T>
       
    82   class ConstMap : public MapBase<K, T> {
       
    83   private:
       
    84     T v;
       
    85   public:
       
    86 
       
    87     typedef MapBase<K, T> Parent;
       
    88     typedef typename Parent::Key Key;
       
    89     typedef typename Parent::Value Value;
       
    90 
       
    91     /// Default constructor
       
    92 
       
    93     /// The value of the map will be uninitialized. 
       
    94     /// (More exactly it will be default constructed.)
       
    95     ConstMap() {}
       
    96     ///\e
       
    97 
       
    98     /// \param _v The initial value of the map.
       
    99     ///
       
   100     ConstMap(const T &_v) : v(_v) {}
       
   101     
       
   102     ///\e
       
   103     T operator[](const K&) const { return v; }
       
   104 
       
   105     ///\e
       
   106     void setAll(const T &t) {
       
   107       v = t;
       
   108     }    
       
   109 
       
   110     template<typename T1>
       
   111     struct rebind {
       
   112       typedef ConstMap<K, T1> other;
       
   113     };
       
   114 
       
   115     template<typename T1>
       
   116     ConstMap(const ConstMap<K, T1> &, const T &_v) : v(_v) {}
       
   117   };
       
   118 
       
   119   ///Returns a \c ConstMap class
       
   120 
       
   121   ///This function just returns a \c ConstMap class.
       
   122   ///\relates ConstMap
       
   123   template<typename K, typename V> 
       
   124   inline ConstMap<K, V> constMap(const V &v) {
       
   125     return ConstMap<K, V>(v);
       
   126   }
       
   127 
       
   128 
       
   129   template<typename T, T v>
       
   130   struct Const { };
       
   131 
       
   132   /// Constant map with inlined constant value.
       
   133 
       
   134   /// This is a readable map which assigns a specified value to each key.
       
   135   /// In other aspects it is equivalent to the \c NullMap.
       
   136   template<typename K, typename V, V v>
       
   137   class ConstMap<K, Const<V, v> > : public MapBase<K, V> {
       
   138   public:
       
   139     typedef MapBase<K, V> Parent;
       
   140     typedef typename Parent::Key Key;
       
   141     typedef typename Parent::Value Value;
       
   142 
       
   143     ConstMap() { }
       
   144     ///\e
       
   145     V operator[](const K&) const { return v; }
       
   146     ///\e
       
   147     void set(const K&, const V&) { }
       
   148   };
       
   149 
       
   150   ///Returns a \c ConstMap class
       
   151 
       
   152   ///This function just returns a \c ConstMap class with inlined value.
       
   153   ///\relates ConstMap
       
   154   template<typename K, typename V, V v> 
       
   155   inline ConstMap<K, Const<V, v> > constMap() {
       
   156     return ConstMap<K, Const<V, v> >();
       
   157   }
       
   158 
       
   159   ///Map based on std::map
       
   160 
       
   161   ///This is essentially a wrapper for \c std::map. With addition that
       
   162   ///you can specify a default value different from \c Value() .
       
   163   template <typename K, typename T, typename Compare = std::less<K> >
       
   164   class StdMap {
       
   165     template <typename K1, typename T1, typename C1>
       
   166     friend class StdMap;
       
   167   public:
       
   168 
       
   169     typedef True ReferenceMapTag;
       
   170     ///\e
       
   171     typedef K Key;
       
   172     ///\e
       
   173     typedef T Value;
       
   174     ///\e
       
   175     typedef T& Reference;
       
   176     ///\e
       
   177     typedef const T& ConstReference;
       
   178 
       
   179   private:
       
   180     
       
   181     typedef std::map<K, T, Compare> Map;
       
   182     Value _value;
       
   183     Map _map;
       
   184 
       
   185   public:
       
   186 
       
   187     /// Constructor with specified default value
       
   188     StdMap(const T& value = T()) : _value(value) {}
       
   189     /// \brief Constructs the map from an appropriate std::map, and explicitly
       
   190     /// specifies a default value.
       
   191     template <typename T1, typename Comp1>
       
   192     StdMap(const std::map<Key, T1, Comp1> &map, const T& value = T()) 
       
   193       : _map(map.begin(), map.end()), _value(value) {}
       
   194     
       
   195     /// \brief Constructs a map from an other StdMap.
       
   196     template<typename T1, typename Comp1>
       
   197     StdMap(const StdMap<Key, T1, Comp1> &c) 
       
   198       : _map(c._map.begin(), c._map.end()), _value(c._value) {}
       
   199 
       
   200   private:
       
   201 
       
   202     StdMap& operator=(const StdMap&);
       
   203 
       
   204   public:
       
   205 
       
   206     ///\e
       
   207     Reference operator[](const Key &k) {
       
   208       typename Map::iterator it = _map.lower_bound(k);
       
   209       if (it != _map.end() && !_map.key_comp()(k, it->first))
       
   210 	return it->second;
       
   211       else
       
   212 	return _map.insert(it, std::make_pair(k, _value))->second;
       
   213     }
       
   214 
       
   215     /// \e 
       
   216     ConstReference operator[](const Key &k) const {
       
   217       typename Map::const_iterator it = _map.find(k);
       
   218       if (it != _map.end())
       
   219 	return it->second;
       
   220       else
       
   221 	return _value;
       
   222     }
       
   223 
       
   224     /// \e 
       
   225     void set(const Key &k, const T &t) {
       
   226       typename Map::iterator it = _map.lower_bound(k);
       
   227       if (it != _map.end() && !_map.key_comp()(k, it->first))
       
   228 	it->second = t;
       
   229       else
       
   230 	_map.insert(it, std::make_pair(k, t));
       
   231     }
       
   232 
       
   233     /// \e
       
   234     void setAll(const T &t) {
       
   235       _value = t;
       
   236       _map.clear();
       
   237     }    
       
   238 
       
   239     template <typename T1, typename C1 = std::less<T1> >
       
   240     struct rebind {
       
   241       typedef StdMap<Key, T1, C1> other;
       
   242     };
       
   243   };
       
   244 
       
   245   /// \brief Map for storing values for the range \c [0..size-1] range keys
       
   246   ///
       
   247   /// The current map has the \c [0..size-1] keyset and the values
       
   248   /// are stored in a \c std::vector<T>  container. It can be used with
       
   249   /// some data structures, for example \c UnionFind, \c BinHeap, when 
       
   250   /// the used items are small integer numbers.
       
   251   template <typename T>
       
   252   class IntegerMap {
       
   253 
       
   254     template <typename T1>
       
   255     friend class IntegerMap;
       
   256 
       
   257   public:
       
   258 
       
   259     typedef True ReferenceMapTag;
       
   260     ///\e
       
   261     typedef int Key;
       
   262     ///\e
       
   263     typedef T Value;
       
   264     ///\e
       
   265     typedef T& Reference;
       
   266     ///\e
       
   267     typedef const T& ConstReference;
       
   268 
       
   269   private:
       
   270     
       
   271     typedef std::vector<T> Vector;
       
   272     Vector _vector;
       
   273 
       
   274   public:
       
   275 
       
   276     /// Constructor with specified default value
       
   277     IntegerMap(int size = 0, const T& value = T()) : _vector(size, value) {}
       
   278 
       
   279     /// \brief Constructs the map from an appropriate std::vector.
       
   280     template <typename T1>
       
   281     IntegerMap(const std::vector<T1>& vector) 
       
   282       : _vector(vector.begin(), vector.end()) {}
       
   283     
       
   284     /// \brief Constructs a map from an other IntegerMap.
       
   285     template <typename T1>
       
   286     IntegerMap(const IntegerMap<T1> &c) 
       
   287       : _vector(c._vector.begin(), c._vector.end()) {}
       
   288 
       
   289     /// \brief Resize the container
       
   290     void resize(int size, const T& value = T()) {
       
   291       _vector.resize(size, value);
       
   292     }
       
   293 
       
   294   private:
       
   295 
       
   296     IntegerMap& operator=(const IntegerMap&);
       
   297 
       
   298   public:
       
   299 
       
   300     ///\e
       
   301     Reference operator[](Key k) {
       
   302       return _vector[k];
       
   303     }
       
   304 
       
   305     /// \e 
       
   306     ConstReference operator[](Key k) const {
       
   307       return _vector[k];
       
   308     }
       
   309 
       
   310     /// \e 
       
   311     void set(const Key &k, const T& t) {
       
   312       _vector[k] = t;
       
   313     }
       
   314 
       
   315   };
       
   316 
       
   317   /// @}
       
   318 
       
   319   /// \addtogroup map_adaptors
       
   320   /// @{
       
   321 
       
   322   /// \brief Identity mapping.
       
   323   ///
       
   324   /// This mapping gives back the given key as value without any
       
   325   /// modification. 
       
   326   template <typename T>
       
   327   class IdentityMap : public MapBase<T, T> {
       
   328   public:
       
   329     typedef MapBase<T, T> Parent;
       
   330     typedef typename Parent::Key Key;
       
   331     typedef typename Parent::Value Value;
       
   332 
       
   333     /// \e
       
   334     const T& operator[](const T& t) const {
       
   335       return t;
       
   336     }
       
   337   };
       
   338 
       
   339   ///Returns an \c IdentityMap class
       
   340 
       
   341   ///This function just returns an \c IdentityMap class.
       
   342   ///\relates IdentityMap
       
   343   template<typename T>
       
   344   inline IdentityMap<T> identityMap() {
       
   345     return IdentityMap<T>();
       
   346   }
       
   347   
       
   348 
       
   349   ///Convert the \c Value of a map to another type.
       
   350 
       
   351   ///This \c concepts::ReadMap "read only map"
       
   352   ///converts the \c Value of a maps to type \c T.
       
   353   ///Its \c Key is inherited from \c M.
       
   354   template <typename M, typename T> 
       
   355   class ConvertMap : public MapBase<typename M::Key, T> {
       
   356     const M& m;
       
   357   public:
       
   358     typedef MapBase<typename M::Key, T> Parent;
       
   359     typedef typename Parent::Key Key;
       
   360     typedef typename Parent::Value Value;
       
   361 
       
   362     ///Constructor
       
   363 
       
   364     ///Constructor
       
   365     ///\param _m is the underlying map
       
   366     ConvertMap(const M &_m) : m(_m) {};
       
   367 
       
   368     /// \brief The subscript operator.
       
   369     ///
       
   370     /// The subscript operator.
       
   371     /// \param k The key
       
   372     /// \return The target of the arc 
       
   373     Value operator[](const Key& k) const {return m[k];}
       
   374   };
       
   375   
       
   376   ///Returns an \c ConvertMap class
       
   377 
       
   378   ///This function just returns an \c ConvertMap class.
       
   379   ///\relates ConvertMap
       
   380   template<typename T, typename M>
       
   381   inline ConvertMap<M, T> convertMap(const M &m) {
       
   382     return ConvertMap<M, T>(m);
       
   383   }
       
   384 
       
   385   ///Simple wrapping of the map
       
   386 
       
   387   ///This \c concepts::ReadMap "read only map" returns the simple
       
   388   ///wrapping of the given map. Sometimes the reference maps cannot be
       
   389   ///combined with simple read maps. This map adaptor wraps the given
       
   390   ///map to simple read map.
       
   391   template<typename M> 
       
   392   class SimpleMap : public MapBase<typename M::Key, typename M::Value> {
       
   393     const M& m;
       
   394 
       
   395   public:
       
   396     typedef MapBase<typename M::Key, typename M::Value> Parent;
       
   397     typedef typename Parent::Key Key;
       
   398     typedef typename Parent::Value Value;
       
   399 
       
   400     ///Constructor
       
   401     SimpleMap(const M &_m) : m(_m) {};
       
   402     ///\e
       
   403     Value operator[](Key k) const {return m[k];}
       
   404   };
       
   405 
       
   406   ///Simple writeable wrapping of the map
       
   407 
       
   408   ///This \c concepts::ReadMap "read only map" returns the simple
       
   409   ///wrapping of the given map. Sometimes the reference maps cannot be
       
   410   ///combined with simple read-write maps. This map adaptor wraps the
       
   411   ///given map to simple read-write map.
       
   412   template<typename M> 
       
   413   class SimpleWriteMap : public MapBase<typename M::Key, typename M::Value> {
       
   414     M& m;
       
   415 
       
   416   public:
       
   417     typedef MapBase<typename M::Key, typename M::Value> Parent;
       
   418     typedef typename Parent::Key Key;
       
   419     typedef typename Parent::Value Value;
       
   420 
       
   421     ///Constructor
       
   422     SimpleWriteMap(M &_m) : m(_m) {};
       
   423     ///\e
       
   424     Value operator[](Key k) const {return m[k];}
       
   425     ///\e
       
   426     void set(Key k, const Value& c) { m.set(k, c); }
       
   427   };
       
   428 
       
   429   ///Sum of two maps
       
   430 
       
   431   ///This \c concepts::ReadMap "read only map" returns the sum of the two
       
   432   ///given maps. Its \c Key and \c Value will be inherited from \c M1.
       
   433   ///The \c Key and \c Value of M2 must be convertible to those of \c M1.
       
   434 
       
   435   template<typename M1, typename M2> 
       
   436   class AddMap : public MapBase<typename M1::Key, typename M1::Value> {
       
   437     const M1& m1;
       
   438     const M2& m2;
       
   439 
       
   440   public:
       
   441     typedef MapBase<typename M1::Key, typename M1::Value> Parent;
       
   442     typedef typename Parent::Key Key;
       
   443     typedef typename Parent::Value Value;
       
   444 
       
   445     ///Constructor
       
   446     AddMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
       
   447     ///\e
       
   448     Value operator[](Key k) const {return m1[k]+m2[k];}
       
   449   };
       
   450   
       
   451   ///Returns an \c AddMap class
       
   452 
       
   453   ///This function just returns an \c AddMap class.
       
   454   ///\todo How to call these type of functions?
       
   455   ///
       
   456   ///\relates AddMap
       
   457   template<typename M1, typename M2> 
       
   458   inline AddMap<M1, M2> addMap(const M1 &m1,const M2 &m2) {
       
   459     return AddMap<M1, M2>(m1,m2);
       
   460   }
       
   461 
       
   462   ///Shift a map with a constant.
       
   463 
       
   464   ///This \c concepts::ReadMap "read only map" returns the sum of the
       
   465   ///given map and a constant value.
       
   466   ///Its \c Key and \c Value is inherited from \c M.
       
   467   ///
       
   468   ///Actually,
       
   469   ///\code
       
   470   ///  ShiftMap<X> sh(x,v);
       
   471   ///\endcode
       
   472   ///is equivalent with
       
   473   ///\code
       
   474   ///  ConstMap<X::Key, X::Value> c_tmp(v);
       
   475   ///  AddMap<X, ConstMap<X::Key, X::Value> > sh(x,v);
       
   476   ///\endcode
       
   477   template<typename M, typename C = typename M::Value> 
       
   478   class ShiftMap : public MapBase<typename M::Key, typename M::Value> {
       
   479     const M& m;
       
   480     C v;
       
   481   public:
       
   482     typedef MapBase<typename M::Key, typename M::Value> Parent;
       
   483     typedef typename Parent::Key Key;
       
   484     typedef typename Parent::Value Value;
       
   485 
       
   486     ///Constructor
       
   487 
       
   488     ///Constructor
       
   489     ///\param _m is the undelying map
       
   490     ///\param _v is the shift value
       
   491     ShiftMap(const M &_m, const C &_v ) : m(_m), v(_v) {};
       
   492     ///\e
       
   493     Value operator[](Key k) const {return m[k] + v;}
       
   494   };
       
   495 
       
   496   ///Shift a map with a constant.
       
   497 
       
   498   ///This \c concepts::ReadWriteMap "read-write map" returns the sum of the
       
   499   ///given map and a constant value. It makes also possible to write the map.
       
   500   ///Its \c Key and \c Value is inherited from \c M.
       
   501   ///
       
   502   ///Actually,
       
   503   ///\code
       
   504   ///  ShiftMap<X> sh(x,v);
       
   505   ///\endcode
       
   506   ///is equivalent with
       
   507   ///\code
       
   508   ///  ConstMap<X::Key, X::Value> c_tmp(v);
       
   509   ///  AddMap<X, ConstMap<X::Key, X::Value> > sh(x,v);
       
   510   ///\endcode
       
   511   template<typename M, typename C = typename M::Value> 
       
   512   class ShiftWriteMap : public MapBase<typename M::Key, typename M::Value> {
       
   513     M& m;
       
   514     C v;
       
   515   public:
       
   516     typedef MapBase<typename M::Key, typename M::Value> Parent;
       
   517     typedef typename Parent::Key Key;
       
   518     typedef typename Parent::Value Value;
       
   519 
       
   520     ///Constructor
       
   521 
       
   522     ///Constructor
       
   523     ///\param _m is the undelying map
       
   524     ///\param _v is the shift value
       
   525     ShiftWriteMap(M &_m, const C &_v ) : m(_m), v(_v) {};
       
   526     /// \e
       
   527     Value operator[](Key k) const {return m[k] + v;}
       
   528     /// \e
       
   529     void set(Key k, const Value& c) { m.set(k, c - v); }
       
   530   };
       
   531   
       
   532   ///Returns an \c ShiftMap class
       
   533 
       
   534   ///This function just returns an \c ShiftMap class.
       
   535   ///\relates ShiftMap
       
   536   template<typename M, typename C> 
       
   537   inline ShiftMap<M, C> shiftMap(const M &m,const C &v) {
       
   538     return ShiftMap<M, C>(m,v);
       
   539   }
       
   540 
       
   541   template<typename M, typename C> 
       
   542   inline ShiftWriteMap<M, C> shiftMap(M &m,const C &v) {
       
   543     return ShiftWriteMap<M, C>(m,v);
       
   544   }
       
   545 
       
   546   ///Difference of two maps
       
   547 
       
   548   ///This \c concepts::ReadMap "read only map" returns the difference
       
   549   ///of the values of the two
       
   550   ///given maps. Its \c Key and \c Value will be inherited from \c M1.
       
   551   ///The \c Key and \c Value of \c M2 must be convertible to those of \c M1.
       
   552 
       
   553   template<typename M1, typename M2> 
       
   554   class SubMap : public MapBase<typename M1::Key, typename M1::Value> {
       
   555     const M1& m1;
       
   556     const M2& m2;
       
   557   public:
       
   558     typedef MapBase<typename M1::Key, typename M1::Value> Parent;
       
   559     typedef typename Parent::Key Key;
       
   560     typedef typename Parent::Value Value;
       
   561 
       
   562     ///Constructor
       
   563     SubMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
       
   564     /// \e
       
   565     Value operator[](Key k) const {return m1[k]-m2[k];}
       
   566   };
       
   567   
       
   568   ///Returns a \c SubMap class
       
   569 
       
   570   ///This function just returns a \c SubMap class.
       
   571   ///
       
   572   ///\relates SubMap
       
   573   template<typename M1, typename M2> 
       
   574   inline SubMap<M1, M2> subMap(const M1 &m1, const M2 &m2) {
       
   575     return SubMap<M1, M2>(m1, m2);
       
   576   }
       
   577 
       
   578   ///Product of two maps
       
   579 
       
   580   ///This \c concepts::ReadMap "read only map" returns the product of the
       
   581   ///values of the two
       
   582   ///given
       
   583   ///maps. Its \c Key and \c Value will be inherited from \c M1.
       
   584   ///The \c Key and \c Value of \c M2 must be convertible to those of \c M1.
       
   585 
       
   586   template<typename M1, typename M2> 
       
   587   class MulMap : public MapBase<typename M1::Key, typename M1::Value> {
       
   588     const M1& m1;
       
   589     const M2& m2;
       
   590   public:
       
   591     typedef MapBase<typename M1::Key, typename M1::Value> Parent;
       
   592     typedef typename Parent::Key Key;
       
   593     typedef typename Parent::Value Value;
       
   594 
       
   595     ///Constructor
       
   596     MulMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
       
   597     /// \e
       
   598     Value operator[](Key k) const {return m1[k]*m2[k];}
       
   599   };
       
   600   
       
   601   ///Returns a \c MulMap class
       
   602 
       
   603   ///This function just returns a \c MulMap class.
       
   604   ///\relates MulMap
       
   605   template<typename M1, typename M2> 
       
   606   inline MulMap<M1, M2> mulMap(const M1 &m1,const M2 &m2) {
       
   607     return MulMap<M1, M2>(m1,m2);
       
   608   }
       
   609  
       
   610   ///Scales a maps with a constant.
       
   611 
       
   612   ///This \c concepts::ReadMap "read only map" returns the value of the
       
   613   ///given map multiplied from the left side with a constant value.
       
   614   ///Its \c Key and \c Value is inherited from \c M.
       
   615   ///
       
   616   ///Actually,
       
   617   ///\code
       
   618   ///  ScaleMap<X> sc(x,v);
       
   619   ///\endcode
       
   620   ///is equivalent with
       
   621   ///\code
       
   622   ///  ConstMap<X::Key, X::Value> c_tmp(v);
       
   623   ///  MulMap<X, ConstMap<X::Key, X::Value> > sc(x,v);
       
   624   ///\endcode
       
   625   template<typename M, typename C = typename M::Value> 
       
   626   class ScaleMap : public MapBase<typename M::Key, typename M::Value> {
       
   627     const M& m;
       
   628     C v;
       
   629   public:
       
   630     typedef MapBase<typename M::Key, typename M::Value> Parent;
       
   631     typedef typename Parent::Key Key;
       
   632     typedef typename Parent::Value Value;
       
   633 
       
   634     ///Constructor
       
   635 
       
   636     ///Constructor
       
   637     ///\param _m is the undelying map
       
   638     ///\param _v is the scaling value
       
   639     ScaleMap(const M &_m, const C &_v ) : m(_m), v(_v) {};
       
   640     /// \e
       
   641     Value operator[](Key k) const {return v * m[k];}
       
   642   };
       
   643 
       
   644   ///Scales a maps with a constant.
       
   645 
       
   646   ///This \c concepts::ReadWriteMap "read-write map" returns the value of the
       
   647   ///given map multiplied from the left side with a constant value. It can
       
   648   ///be used as write map also if the given multiplier is not zero.
       
   649   ///Its \c Key and \c Value is inherited from \c M.
       
   650   template<typename M, typename C = typename M::Value> 
       
   651   class ScaleWriteMap : public MapBase<typename M::Key, typename M::Value> {
       
   652     M& m;
       
   653     C v;
       
   654   public:
       
   655     typedef MapBase<typename M::Key, typename M::Value> Parent;
       
   656     typedef typename Parent::Key Key;
       
   657     typedef typename Parent::Value Value;
       
   658 
       
   659     ///Constructor
       
   660 
       
   661     ///Constructor
       
   662     ///\param _m is the undelying map
       
   663     ///\param _v is the scaling value
       
   664     ScaleWriteMap(M &_m, const C &_v ) : m(_m), v(_v) {};
       
   665     /// \e
       
   666     Value operator[](Key k) const {return v * m[k];}
       
   667     /// \e
       
   668     void set(Key k, const Value& c) { m.set(k, c / v);}
       
   669   };
       
   670   
       
   671   ///Returns an \c ScaleMap class
       
   672 
       
   673   ///This function just returns an \c ScaleMap class.
       
   674   ///\relates ScaleMap
       
   675   template<typename M, typename C> 
       
   676   inline ScaleMap<M, C> scaleMap(const M &m,const C &v) {
       
   677     return ScaleMap<M, C>(m,v);
       
   678   }
       
   679 
       
   680   template<typename M, typename C> 
       
   681   inline ScaleWriteMap<M, C> scaleMap(M &m,const C &v) {
       
   682     return ScaleWriteMap<M, C>(m,v);
       
   683   }
       
   684 
       
   685   ///Quotient of two maps
       
   686 
       
   687   ///This \c concepts::ReadMap "read only map" returns the quotient of the
       
   688   ///values of the two
       
   689   ///given maps. Its \c Key and \c Value will be inherited from \c M1.
       
   690   ///The \c Key and \c Value of \c M2 must be convertible to those of \c M1.
       
   691 
       
   692   template<typename M1, typename M2> 
       
   693   class DivMap : public MapBase<typename M1::Key, typename M1::Value> {
       
   694     const M1& m1;
       
   695     const M2& m2;
       
   696   public:
       
   697     typedef MapBase<typename M1::Key, typename M1::Value> Parent;
       
   698     typedef typename Parent::Key Key;
       
   699     typedef typename Parent::Value Value;
       
   700 
       
   701     ///Constructor
       
   702     DivMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
       
   703     /// \e
       
   704     Value operator[](Key k) const {return m1[k]/m2[k];}
       
   705   };
       
   706   
       
   707   ///Returns a \c DivMap class
       
   708 
       
   709   ///This function just returns a \c DivMap class.
       
   710   ///\relates DivMap
       
   711   template<typename M1, typename M2> 
       
   712   inline DivMap<M1, M2> divMap(const M1 &m1,const M2 &m2) {
       
   713     return DivMap<M1, M2>(m1,m2);
       
   714   }
       
   715   
       
   716   ///Composition of two maps
       
   717 
       
   718   ///This \c concepts::ReadMap "read only map" returns the composition of
       
   719   ///two
       
   720   ///given maps. That is to say, if \c m1 is of type \c M1 and \c m2 is
       
   721   ///of \c M2,
       
   722   ///then for
       
   723   ///\code
       
   724   ///  ComposeMap<M1, M2> cm(m1,m2);
       
   725   ///\endcode
       
   726   /// <tt>cm[x]</tt> will be equal to <tt>m1[m2[x]]</tt>
       
   727   ///
       
   728   ///Its \c Key is inherited from \c M2 and its \c Value is from
       
   729   ///\c M1.
       
   730   ///The \c M2::Value must be convertible to \c M1::Key.
       
   731   ///\todo Check the requirements.
       
   732   template <typename M1, typename M2> 
       
   733   class ComposeMap : public MapBase<typename M2::Key, typename M1::Value> {
       
   734     const M1& m1;
       
   735     const M2& m2;
       
   736   public:
       
   737     typedef MapBase<typename M2::Key, typename M1::Value> Parent;
       
   738     typedef typename Parent::Key Key;
       
   739     typedef typename Parent::Value Value;
       
   740 
       
   741     ///Constructor
       
   742     ComposeMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
       
   743     
       
   744     /// \e
       
   745 
       
   746 
       
   747     /// \todo Use the  MapTraits once it is ported.
       
   748     ///
       
   749 
       
   750     //typename MapTraits<M1>::ConstReturnValue
       
   751     typename M1::Value
       
   752     operator[](Key k) const {return m1[m2[k]];}
       
   753   };
       
   754   ///Returns a \c ComposeMap class
       
   755 
       
   756   ///This function just returns a \c ComposeMap class.
       
   757   ///
       
   758   ///\relates ComposeMap
       
   759   template <typename M1, typename M2> 
       
   760   inline ComposeMap<M1, M2> composeMap(const M1 &m1,const M2 &m2) {
       
   761     return ComposeMap<M1, M2>(m1,m2);
       
   762   }
       
   763   
       
   764   ///Combines of two maps using an STL (binary) functor.
       
   765 
       
   766   ///Combines of two maps using an STL (binary) functor.
       
   767   ///
       
   768   ///
       
   769   ///This \c concepts::ReadMap "read only map" takes two maps and a
       
   770   ///binary functor and returns the composition of
       
   771   ///the two
       
   772   ///given maps unsing the functor. 
       
   773   ///That is to say, if \c m1 and \c m2 is of type \c M1 and \c M2
       
   774   ///and \c f is of \c F,
       
   775   ///then for
       
   776   ///\code
       
   777   ///  CombineMap<M1, M2,F,V> cm(m1,m2,f);
       
   778   ///\endcode
       
   779   /// <tt>cm[x]</tt> will be equal to <tt>f(m1[x],m2[x])</tt>
       
   780   ///
       
   781   ///Its \c Key is inherited from \c M1 and its \c Value is \c V.
       
   782   ///The \c M2::Value and \c M1::Value must be convertible to the corresponding
       
   783   ///input parameter of \c F and the return type of \c F must be convertible
       
   784   ///to \c V.
       
   785   ///\todo Check the requirements.
       
   786   template<typename M1, typename M2, typename F,
       
   787 	   typename V = typename F::result_type> 
       
   788   class CombineMap : public MapBase<typename M1::Key, V> {
       
   789     const M1& m1;
       
   790     const M2& m2;
       
   791     F f;
       
   792   public:
       
   793     typedef MapBase<typename M1::Key, V> Parent;
       
   794     typedef typename Parent::Key Key;
       
   795     typedef typename Parent::Value Value;
       
   796 
       
   797     ///Constructor
       
   798     CombineMap(const M1 &_m1,const M2 &_m2,const F &_f = F())
       
   799       : m1(_m1), m2(_m2), f(_f) {};
       
   800     /// \e
       
   801     Value operator[](Key k) const {return f(m1[k],m2[k]);}
       
   802   };
       
   803   
       
   804   ///Returns a \c CombineMap class
       
   805 
       
   806   ///This function just returns a \c CombineMap class.
       
   807   ///
       
   808   ///For example if \c m1 and \c m2 are both \c double valued maps, then 
       
   809   ///\code
       
   810   ///combineMap<double>(m1,m2,std::plus<double>())
       
   811   ///\endcode
       
   812   ///is equivalent with
       
   813   ///\code
       
   814   ///addMap(m1,m2)
       
   815   ///\endcode
       
   816   ///
       
   817   ///This function is specialized for adaptable binary function
       
   818   ///classes and c++ functions.
       
   819   ///
       
   820   ///\relates CombineMap
       
   821   template<typename M1, typename M2, typename F, typename V> 
       
   822   inline CombineMap<M1, M2, F, V> 
       
   823   combineMap(const M1& m1,const M2& m2, const F& f) {
       
   824     return CombineMap<M1, M2, F, V>(m1,m2,f);
       
   825   }
       
   826 
       
   827   template<typename M1, typename M2, typename F> 
       
   828   inline CombineMap<M1, M2, F, typename F::result_type> 
       
   829   combineMap(const M1& m1, const M2& m2, const F& f) {
       
   830     return combineMap<M1, M2, F, typename F::result_type>(m1,m2,f);
       
   831   }
       
   832 
       
   833   template<typename M1, typename M2, typename K1, typename K2, typename V> 
       
   834   inline CombineMap<M1, M2, V (*)(K1, K2), V> 
       
   835   combineMap(const M1 &m1, const M2 &m2, V (*f)(K1, K2)) {
       
   836     return combineMap<M1, M2, V (*)(K1, K2), V>(m1,m2,f);
       
   837   }
       
   838 
       
   839   ///Negative value of a map
       
   840 
       
   841   ///This \c concepts::ReadMap "read only map" returns the negative
       
   842   ///value of the
       
   843   ///value returned by the
       
   844   ///given map. Its \c Key and \c Value will be inherited from \c M.
       
   845   ///The unary \c - operator must be defined for \c Value, of course.
       
   846 
       
   847   template<typename M> 
       
   848   class NegMap : public MapBase<typename M::Key, typename M::Value> {
       
   849     const M& m;
       
   850   public:
       
   851     typedef MapBase<typename M::Key, typename M::Value> Parent;
       
   852     typedef typename Parent::Key Key;
       
   853     typedef typename Parent::Value Value;
       
   854 
       
   855     ///Constructor
       
   856     NegMap(const M &_m) : m(_m) {};
       
   857     /// \e
       
   858     Value operator[](Key k) const {return -m[k];}
       
   859   };
       
   860   
       
   861   ///Negative value of a map
       
   862 
       
   863   ///This \c concepts::ReadWriteMap "read-write map" returns the negative
       
   864   ///value of the value returned by the
       
   865   ///given map. Its \c Key and \c Value will be inherited from \c M.
       
   866   ///The unary \c - operator must be defined for \c Value, of course.
       
   867 
       
   868   template<typename M> 
       
   869   class NegWriteMap : public MapBase<typename M::Key, typename M::Value> {
       
   870     M& m;
       
   871   public:
       
   872     typedef MapBase<typename M::Key, typename M::Value> Parent;
       
   873     typedef typename Parent::Key Key;
       
   874     typedef typename Parent::Value Value;
       
   875 
       
   876     ///Constructor
       
   877     NegWriteMap(M &_m) : m(_m) {};
       
   878     /// \e
       
   879     Value operator[](Key k) const {return -m[k];}
       
   880     /// \e
       
   881     void set(Key k, const Value& v) { m.set(k, -v); }
       
   882   };
       
   883 
       
   884   ///Returns a \c NegMap class
       
   885 
       
   886   ///This function just returns a \c NegMap class.
       
   887   ///\relates NegMap
       
   888   template <typename M> 
       
   889   inline NegMap<M> negMap(const M &m) {
       
   890     return NegMap<M>(m);
       
   891   }
       
   892 
       
   893   template <typename M> 
       
   894   inline NegWriteMap<M> negMap(M &m) {
       
   895     return NegWriteMap<M>(m);
       
   896   }
       
   897 
       
   898   ///Absolute value of a map
       
   899 
       
   900   ///This \c concepts::ReadMap "read only map" returns the absolute value
       
   901   ///of the
       
   902   ///value returned by the
       
   903   ///given map. Its \c Key and \c Value will be inherited
       
   904   ///from <tt>M</tt>. <tt>Value</tt>
       
   905   ///must be comparable to <tt>0</tt> and the unary <tt>-</tt>
       
   906   ///operator must be defined for it, of course.
       
   907   ///
       
   908   ///\bug We need a unified way to handle the situation below:
       
   909   ///\code
       
   910   ///  struct _UnConvertible {};
       
   911   ///  template<class A> inline A t_abs(A a) {return _UnConvertible();}
       
   912   ///  template<> inline int t_abs<>(int n) {return abs(n);}
       
   913   ///  template<> inline long int t_abs<>(long int n) {return labs(n);}
       
   914   ///  template<> inline long long int t_abs<>(long long int n) {return ::llabs(n);}
       
   915   ///  template<> inline float t_abs<>(float n) {return fabsf(n);}
       
   916   ///  template<> inline double t_abs<>(double n) {return fabs(n);}
       
   917   ///  template<> inline long double t_abs<>(long double n) {return fabsl(n);}
       
   918   ///\endcode
       
   919   
       
   920 
       
   921   template<typename M> 
       
   922   class AbsMap : public MapBase<typename M::Key, typename M::Value> {
       
   923     const M& m;
       
   924   public:
       
   925     typedef MapBase<typename M::Key, typename M::Value> Parent;
       
   926     typedef typename Parent::Key Key;
       
   927     typedef typename Parent::Value Value;
       
   928 
       
   929     ///Constructor
       
   930     AbsMap(const M &_m) : m(_m) {};
       
   931     /// \e
       
   932     Value operator[](Key k) const {
       
   933       Value tmp = m[k]; 
       
   934       return tmp >= 0 ? tmp : -tmp;
       
   935     }
       
   936 
       
   937   };
       
   938   
       
   939   ///Returns a \c AbsMap class
       
   940 
       
   941   ///This function just returns a \c AbsMap class.
       
   942   ///\relates AbsMap
       
   943   template<typename M> 
       
   944   inline AbsMap<M> absMap(const M &m) {
       
   945     return AbsMap<M>(m);
       
   946   }
       
   947 
       
   948   ///Converts an STL style functor to a map
       
   949 
       
   950   ///This \c concepts::ReadMap "read only map" returns the value
       
   951   ///of a
       
   952   ///given map.
       
   953   ///
       
   954   ///Template parameters \c K and \c V will become its
       
   955   ///\c Key and \c Value. They must be given explicitely
       
   956   ///because a functor does not provide such typedefs.
       
   957   ///
       
   958   ///Parameter \c F is the type of the used functor.
       
   959   template<typename F, 
       
   960 	   typename K = typename F::argument_type, 
       
   961 	   typename V = typename F::result_type> 
       
   962   class FunctorMap : public MapBase<K, V> {
       
   963     F f;
       
   964   public:
       
   965     typedef MapBase<K, V> Parent;
       
   966     typedef typename Parent::Key Key;
       
   967     typedef typename Parent::Value Value;
       
   968 
       
   969     ///Constructor
       
   970     FunctorMap(const F &_f = F()) : f(_f) {}
       
   971     /// \e
       
   972     Value operator[](Key k) const { return f(k);}
       
   973   };
       
   974   
       
   975   ///Returns a \c FunctorMap class
       
   976 
       
   977   ///This function just returns a \c FunctorMap class.
       
   978   ///
       
   979   ///It is specialized for adaptable function classes and
       
   980   ///c++ functions.
       
   981   ///\relates FunctorMap
       
   982   template<typename K, typename V, typename F> inline 
       
   983   FunctorMap<F, K, V> functorMap(const F &f) {
       
   984     return FunctorMap<F, K, V>(f);
       
   985   }
       
   986 
       
   987   template <typename F> inline 
       
   988   FunctorMap<F, typename F::argument_type, typename F::result_type> 
       
   989   functorMap(const F &f) {
       
   990     return FunctorMap<F, typename F::argument_type, 
       
   991       typename F::result_type>(f);
       
   992   }
       
   993 
       
   994   template <typename K, typename V> inline 
       
   995   FunctorMap<V (*)(K), K, V> functorMap(V (*f)(K)) {
       
   996     return FunctorMap<V (*)(K), K, V>(f);
       
   997   }
       
   998 
       
   999 
       
  1000   ///Converts a map to an STL style (unary) functor
       
  1001 
       
  1002   ///This class Converts a map to an STL style (unary) functor.
       
  1003   ///that is it provides an <tt>operator()</tt> to read its values.
       
  1004   ///
       
  1005   ///For the sake of convenience it also works as
       
  1006   ///a ususal \c concepts::ReadMap "readable map",
       
  1007   ///i.e. <tt>operator[]</tt> and the \c Key and \c Value typedefs also exist.
       
  1008   template <typename M> 
       
  1009   class MapFunctor : public MapBase<typename M::Key, typename M::Value> {
       
  1010     const M& m;
       
  1011   public:
       
  1012     typedef MapBase<typename M::Key, typename M::Value> Parent;
       
  1013     typedef typename Parent::Key Key;
       
  1014     typedef typename Parent::Value Value;
       
  1015 
       
  1016     typedef typename M::Key argument_type;
       
  1017     typedef typename M::Value result_type;
       
  1018 
       
  1019     ///Constructor
       
  1020     MapFunctor(const M &_m) : m(_m) {};
       
  1021     ///\e
       
  1022     Value operator()(Key k) const {return m[k];}
       
  1023     ///\e
       
  1024     Value operator[](Key k) const {return m[k];}
       
  1025   };
       
  1026   
       
  1027   ///Returns a \c MapFunctor class
       
  1028 
       
  1029   ///This function just returns a \c MapFunctor class.
       
  1030   ///\relates MapFunctor
       
  1031   template<typename M> 
       
  1032   inline MapFunctor<M> mapFunctor(const M &m) {
       
  1033     return MapFunctor<M>(m);
       
  1034   }
       
  1035 
       
  1036   ///Applies all map setting operations to two maps
       
  1037 
       
  1038   ///This map has two \c concepts::ReadMap "readable map"
       
  1039   ///parameters and each read request will be passed just to the
       
  1040   ///first map. This class is the just readable map type of the ForkWriteMap.
       
  1041   ///
       
  1042   ///The \c Key and \c Value will be inherited from \c M1.
       
  1043   ///The \c Key and \c Value of M2 must be convertible from those of \c M1.
       
  1044   template<typename  M1, typename M2> 
       
  1045   class ForkMap : public MapBase<typename M1::Key, typename M1::Value> {
       
  1046     const M1& m1;
       
  1047     const M2& m2;
       
  1048   public:
       
  1049     typedef MapBase<typename M1::Key, typename M1::Value> Parent;
       
  1050     typedef typename Parent::Key Key;
       
  1051     typedef typename Parent::Value Value;
       
  1052 
       
  1053     ///Constructor
       
  1054     ForkMap(const M1 &_m1, const M2 &_m2) : m1(_m1), m2(_m2) {};
       
  1055     /// \e
       
  1056     Value operator[](Key k) const {return m1[k];}
       
  1057   };
       
  1058 
       
  1059 
       
  1060   ///Applies all map setting operations to two maps
       
  1061 
       
  1062   ///This map has two \c concepts::WriteMap "writable map"
       
  1063   ///parameters and each write request will be passed to both of them.
       
  1064   ///If \c M1 is also \c concepts::ReadMap "readable",
       
  1065   ///then the read operations will return the
       
  1066   ///corresponding values of \c M1.
       
  1067   ///
       
  1068   ///The \c Key and \c Value will be inherited from \c M1.
       
  1069   ///The \c Key and \c Value of M2 must be convertible from those of \c M1.
       
  1070   template<typename  M1, typename M2> 
       
  1071   class ForkWriteMap : public MapBase<typename M1::Key, typename M1::Value> {
       
  1072     M1& m1;
       
  1073     M2& m2;
       
  1074   public:
       
  1075     typedef MapBase<typename M1::Key, typename M1::Value> Parent;
       
  1076     typedef typename Parent::Key Key;
       
  1077     typedef typename Parent::Value Value;
       
  1078 
       
  1079     ///Constructor
       
  1080     ForkWriteMap(M1 &_m1, M2 &_m2) : m1(_m1), m2(_m2) {};
       
  1081     ///\e
       
  1082     Value operator[](Key k) const {return m1[k];}
       
  1083     ///\e
       
  1084     void set(Key k, const Value &v) {m1.set(k,v); m2.set(k,v);}
       
  1085   };
       
  1086   
       
  1087   ///Returns an \c ForkMap class
       
  1088 
       
  1089   ///This function just returns an \c ForkMap class.
       
  1090   ///
       
  1091   ///\relates ForkMap
       
  1092   template <typename M1, typename M2> 
       
  1093   inline ForkMap<M1, M2> forkMap(const M1 &m1, const M2 &m2) {
       
  1094     return ForkMap<M1, M2>(m1,m2);
       
  1095   }
       
  1096 
       
  1097   template <typename M1, typename M2> 
       
  1098   inline ForkWriteMap<M1, M2> forkMap(M1 &m1, M2 &m2) {
       
  1099     return ForkWriteMap<M1, M2>(m1,m2);
       
  1100   }
       
  1101 
       
  1102 
       
  1103   
       
  1104   /* ************* BOOL MAPS ******************* */
       
  1105   
       
  1106   ///Logical 'not' of a map
       
  1107   
       
  1108   ///This bool \c concepts::ReadMap "read only map" returns the 
       
  1109   ///logical negation of
       
  1110   ///value returned by the
       
  1111   ///given map. Its \c Key and will be inherited from \c M,
       
  1112   ///its Value is <tt>bool</tt>.
       
  1113   template <typename M> 
       
  1114   class NotMap : public MapBase<typename M::Key, bool> {
       
  1115     const M& m;
       
  1116   public:
       
  1117     typedef MapBase<typename M::Key, bool> Parent;
       
  1118     typedef typename Parent::Key Key;
       
  1119     typedef typename Parent::Value Value;
       
  1120 
       
  1121     /// Constructor
       
  1122     NotMap(const M &_m) : m(_m) {};
       
  1123     ///\e
       
  1124     Value operator[](Key k) const {return !m[k];}
       
  1125   };
       
  1126 
       
  1127   ///Logical 'not' of a map with writing possibility
       
  1128   
       
  1129   ///This bool \c concepts::ReadWriteMap "read-write map" returns the 
       
  1130   ///logical negation of value returned by the given map. When it is set,
       
  1131   ///the opposite value is set to the original map.
       
  1132   ///Its \c Key and will be inherited from \c M,
       
  1133   ///its Value is <tt>bool</tt>.
       
  1134   template <typename M> 
       
  1135   class NotWriteMap : public MapBase<typename M::Key, bool> {
       
  1136     M& m;
       
  1137   public:
       
  1138     typedef MapBase<typename M::Key, bool> Parent;
       
  1139     typedef typename Parent::Key Key;
       
  1140     typedef typename Parent::Value Value;
       
  1141 
       
  1142     /// Constructor
       
  1143     NotWriteMap(M &_m) : m(_m) {};
       
  1144     ///\e
       
  1145     Value operator[](Key k) const {return !m[k];}
       
  1146     ///\e
       
  1147     void set(Key k, bool v) { m.set(k, !v); }
       
  1148   };
       
  1149   
       
  1150   ///Returns a \c NotMap class
       
  1151   
       
  1152   ///This function just returns a \c NotMap class.
       
  1153   ///\relates NotMap
       
  1154   template <typename M> 
       
  1155   inline NotMap<M> notMap(const M &m) {
       
  1156     return NotMap<M>(m);
       
  1157   }
       
  1158   
       
  1159   template <typename M> 
       
  1160   inline NotWriteMap<M> notMap(M &m) {
       
  1161     return NotWriteMap<M>(m);
       
  1162   }
       
  1163 
       
  1164   namespace _maps_bits {
       
  1165 
       
  1166     template <typename Value>
       
  1167     struct Identity {
       
  1168       typedef Value argument_type;
       
  1169       typedef Value result_type;
       
  1170       Value operator()(const Value& val) const {
       
  1171 	return val;
       
  1172       }
       
  1173     };
       
  1174 
       
  1175     template <typename _Iterator, typename Enable = void>
       
  1176     struct IteratorTraits {
       
  1177       typedef typename std::iterator_traits<_Iterator>::value_type Value;
       
  1178     };
       
  1179 
       
  1180     template <typename _Iterator>
       
  1181     struct IteratorTraits<_Iterator,
       
  1182       typename exists<typename _Iterator::container_type>::type> 
       
  1183     {
       
  1184       typedef typename _Iterator::container_type::value_type Value;
       
  1185     };
       
  1186 
       
  1187   }
       
  1188   
       
  1189 
       
  1190   /// \brief Writable bool map for store each true assigned elements.
       
  1191   ///
       
  1192   /// Writable bool map to store each true assigned elements. It will
       
  1193   /// copies all the keys set to true to the given iterator.
       
  1194   ///
       
  1195   /// \note The container of the iterator should contain space 
       
  1196   /// for each element.
       
  1197   ///
       
  1198   /// The next example shows how can you write the nodes directly
       
  1199   /// to the standard output.
       
  1200   ///\code
       
  1201   /// typedef IdMap<Graph, Edge> EdgeIdMap;
       
  1202   /// EdgeIdMap edgeId(graph);
       
  1203   ///
       
  1204   /// typedef MapFunctor<EdgeIdMap> EdgeIdFunctor;
       
  1205   /// EdgeIdFunctor edgeIdFunctor(edgeId);
       
  1206   ///
       
  1207   /// StoreBoolMap<ostream_iterator<int>, EdgeIdFunctor> 
       
  1208   ///   writerMap(ostream_iterator<int>(cout, " "), edgeIdFunctor);
       
  1209   ///
       
  1210   /// prim(graph, cost, writerMap);
       
  1211   ///\endcode
       
  1212   template <typename _Iterator, 
       
  1213             typename _Functor =
       
  1214             _maps_bits::Identity<typename _maps_bits::
       
  1215                                  IteratorTraits<_Iterator>::Value> >
       
  1216   class StoreBoolMap {
       
  1217   public:
       
  1218     typedef _Iterator Iterator;
       
  1219 
       
  1220     typedef typename _Functor::argument_type Key;
       
  1221     typedef bool Value;
       
  1222 
       
  1223     typedef _Functor Functor;
       
  1224 
       
  1225     /// Constructor
       
  1226     StoreBoolMap(Iterator it, const Functor& functor = Functor()) 
       
  1227       : _begin(it), _end(it), _functor(functor) {}
       
  1228 
       
  1229     /// Gives back the given iterator set for the first time.
       
  1230     Iterator begin() const {
       
  1231       return _begin;
       
  1232     }
       
  1233  
       
  1234     /// Gives back the iterator after the last set operation.
       
  1235     Iterator end() const {
       
  1236       return _end;
       
  1237     }
       
  1238 
       
  1239     /// Setter function of the map
       
  1240     void set(const Key& key, Value value) const {
       
  1241       if (value) {
       
  1242 	*_end++ = _functor(key);
       
  1243       }
       
  1244     }
       
  1245     
       
  1246   private:
       
  1247     Iterator _begin;
       
  1248     mutable Iterator _end;
       
  1249     Functor _functor;
       
  1250   };
       
  1251 
       
  1252   /// \brief Writable bool map for store each true assigned elements in 
       
  1253   /// a back insertable container.
       
  1254   ///
       
  1255   /// Writable bool map for store each true assigned elements in a back 
       
  1256   /// insertable container. It will push back all the keys set to true into
       
  1257   /// the container. It can be used to retrieve the items into a standard
       
  1258   /// container. The next example shows how can you store the undirected
       
  1259   /// arcs in a vector with prim algorithm.
       
  1260   ///
       
  1261   ///\code
       
  1262   /// vector<Edge> span_tree_edges;
       
  1263   /// BackInserterBoolMap<vector<Edge> > inserter_map(span_tree_edges);
       
  1264   /// prim(graph, cost, inserter_map);
       
  1265   ///\endcode
       
  1266   template <typename Container,
       
  1267             typename Functor =
       
  1268             _maps_bits::Identity<typename Container::value_type> >
       
  1269   class BackInserterBoolMap {
       
  1270   public:
       
  1271     typedef typename Container::value_type Key;
       
  1272     typedef bool Value;
       
  1273 
       
  1274     /// Constructor
       
  1275     BackInserterBoolMap(Container& _container, 
       
  1276                         const Functor& _functor = Functor()) 
       
  1277       : container(_container), functor(_functor) {}
       
  1278 
       
  1279     /// Setter function of the map
       
  1280     void set(const Key& key, Value value) {
       
  1281       if (value) {
       
  1282 	container.push_back(functor(key));
       
  1283       }
       
  1284     }
       
  1285     
       
  1286   private:
       
  1287     Container& container;
       
  1288     Functor functor;
       
  1289   };
       
  1290 
       
  1291   /// \brief Writable bool map for store each true assigned elements in 
       
  1292   /// a front insertable container.
       
  1293   ///
       
  1294   /// Writable bool map for store each true assigned elements in a front 
       
  1295   /// insertable container. It will push front all the keys set to \c true into
       
  1296   /// the container. For example see the BackInserterBoolMap.
       
  1297   template <typename Container,
       
  1298             typename Functor =
       
  1299             _maps_bits::Identity<typename Container::value_type> >
       
  1300   class FrontInserterBoolMap {
       
  1301   public:
       
  1302     typedef typename Container::value_type Key;
       
  1303     typedef bool Value;
       
  1304 
       
  1305     /// Constructor
       
  1306     FrontInserterBoolMap(Container& _container,
       
  1307                          const Functor& _functor = Functor()) 
       
  1308       : container(_container), functor(_functor) {}
       
  1309 
       
  1310     /// Setter function of the map
       
  1311     void set(const Key& key, Value value) {
       
  1312       if (value) {
       
  1313 	container.push_front(key);
       
  1314       }
       
  1315     }
       
  1316     
       
  1317   private:
       
  1318     Container& container;    
       
  1319     Functor functor;
       
  1320   };
       
  1321 
       
  1322   /// \brief Writable bool map for store each true assigned elements in 
       
  1323   /// an insertable container.
       
  1324   ///
       
  1325   /// Writable bool map for store each true assigned elements in an 
       
  1326   /// insertable container. It will insert all the keys set to \c true into
       
  1327   /// the container. If you want to store the cut arcs of the strongly
       
  1328   /// connected components in a set you can use the next code:
       
  1329   ///
       
  1330   ///\code
       
  1331   /// set<Arc> cut_arcs;
       
  1332   /// InserterBoolMap<set<Arc> > inserter_map(cut_arcs);
       
  1333   /// stronglyConnectedCutArcs(digraph, cost, inserter_map);
       
  1334   ///\endcode
       
  1335   template <typename Container,
       
  1336             typename Functor =
       
  1337             _maps_bits::Identity<typename Container::value_type> >
       
  1338   class InserterBoolMap {
       
  1339   public:
       
  1340     typedef typename Container::value_type Key;
       
  1341     typedef bool Value;
       
  1342 
       
  1343     /// Constructor
       
  1344     InserterBoolMap(Container& _container, typename Container::iterator _it,
       
  1345                     const Functor& _functor = Functor()) 
       
  1346       : container(_container), it(_it), functor(_functor) {}
       
  1347 
       
  1348     /// Constructor
       
  1349     InserterBoolMap(Container& _container, const Functor& _functor = Functor())
       
  1350       : container(_container), it(_container.end()), functor(_functor) {}
       
  1351 
       
  1352     /// Setter function of the map
       
  1353     void set(const Key& key, Value value) {
       
  1354       if (value) {
       
  1355 	it = container.insert(it, key);
       
  1356         ++it;
       
  1357       }
       
  1358     }
       
  1359     
       
  1360   private:
       
  1361     Container& container;
       
  1362     typename Container::iterator it;
       
  1363     Functor functor;
       
  1364   };
       
  1365 
       
  1366   /// \brief Fill the true set elements with a given value.
       
  1367   ///
       
  1368   /// Writable bool map to fill the elements set to \c true with a given value.
       
  1369   /// The value can set 
       
  1370   /// the container.
       
  1371   ///
       
  1372   /// The next code finds the connected components of the undirected digraph
       
  1373   /// and stores it in the \c comp map:
       
  1374   ///\code
       
  1375   /// typedef Graph::NodeMap<int> ComponentMap;
       
  1376   /// ComponentMap comp(graph);
       
  1377   /// typedef FillBoolMap<Graph::NodeMap<int> > ComponentFillerMap;
       
  1378   /// ComponentFillerMap filler(comp, 0);
       
  1379   ///
       
  1380   /// Dfs<Graph>::DefProcessedMap<ComponentFillerMap>::Create dfs(graph);
       
  1381   /// dfs.processedMap(filler);
       
  1382   /// dfs.init();
       
  1383   /// for (NodeIt it(graph); it != INVALID; ++it) {
       
  1384   ///   if (!dfs.reached(it)) {
       
  1385   ///     dfs.addSource(it);
       
  1386   ///     dfs.start();
       
  1387   ///     ++filler.fillValue();
       
  1388   ///   }
       
  1389   /// }
       
  1390   ///\endcode
       
  1391   template <typename Map>
       
  1392   class FillBoolMap {
       
  1393   public:
       
  1394     typedef typename Map::Key Key;
       
  1395     typedef bool Value;
       
  1396 
       
  1397     /// Constructor
       
  1398     FillBoolMap(Map& _map, const typename Map::Value& _fill) 
       
  1399       : map(_map), fill(_fill) {}
       
  1400 
       
  1401     /// Constructor
       
  1402     FillBoolMap(Map& _map) 
       
  1403       : map(_map), fill() {}
       
  1404 
       
  1405     /// Gives back the current fill value
       
  1406     const typename Map::Value& fillValue() const {
       
  1407       return fill;
       
  1408     } 
       
  1409 
       
  1410     /// Gives back the current fill value
       
  1411     typename Map::Value& fillValue() {
       
  1412       return fill;
       
  1413     } 
       
  1414 
       
  1415     /// Sets the current fill value
       
  1416     void fillValue(const typename Map::Value& _fill) {
       
  1417       fill = _fill;
       
  1418     } 
       
  1419 
       
  1420     /// Setter function of the map
       
  1421     void set(const Key& key, Value value) {
       
  1422       if (value) {
       
  1423 	map.set(key, fill);
       
  1424       }
       
  1425     }
       
  1426     
       
  1427   private:
       
  1428     Map& map;
       
  1429     typename Map::Value fill;
       
  1430   };
       
  1431 
       
  1432 
       
  1433   /// \brief Writable bool map which stores for each true assigned elements  
       
  1434   /// the setting order number.
       
  1435   ///
       
  1436   /// Writable bool map which stores for each true assigned elements  
       
  1437   /// the setting order number. It make easy to calculate the leaving
       
  1438   /// order of the nodes in the \c Dfs algorithm.
       
  1439   ///
       
  1440   ///\code
       
  1441   /// typedef Digraph::NodeMap<int> OrderMap;
       
  1442   /// OrderMap order(digraph);
       
  1443   /// typedef SettingOrderBoolMap<OrderMap> OrderSetterMap;
       
  1444   /// OrderSetterMap setter(order);
       
  1445   /// Dfs<Digraph>::DefProcessedMap<OrderSetterMap>::Create dfs(digraph);
       
  1446   /// dfs.processedMap(setter);
       
  1447   /// dfs.init();
       
  1448   /// for (NodeIt it(digraph); it != INVALID; ++it) {
       
  1449   ///   if (!dfs.reached(it)) {
       
  1450   ///     dfs.addSource(it);
       
  1451   ///     dfs.start();
       
  1452   ///   }
       
  1453   /// }
       
  1454   ///\endcode
       
  1455   ///
       
  1456   /// The discovering order can be stored a little harder because the
       
  1457   /// ReachedMap should be readable in the dfs algorithm but the setting
       
  1458   /// order map is not readable. Now we should use the fork map:
       
  1459   ///
       
  1460   ///\code
       
  1461   /// typedef Digraph::NodeMap<int> OrderMap;
       
  1462   /// OrderMap order(digraph);
       
  1463   /// typedef SettingOrderBoolMap<OrderMap> OrderSetterMap;
       
  1464   /// OrderSetterMap setter(order);
       
  1465   /// typedef Digraph::NodeMap<bool> StoreMap;
       
  1466   /// StoreMap store(digraph);
       
  1467   ///
       
  1468   /// typedef ForkWriteMap<StoreMap, OrderSetterMap> ReachedMap;
       
  1469   /// ReachedMap reached(store, setter);
       
  1470   ///
       
  1471   /// Dfs<Digraph>::DefReachedMap<ReachedMap>::Create dfs(digraph);
       
  1472   /// dfs.reachedMap(reached);
       
  1473   /// dfs.init();
       
  1474   /// for (NodeIt it(digraph); it != INVALID; ++it) {
       
  1475   ///   if (!dfs.reached(it)) {
       
  1476   ///     dfs.addSource(it);
       
  1477   ///     dfs.start();
       
  1478   ///   }
       
  1479   /// }
       
  1480   ///\endcode
       
  1481   template <typename Map>
       
  1482   class SettingOrderBoolMap {
       
  1483   public:
       
  1484     typedef typename Map::Key Key;
       
  1485     typedef bool Value;
       
  1486 
       
  1487     /// Constructor
       
  1488     SettingOrderBoolMap(Map& _map) 
       
  1489       : map(_map), counter(0) {}
       
  1490 
       
  1491     /// Number of set operations.
       
  1492     int num() const {
       
  1493       return counter;
       
  1494     }
       
  1495 
       
  1496     /// Setter function of the map
       
  1497     void set(const Key& key, Value value) {
       
  1498       if (value) {
       
  1499 	map.set(key, counter++);
       
  1500       }
       
  1501     }
       
  1502     
       
  1503   private:
       
  1504     Map& map;
       
  1505     int counter;
       
  1506   };
       
  1507 
       
  1508   /// @}
       
  1509 }
       
  1510 
       
  1511 #endif // LEMON_MAPS_H