lemon/maps.h
author Akos Ladanyi <ladanyi@tmit.bme.hu>
Tue, 22 Apr 2008 18:12:58 +0200
changeset 153 976a014b3797
parent 104 cdbba181b786
child 159 c7d30f7810e5
permissions -rw-r--r--
Convert the EPS files to PNG when generating the documentation
     1 /* -*- C++ -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library
     4  *
     5  * Copyright (C) 2003-2008
     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. It provides the necessary type definitions
    43   /// required by the map %concepts.
    44   template<typename K, typename V>
    45   class MapBase {
    46   public:
    47     /// \biref The key type of the map.
    48     typedef K Key;
    49     /// \brief The value type of the map.
    50     /// (The type of objects associated with the keys).
    51     typedef V Value;
    52   };
    53 
    54 
    55   /// Null map. (a.k.a. DoNothingMap)
    56 
    57   /// This map can be used if you have to provide a map only for
    58   /// its type definitions, or if you have to provide a writable map,
    59   /// but data written to it is not required (i.e. it will be sent to
    60   /// <tt>/dev/null</tt>).
    61   /// It conforms the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
    62   ///
    63   /// \sa ConstMap
    64   template<typename K, typename V>
    65   class NullMap : public MapBase<K, V> {
    66   public:
    67     typedef MapBase<K, V> Parent;
    68     typedef typename Parent::Key Key;
    69     typedef typename Parent::Value Value;
    70 
    71     /// Gives back a default constructed element.
    72     Value operator[](const Key&) const { return Value(); }
    73     /// Absorbs the value.
    74     void set(const Key&, const Value&) {}
    75   };
    76 
    77   /// Returns a \ref NullMap class
    78 
    79   /// This function just returns a \ref NullMap class.
    80   /// \relates NullMap
    81   template <typename K, typename V>
    82   NullMap<K, V> nullMap() {
    83     return NullMap<K, V>();
    84   }
    85 
    86 
    87   /// Constant map.
    88 
    89   /// This \ref concepts::ReadMap "readable map" assigns a specified
    90   /// value to each key.
    91   ///
    92   /// In other aspects it is equivalent to \ref NullMap.
    93   /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
    94   /// concept, but it absorbs the data written to it.
    95   ///
    96   /// The simplest way of using this map is through the constMap()
    97   /// function.
    98   ///
    99   /// \sa NullMap
   100   /// \sa IdentityMap
   101   template<typename K, typename V>
   102   class ConstMap : public MapBase<K, V> {
   103   private:
   104     V _value;
   105   public:
   106     typedef MapBase<K, V> Parent;
   107     typedef typename Parent::Key Key;
   108     typedef typename Parent::Value Value;
   109 
   110     /// Default constructor
   111 
   112     /// Default constructor.
   113     /// The value of the map will be default constructed.
   114     ConstMap() {}
   115 
   116     /// Constructor with specified initial value
   117 
   118     /// Constructor with specified initial value.
   119     /// \param v The initial value of the map.
   120     ConstMap(const Value &v) : _value(v) {}
   121 
   122     /// Gives back the specified value.
   123     Value operator[](const Key&) const { return _value; }
   124 
   125     /// Absorbs the value.
   126     void set(const Key&, const Value&) {}
   127 
   128     /// Sets the value that is assigned to each key.
   129     void setAll(const Value &v) {
   130       _value = v;
   131     }
   132 
   133     template<typename V1>
   134     ConstMap(const ConstMap<K, V1> &, const Value &v) : _value(v) {}
   135   };
   136 
   137   /// Returns a \ref ConstMap class
   138 
   139   /// This function just returns a \ref ConstMap class.
   140   /// \relates ConstMap
   141   template<typename K, typename V>
   142   inline ConstMap<K, V> constMap(const V &v) {
   143     return ConstMap<K, V>(v);
   144   }
   145 
   146   template<typename K, typename V>
   147   inline ConstMap<K, V> constMap() {
   148     return ConstMap<K, V>();
   149   }
   150 
   151 
   152   template<typename T, T v>
   153   struct Const {};
   154 
   155   /// Constant map with inlined constant value.
   156 
   157   /// This \ref concepts::ReadMap "readable map" assigns a specified
   158   /// value to each key.
   159   ///
   160   /// In other aspects it is equivalent to \ref NullMap.
   161   /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
   162   /// concept, but it absorbs the data written to it.
   163   ///
   164   /// The simplest way of using this map is through the constMap()
   165   /// function.
   166   ///
   167   /// \sa NullMap
   168   /// \sa IdentityMap
   169   template<typename K, typename V, V v>
   170   class ConstMap<K, Const<V, v> > : public MapBase<K, V> {
   171   public:
   172     typedef MapBase<K, V> Parent;
   173     typedef typename Parent::Key Key;
   174     typedef typename Parent::Value Value;
   175 
   176     /// Constructor.
   177     ConstMap() {}
   178 
   179     /// Gives back the specified value.
   180     Value operator[](const Key&) const { return v; }
   181 
   182     /// Absorbs the value.
   183     void set(const Key&, const Value&) {}
   184   };
   185 
   186   /// Returns a \ref ConstMap class with inlined constant value
   187 
   188   /// This function just returns a \ref ConstMap class with inlined
   189   /// constant value.
   190   /// \relates ConstMap
   191   template<typename K, typename V, V v>
   192   inline ConstMap<K, Const<V, v> > constMap() {
   193     return ConstMap<K, Const<V, v> >();
   194   }
   195 
   196 
   197   /// Identity map.
   198 
   199   /// This \ref concepts::ReadMap "read-only map" gives back the given
   200   /// key as value without any modification.
   201   ///
   202   /// \sa ConstMap
   203   template <typename T>
   204   class IdentityMap : public MapBase<T, T> {
   205   public:
   206     typedef MapBase<T, T> Parent;
   207     typedef typename Parent::Key Key;
   208     typedef typename Parent::Value Value;
   209 
   210     /// Gives back the given value without any modification.
   211     Value operator[](const Key &k) const {
   212       return k;
   213     }
   214   };
   215 
   216   /// Returns an \ref IdentityMap class
   217 
   218   /// This function just returns an \ref IdentityMap class.
   219   /// \relates IdentityMap
   220   template<typename T>
   221   inline IdentityMap<T> identityMap() {
   222     return IdentityMap<T>();
   223   }
   224 
   225 
   226   /// \brief Map for storing values for integer keys from the range
   227   /// <tt>[0..size-1]</tt>.
   228   ///
   229   /// This map is essentially a wrapper for \c std::vector. It assigns
   230   /// values to integer keys from the range <tt>[0..size-1]</tt>.
   231   /// It can be used with some data structures, for example
   232   /// \ref UnionFind, \ref BinHeap, when the used items are small
   233   /// integers. This map conforms the \ref concepts::ReferenceMap
   234   /// "ReferenceMap" concept.
   235   ///
   236   /// The simplest way of using this map is through the rangeMap()
   237   /// function.
   238   template <typename V>
   239   class RangeMap : public MapBase<int, V> {
   240     template <typename V1>
   241     friend class RangeMap;
   242   private:
   243 
   244     typedef std::vector<V> Vector;
   245     Vector _vector;
   246 
   247   public:
   248 
   249     typedef MapBase<int, V> Parent;
   250     /// Key type
   251     typedef typename Parent::Key Key;
   252     /// Value type
   253     typedef typename Parent::Value Value;
   254     /// Reference type
   255     typedef typename Vector::reference Reference;
   256     /// Const reference type
   257     typedef typename Vector::const_reference ConstReference;
   258 
   259     typedef True ReferenceMapTag;
   260 
   261   public:
   262 
   263     /// Constructor with specified default value.
   264     RangeMap(int size = 0, const Value &value = Value())
   265       : _vector(size, value) {}
   266 
   267     /// Constructs the map from an appropriate \c std::vector.
   268     template <typename V1>
   269     RangeMap(const std::vector<V1>& vector)
   270       : _vector(vector.begin(), vector.end()) {}
   271 
   272     /// Constructs the map from another \ref RangeMap.
   273     template <typename V1>
   274     RangeMap(const RangeMap<V1> &c)
   275       : _vector(c._vector.begin(), c._vector.end()) {}
   276 
   277     /// Returns the size of the map.
   278     int size() {
   279       return _vector.size();
   280     }
   281 
   282     /// Resizes the map.
   283 
   284     /// Resizes the underlying \c std::vector container, so changes the
   285     /// keyset of the map.
   286     /// \param size The new size of the map. The new keyset will be the
   287     /// range <tt>[0..size-1]</tt>.
   288     /// \param value The default value to assign to the new keys.
   289     void resize(int size, const Value &value = Value()) {
   290       _vector.resize(size, value);
   291     }
   292 
   293   private:
   294 
   295     RangeMap& operator=(const RangeMap&);
   296 
   297   public:
   298 
   299     ///\e
   300     Reference operator[](const Key &k) {
   301       return _vector[k];
   302     }
   303 
   304     ///\e
   305     ConstReference operator[](const Key &k) const {
   306       return _vector[k];
   307     }
   308 
   309     ///\e
   310     void set(const Key &k, const Value &v) {
   311       _vector[k] = v;
   312     }
   313   };
   314 
   315   /// Returns a \ref RangeMap class
   316 
   317   /// This function just returns a \ref RangeMap class.
   318   /// \relates RangeMap
   319   template<typename V>
   320   inline RangeMap<V> rangeMap(int size = 0, const V &value = V()) {
   321     return RangeMap<V>(size, value);
   322   }
   323 
   324   /// \brief Returns a \ref RangeMap class created from an appropriate
   325   /// \c std::vector
   326 
   327   /// This function just returns a \ref RangeMap class created from an
   328   /// appropriate \c std::vector.
   329   /// \relates RangeMap
   330   template<typename V>
   331   inline RangeMap<V> rangeMap(const std::vector<V> &vector) {
   332     return RangeMap<V>(vector);
   333   }
   334 
   335 
   336   /// Map type based on \c std::map
   337 
   338   /// This map is essentially a wrapper for \c std::map with addition
   339   /// that you can specify a default value for the keys that are not
   340   /// stored actually. This value can be different from the default
   341   /// contructed value (i.e. \c %Value()).
   342   /// This type conforms the \ref concepts::ReferenceMap "ReferenceMap"
   343   /// concept.
   344   ///
   345   /// This map is useful if a default value should be assigned to most of
   346   /// the keys and different values should be assigned only to a few
   347   /// keys (i.e. the map is "sparse").
   348   /// The name of this type also refers to this important usage.
   349   ///
   350   /// Apart form that this map can be used in many other cases since it
   351   /// is based on \c std::map, which is a general associative container.
   352   /// However keep in mind that it is usually not as efficient as other
   353   /// maps.
   354   ///
   355   /// The simplest way of using this map is through the sparseMap()
   356   /// function.
   357   template <typename K, typename V, typename Compare = std::less<K> >
   358   class SparseMap : public MapBase<K, V> {
   359     template <typename K1, typename V1, typename C1>
   360     friend class SparseMap;
   361   public:
   362 
   363     typedef MapBase<K, V> Parent;
   364     /// Key type
   365     typedef typename Parent::Key Key;
   366     /// Value type
   367     typedef typename Parent::Value Value;
   368     /// Reference type
   369     typedef Value& Reference;
   370     /// Const reference type
   371     typedef const Value& ConstReference;
   372 
   373     typedef True ReferenceMapTag;
   374 
   375   private:
   376 
   377     typedef std::map<K, V, Compare> Map;
   378     Map _map;
   379     Value _value;
   380 
   381   public:
   382 
   383     /// \brief Constructor with specified default value.
   384     SparseMap(const Value &value = Value()) : _value(value) {}
   385     /// \brief Constructs the map from an appropriate \c std::map, and
   386     /// explicitly specifies a default value.
   387     template <typename V1, typename Comp1>
   388     SparseMap(const std::map<Key, V1, Comp1> &map,
   389               const Value &value = Value())
   390       : _map(map.begin(), map.end()), _value(value) {}
   391 
   392     /// \brief Constructs the map from another \ref SparseMap.
   393     template<typename V1, typename Comp1>
   394     SparseMap(const SparseMap<Key, V1, Comp1> &c)
   395       : _map(c._map.begin(), c._map.end()), _value(c._value) {}
   396 
   397   private:
   398 
   399     SparseMap& operator=(const SparseMap&);
   400 
   401   public:
   402 
   403     ///\e
   404     Reference operator[](const Key &k) {
   405       typename Map::iterator it = _map.lower_bound(k);
   406       if (it != _map.end() && !_map.key_comp()(k, it->first))
   407 	return it->second;
   408       else
   409 	return _map.insert(it, std::make_pair(k, _value))->second;
   410     }
   411 
   412     ///\e
   413     ConstReference operator[](const Key &k) const {
   414       typename Map::const_iterator it = _map.find(k);
   415       if (it != _map.end())
   416 	return it->second;
   417       else
   418 	return _value;
   419     }
   420 
   421     ///\e
   422     void set(const Key &k, const Value &v) {
   423       typename Map::iterator it = _map.lower_bound(k);
   424       if (it != _map.end() && !_map.key_comp()(k, it->first))
   425 	it->second = v;
   426       else
   427 	_map.insert(it, std::make_pair(k, v));
   428     }
   429 
   430     ///\e
   431     void setAll(const Value &v) {
   432       _value = v;
   433       _map.clear();
   434     }
   435   };
   436 
   437   /// Returns a \ref SparseMap class
   438 
   439   /// This function just returns a \ref SparseMap class with specified
   440   /// default value.
   441   /// \relates SparseMap
   442   template<typename K, typename V, typename Compare>
   443   inline SparseMap<K, V, Compare> sparseMap(const V& value = V()) {
   444     return SparseMap<K, V, Compare>(value);
   445   }
   446 
   447   template<typename K, typename V>
   448   inline SparseMap<K, V, std::less<K> > sparseMap(const V& value = V()) {
   449     return SparseMap<K, V, std::less<K> >(value);
   450   }
   451 
   452   /// \brief Returns a \ref SparseMap class created from an appropriate
   453   /// \c std::map
   454 
   455   /// This function just returns a \ref SparseMap class created from an
   456   /// appropriate \c std::map.
   457   /// \relates SparseMap
   458   template<typename K, typename V, typename Compare>
   459   inline SparseMap<K, V, Compare>
   460     sparseMap(const std::map<K, V, Compare> &map, const V& value = V())
   461   {
   462     return SparseMap<K, V, Compare>(map, value);
   463   }
   464 
   465   /// @}
   466 
   467   /// \addtogroup map_adaptors
   468   /// @{
   469 
   470   /// Composition of two maps
   471 
   472   /// This \ref concepts::ReadMap "read-only map" returns the
   473   /// composition of two given maps. That is to say, if \c m1 is of
   474   /// type \c M1 and \c m2 is of \c M2, then for
   475   /// \code
   476   ///   ComposeMap<M1, M2> cm(m1,m2);
   477   /// \endcode
   478   /// <tt>cm[x]</tt> will be equal to <tt>m1[m2[x]]</tt>.
   479   ///
   480   /// The \c Key type of the map is inherited from \c M2 and the
   481   /// \c Value type is from \c M1.
   482   /// \c M2::Value must be convertible to \c M1::Key.
   483   ///
   484   /// The simplest way of using this map is through the composeMap()
   485   /// function.
   486   ///
   487   /// \sa CombineMap
   488   ///
   489   /// \todo Check the requirements.
   490   template <typename M1, typename M2>
   491   class ComposeMap : public MapBase<typename M2::Key, typename M1::Value> {
   492     const M1 &_m1;
   493     const M2 &_m2;
   494   public:
   495     typedef MapBase<typename M2::Key, typename M1::Value> Parent;
   496     typedef typename Parent::Key Key;
   497     typedef typename Parent::Value Value;
   498 
   499     /// Constructor
   500     ComposeMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
   501 
   502     /// \e
   503     typename MapTraits<M1>::ConstReturnValue
   504     operator[](const Key &k) const { return _m1[_m2[k]]; }
   505   };
   506 
   507   /// Returns a \ref ComposeMap class
   508 
   509   /// This function just returns a \ref ComposeMap class.
   510   ///
   511   /// If \c m1 and \c m2 are maps and the \c Value type of \c m2 is
   512   /// convertible to the \c Key of \c m1, then <tt>composeMap(m1,m2)[x]</tt>
   513   /// will be equal to <tt>m1[m2[x]]</tt>.
   514   ///
   515   /// \relates ComposeMap
   516   template <typename M1, typename M2>
   517   inline ComposeMap<M1, M2> composeMap(const M1 &m1, const M2 &m2) {
   518     return ComposeMap<M1, M2>(m1, m2);
   519   }
   520 
   521 
   522   /// Combination of two maps using an STL (binary) functor.
   523 
   524   /// This \ref concepts::ReadMap "read-only map" takes two maps and a
   525   /// binary functor and returns the combination of the two given maps
   526   /// using the functor.
   527   /// That is to say, if \c m1 is of type \c M1 and \c m2 is of \c M2
   528   /// and \c f is of \c F, then for
   529   /// \code
   530   ///   CombineMap<M1,M2,F,V> cm(m1,m2,f);
   531   /// \endcode
   532   /// <tt>cm[x]</tt> will be equal to <tt>f(m1[x],m2[x])</tt>.
   533   ///
   534   /// The \c Key type of the map is inherited from \c M1 (\c M1::Key
   535   /// must be convertible to \c M2::Key) and the \c Value type is \c V.
   536   /// \c M2::Value and \c M1::Value must be convertible to the
   537   /// corresponding input parameter of \c F and the return type of \c F
   538   /// must be convertible to \c V.
   539   ///
   540   /// The simplest way of using this map is through the combineMap()
   541   /// function.
   542   ///
   543   /// \sa ComposeMap
   544   ///
   545   /// \todo Check the requirements.
   546   template<typename M1, typename M2, typename F,
   547 	   typename V = typename F::result_type>
   548   class CombineMap : public MapBase<typename M1::Key, V> {
   549     const M1 &_m1;
   550     const M2 &_m2;
   551     F _f;
   552   public:
   553     typedef MapBase<typename M1::Key, V> Parent;
   554     typedef typename Parent::Key Key;
   555     typedef typename Parent::Value Value;
   556 
   557     /// Constructor
   558     CombineMap(const M1 &m1, const M2 &m2, const F &f = F())
   559       : _m1(m1), _m2(m2), _f(f) {}
   560     /// \e
   561     Value operator[](const Key &k) const { return _f(_m1[k],_m2[k]); }
   562   };
   563 
   564   /// Returns a \ref CombineMap class
   565 
   566   /// This function just returns a \ref CombineMap class.
   567   ///
   568   /// For example, if \c m1 and \c m2 are both maps with \c double
   569   /// values, then
   570   /// \code
   571   ///   combineMap(m1,m2,std::plus<double>())
   572   /// \endcode
   573   /// is equivalent to
   574   /// \code
   575   ///   addMap(m1,m2)
   576   /// \endcode
   577   ///
   578   /// This function is specialized for adaptable binary function
   579   /// classes and C++ functions.
   580   ///
   581   /// \relates CombineMap
   582   template<typename M1, typename M2, typename F, typename V>
   583   inline CombineMap<M1, M2, F, V>
   584   combineMap(const M1 &m1, const M2 &m2, const F &f) {
   585     return CombineMap<M1, M2, F, V>(m1,m2,f);
   586   }
   587 
   588   template<typename M1, typename M2, typename F>
   589   inline CombineMap<M1, M2, F, typename F::result_type>
   590   combineMap(const M1 &m1, const M2 &m2, const F &f) {
   591     return combineMap<M1, M2, F, typename F::result_type>(m1,m2,f);
   592   }
   593 
   594   template<typename M1, typename M2, typename K1, typename K2, typename V>
   595   inline CombineMap<M1, M2, V (*)(K1, K2), V>
   596   combineMap(const M1 &m1, const M2 &m2, V (*f)(K1, K2)) {
   597     return combineMap<M1, M2, V (*)(K1, K2), V>(m1,m2,f);
   598   }
   599 
   600 
   601   /// Converts an STL style (unary) functor to a map
   602 
   603   /// This \ref concepts::ReadMap "read-only map" returns the value
   604   /// of a given functor. Actually, it just wraps the functor and
   605   /// provides the \c Key and \c Value typedefs.
   606   ///
   607   /// Template parameters \c K and \c V will become its \c Key and
   608   /// \c Value. In most cases they have to be given explicitly because
   609   /// a functor typically does not provide \c argument_type and
   610   /// \c result_type typedefs.
   611   /// Parameter \c F is the type of the used functor.
   612   ///
   613   /// The simplest way of using this map is through the functorToMap()
   614   /// function.
   615   ///
   616   /// \sa MapToFunctor
   617   template<typename F,
   618 	   typename K = typename F::argument_type,
   619 	   typename V = typename F::result_type>
   620   class FunctorToMap : public MapBase<K, V> {
   621     F _f;
   622   public:
   623     typedef MapBase<K, V> Parent;
   624     typedef typename Parent::Key Key;
   625     typedef typename Parent::Value Value;
   626 
   627     /// Constructor
   628     FunctorToMap(const F &f = F()) : _f(f) {}
   629     /// \e
   630     Value operator[](const Key &k) const { return _f(k); }
   631   };
   632 
   633   /// Returns a \ref FunctorToMap class
   634 
   635   /// This function just returns a \ref FunctorToMap class.
   636   ///
   637   /// This function is specialized for adaptable binary function
   638   /// classes and C++ functions.
   639   ///
   640   /// \relates FunctorToMap
   641   template<typename K, typename V, typename F>
   642   inline FunctorToMap<F, K, V> functorToMap(const F &f) {
   643     return FunctorToMap<F, K, V>(f);
   644   }
   645 
   646   template <typename F>
   647   inline FunctorToMap<F, typename F::argument_type, typename F::result_type>
   648     functorToMap(const F &f)
   649   {
   650     return FunctorToMap<F, typename F::argument_type,
   651       typename F::result_type>(f);
   652   }
   653 
   654   template <typename K, typename V>
   655   inline FunctorToMap<V (*)(K), K, V> functorToMap(V (*f)(K)) {
   656     return FunctorToMap<V (*)(K), K, V>(f);
   657   }
   658 
   659 
   660   /// Converts a map to an STL style (unary) functor
   661 
   662   /// This class converts a map to an STL style (unary) functor.
   663   /// That is it provides an <tt>operator()</tt> to read its values.
   664   ///
   665   /// For the sake of convenience it also works as a usual
   666   /// \ref concepts::ReadMap "readable map", i.e. <tt>operator[]</tt>
   667   /// and the \c Key and \c Value typedefs also exist.
   668   ///
   669   /// The simplest way of using this map is through the mapToFunctor()
   670   /// function.
   671   ///
   672   ///\sa FunctorToMap
   673   template <typename M>
   674   class MapToFunctor : public MapBase<typename M::Key, typename M::Value> {
   675     const M &_m;
   676   public:
   677     typedef MapBase<typename M::Key, typename M::Value> Parent;
   678     typedef typename Parent::Key Key;
   679     typedef typename Parent::Value Value;
   680 
   681     typedef typename Parent::Key argument_type;
   682     typedef typename Parent::Value result_type;
   683 
   684     /// Constructor
   685     MapToFunctor(const M &m) : _m(m) {}
   686     /// \e
   687     Value operator()(const Key &k) const { return _m[k]; }
   688     /// \e
   689     Value operator[](const Key &k) const { return _m[k]; }
   690   };
   691 
   692   /// Returns a \ref MapToFunctor class
   693 
   694   /// This function just returns a \ref MapToFunctor class.
   695   /// \relates MapToFunctor
   696   template<typename M>
   697   inline MapToFunctor<M> mapToFunctor(const M &m) {
   698     return MapToFunctor<M>(m);
   699   }
   700 
   701 
   702   /// \brief Map adaptor to convert the \c Value type of a map to
   703   /// another type using the default conversion.
   704 
   705   /// Map adaptor to convert the \c Value type of a \ref concepts::ReadMap
   706   /// "readable map" to another type using the default conversion.
   707   /// The \c Key type of it is inherited from \c M and the \c Value
   708   /// type is \c V.
   709   /// This type conforms the \ref concepts::ReadMap "ReadMap" concept.
   710   ///
   711   /// The simplest way of using this map is through the convertMap()
   712   /// function.
   713   template <typename M, typename V>
   714   class ConvertMap : public MapBase<typename M::Key, V> {
   715     const M &_m;
   716   public:
   717     typedef MapBase<typename M::Key, V> Parent;
   718     typedef typename Parent::Key Key;
   719     typedef typename Parent::Value Value;
   720 
   721     /// Constructor
   722 
   723     /// Constructor.
   724     /// \param m The underlying map.
   725     ConvertMap(const M &m) : _m(m) {}
   726 
   727     /// \e
   728     Value operator[](const Key &k) const { return _m[k]; }
   729   };
   730 
   731   /// Returns a \ref ConvertMap class
   732 
   733   /// This function just returns a \ref ConvertMap class.
   734   /// \relates ConvertMap
   735   template<typename V, typename M>
   736   inline ConvertMap<M, V> convertMap(const M &map) {
   737     return ConvertMap<M, V>(map);
   738   }
   739 
   740 
   741   /// Applies all map setting operations to two maps
   742 
   743   /// This map has two \ref concepts::WriteMap "writable map" parameters
   744   /// and each write request will be passed to both of them.
   745   /// If \c M1 is also \ref concepts::ReadMap "readable", then the read
   746   /// operations will return the corresponding values of \c M1.
   747   ///
   748   /// The \c Key and \c Value types are inherited from \c M1.
   749   /// The \c Key and \c Value of \c M2 must be convertible from those
   750   /// of \c M1.
   751   ///
   752   /// The simplest way of using this map is through the forkMap()
   753   /// function.
   754   template<typename  M1, typename M2>
   755   class ForkMap : public MapBase<typename M1::Key, typename M1::Value> {
   756     M1 &_m1;
   757     M2 &_m2;
   758   public:
   759     typedef MapBase<typename M1::Key, typename M1::Value> Parent;
   760     typedef typename Parent::Key Key;
   761     typedef typename Parent::Value Value;
   762 
   763     /// Constructor
   764     ForkMap(M1 &m1, M2 &m2) : _m1(m1), _m2(m2) {}
   765     /// Returns the value associated with the given key in the first map.
   766     Value operator[](const Key &k) const { return _m1[k]; }
   767     /// Sets the value associated with the given key in both maps.
   768     void set(const Key &k, const Value &v) { _m1.set(k,v); _m2.set(k,v); }
   769   };
   770 
   771   /// Returns a \ref ForkMap class
   772 
   773   /// This function just returns a \ref ForkMap class.
   774   /// \relates ForkMap
   775   template <typename M1, typename M2>
   776   inline ForkMap<M1,M2> forkMap(M1 &m1, M2 &m2) {
   777     return ForkMap<M1,M2>(m1,m2);
   778   }
   779 
   780 
   781   /// Sum of two maps
   782 
   783   /// This \ref concepts::ReadMap "read-only map" returns the sum
   784   /// of the values of the two given maps.
   785   /// Its \c Key and \c Value types are inherited from \c M1.
   786   /// The \c Key and \c Value of \c M2 must be convertible to those of
   787   /// \c M1.
   788   ///
   789   /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
   790   /// \code
   791   ///   AddMap<M1,M2> am(m1,m2);
   792   /// \endcode
   793   /// <tt>am[x]</tt> will be equal to <tt>m1[x]+m2[x]</tt>.
   794   ///
   795   /// The simplest way of using this map is through the addMap()
   796   /// function.
   797   ///
   798   /// \sa SubMap, MulMap, DivMap
   799   /// \sa ShiftMap, ShiftWriteMap
   800   template<typename M1, typename M2>
   801   class AddMap : public MapBase<typename M1::Key, typename M1::Value> {
   802     const M1 &_m1;
   803     const M2 &_m2;
   804   public:
   805     typedef MapBase<typename M1::Key, typename M1::Value> Parent;
   806     typedef typename Parent::Key Key;
   807     typedef typename Parent::Value Value;
   808 
   809     /// Constructor
   810     AddMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
   811     /// \e
   812     Value operator[](const Key &k) const { return _m1[k]+_m2[k]; }
   813   };
   814 
   815   /// Returns an \ref AddMap class
   816 
   817   /// This function just returns an \ref AddMap class.
   818   ///
   819   /// For example, if \c m1 and \c m2 are both maps with \c double
   820   /// values, then <tt>addMap(m1,m2)[x]</tt> will be equal to
   821   /// <tt>m1[x]+m2[x]</tt>.
   822   ///
   823   /// \relates AddMap
   824   template<typename M1, typename M2>
   825   inline AddMap<M1, M2> addMap(const M1 &m1, const M2 &m2) {
   826     return AddMap<M1, M2>(m1,m2);
   827   }
   828 
   829 
   830   /// Difference of two maps
   831 
   832   /// This \ref concepts::ReadMap "read-only map" returns the difference
   833   /// of the values of the two given maps.
   834   /// Its \c Key and \c Value types are inherited from \c M1.
   835   /// The \c Key and \c Value of \c M2 must be convertible to those of
   836   /// \c M1.
   837   ///
   838   /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
   839   /// \code
   840   ///   SubMap<M1,M2> sm(m1,m2);
   841   /// \endcode
   842   /// <tt>sm[x]</tt> will be equal to <tt>m1[x]-m2[x]</tt>.
   843   ///
   844   /// The simplest way of using this map is through the subMap()
   845   /// function.
   846   ///
   847   /// \sa AddMap, MulMap, DivMap
   848   template<typename M1, typename M2>
   849   class SubMap : public MapBase<typename M1::Key, typename M1::Value> {
   850     const M1 &_m1;
   851     const M2 &_m2;
   852   public:
   853     typedef MapBase<typename M1::Key, typename M1::Value> Parent;
   854     typedef typename Parent::Key Key;
   855     typedef typename Parent::Value Value;
   856 
   857     /// Constructor
   858     SubMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
   859     /// \e
   860     Value operator[](const Key &k) const { return _m1[k]-_m2[k]; }
   861   };
   862 
   863   /// Returns a \ref SubMap class
   864 
   865   /// This function just returns a \ref SubMap class.
   866   ///
   867   /// For example, if \c m1 and \c m2 are both maps with \c double
   868   /// values, then <tt>subMap(m1,m2)[x]</tt> will be equal to
   869   /// <tt>m1[x]-m2[x]</tt>.
   870   ///
   871   /// \relates SubMap
   872   template<typename M1, typename M2>
   873   inline SubMap<M1, M2> subMap(const M1 &m1, const M2 &m2) {
   874     return SubMap<M1, M2>(m1,m2);
   875   }
   876 
   877 
   878   /// Product of two maps
   879 
   880   /// This \ref concepts::ReadMap "read-only map" returns the product
   881   /// of the values of the two given maps.
   882   /// Its \c Key and \c Value types are inherited from \c M1.
   883   /// The \c Key and \c Value of \c M2 must be convertible to those of
   884   /// \c M1.
   885   ///
   886   /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
   887   /// \code
   888   ///   MulMap<M1,M2> mm(m1,m2);
   889   /// \endcode
   890   /// <tt>mm[x]</tt> will be equal to <tt>m1[x]*m2[x]</tt>.
   891   ///
   892   /// The simplest way of using this map is through the mulMap()
   893   /// function.
   894   ///
   895   /// \sa AddMap, SubMap, DivMap
   896   /// \sa ScaleMap, ScaleWriteMap
   897   template<typename M1, typename M2>
   898   class MulMap : public MapBase<typename M1::Key, typename M1::Value> {
   899     const M1 &_m1;
   900     const M2 &_m2;
   901   public:
   902     typedef MapBase<typename M1::Key, typename M1::Value> Parent;
   903     typedef typename Parent::Key Key;
   904     typedef typename Parent::Value Value;
   905 
   906     /// Constructor
   907     MulMap(const M1 &m1,const M2 &m2) : _m1(m1), _m2(m2) {}
   908     /// \e
   909     Value operator[](const Key &k) const { return _m1[k]*_m2[k]; }
   910   };
   911 
   912   /// Returns a \ref MulMap class
   913 
   914   /// This function just returns a \ref MulMap class.
   915   ///
   916   /// For example, if \c m1 and \c m2 are both maps with \c double
   917   /// values, then <tt>mulMap(m1,m2)[x]</tt> will be equal to
   918   /// <tt>m1[x]*m2[x]</tt>.
   919   ///
   920   /// \relates MulMap
   921   template<typename M1, typename M2>
   922   inline MulMap<M1, M2> mulMap(const M1 &m1,const M2 &m2) {
   923     return MulMap<M1, M2>(m1,m2);
   924   }
   925 
   926 
   927   /// Quotient of two maps
   928 
   929   /// This \ref concepts::ReadMap "read-only map" returns the quotient
   930   /// of the values of the two given maps.
   931   /// Its \c Key and \c Value types are inherited from \c M1.
   932   /// The \c Key and \c Value of \c M2 must be convertible to those of
   933   /// \c M1.
   934   ///
   935   /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
   936   /// \code
   937   ///   DivMap<M1,M2> dm(m1,m2);
   938   /// \endcode
   939   /// <tt>dm[x]</tt> will be equal to <tt>m1[x]/m2[x]</tt>.
   940   ///
   941   /// The simplest way of using this map is through the divMap()
   942   /// function.
   943   ///
   944   /// \sa AddMap, SubMap, MulMap
   945   template<typename M1, typename M2>
   946   class DivMap : public MapBase<typename M1::Key, typename M1::Value> {
   947     const M1 &_m1;
   948     const M2 &_m2;
   949   public:
   950     typedef MapBase<typename M1::Key, typename M1::Value> Parent;
   951     typedef typename Parent::Key Key;
   952     typedef typename Parent::Value Value;
   953 
   954     /// Constructor
   955     DivMap(const M1 &m1,const M2 &m2) : _m1(m1), _m2(m2) {}
   956     /// \e
   957     Value operator[](const Key &k) const { return _m1[k]/_m2[k]; }
   958   };
   959 
   960   /// Returns a \ref DivMap class
   961 
   962   /// This function just returns a \ref DivMap class.
   963   ///
   964   /// For example, if \c m1 and \c m2 are both maps with \c double
   965   /// values, then <tt>divMap(m1,m2)[x]</tt> will be equal to
   966   /// <tt>m1[x]/m2[x]</tt>.
   967   ///
   968   /// \relates DivMap
   969   template<typename M1, typename M2>
   970   inline DivMap<M1, M2> divMap(const M1 &m1,const M2 &m2) {
   971     return DivMap<M1, M2>(m1,m2);
   972   }
   973 
   974 
   975   /// Shifts a map with a constant.
   976 
   977   /// This \ref concepts::ReadMap "read-only map" returns the sum of
   978   /// the given map and a constant value (i.e. it shifts the map with
   979   /// the constant). Its \c Key and \c Value are inherited from \c M.
   980   ///
   981   /// Actually,
   982   /// \code
   983   ///   ShiftMap<M> sh(m,v);
   984   /// \endcode
   985   /// is equivalent to
   986   /// \code
   987   ///   ConstMap<M::Key, M::Value> cm(v);
   988   ///   AddMap<M, ConstMap<M::Key, M::Value> > sh(m,cm);
   989   /// \endcode
   990   ///
   991   /// The simplest way of using this map is through the shiftMap()
   992   /// function.
   993   ///
   994   /// \sa ShiftWriteMap
   995   template<typename M, typename C = typename M::Value>
   996   class ShiftMap : public MapBase<typename M::Key, typename M::Value> {
   997     const M &_m;
   998     C _v;
   999   public:
  1000     typedef MapBase<typename M::Key, typename M::Value> Parent;
  1001     typedef typename Parent::Key Key;
  1002     typedef typename Parent::Value Value;
  1003 
  1004     /// Constructor
  1005 
  1006     /// Constructor.
  1007     /// \param m The undelying map.
  1008     /// \param v The constant value.
  1009     ShiftMap(const M &m, const C &v) : _m(m), _v(v) {}
  1010     /// \e
  1011     Value operator[](const Key &k) const { return _m[k]+_v; }
  1012   };
  1013 
  1014   /// Shifts a map with a constant (read-write version).
  1015 
  1016   /// This \ref concepts::ReadWriteMap "read-write map" returns the sum
  1017   /// of the given map and a constant value (i.e. it shifts the map with
  1018   /// the constant). Its \c Key and \c Value are inherited from \c M.
  1019   /// It makes also possible to write the map.
  1020   ///
  1021   /// The simplest way of using this map is through the shiftWriteMap()
  1022   /// function.
  1023   ///
  1024   /// \sa ShiftMap
  1025   template<typename M, typename C = typename M::Value>
  1026   class ShiftWriteMap : public MapBase<typename M::Key, typename M::Value> {
  1027     M &_m;
  1028     C _v;
  1029   public:
  1030     typedef MapBase<typename M::Key, typename M::Value> Parent;
  1031     typedef typename Parent::Key Key;
  1032     typedef typename Parent::Value Value;
  1033 
  1034     /// Constructor
  1035 
  1036     /// Constructor.
  1037     /// \param m The undelying map.
  1038     /// \param v The constant value.
  1039     ShiftWriteMap(M &m, const C &v) : _m(m), _v(v) {}
  1040     /// \e
  1041     Value operator[](const Key &k) const { return _m[k]+_v; }
  1042     /// \e
  1043     void set(const Key &k, const Value &v) { _m.set(k, v-_v); }
  1044   };
  1045 
  1046   /// Returns a \ref ShiftMap class
  1047 
  1048   /// This function just returns a \ref ShiftMap class.
  1049   ///
  1050   /// For example, if \c m is a map with \c double values and \c v is
  1051   /// \c double, then <tt>shiftMap(m,v)[x]</tt> will be equal to
  1052   /// <tt>m[x]+v</tt>.
  1053   ///
  1054   /// \relates ShiftMap
  1055   template<typename M, typename C>
  1056   inline ShiftMap<M, C> shiftMap(const M &m, const C &v) {
  1057     return ShiftMap<M, C>(m,v);
  1058   }
  1059 
  1060   /// Returns a \ref ShiftWriteMap class
  1061 
  1062   /// This function just returns a \ref ShiftWriteMap class.
  1063   ///
  1064   /// For example, if \c m is a map with \c double values and \c v is
  1065   /// \c double, then <tt>shiftWriteMap(m,v)[x]</tt> will be equal to
  1066   /// <tt>m[x]+v</tt>.
  1067   /// Moreover it makes also possible to write the map.
  1068   ///
  1069   /// \relates ShiftWriteMap
  1070   template<typename M, typename C>
  1071   inline ShiftWriteMap<M, C> shiftWriteMap(M &m, const C &v) {
  1072     return ShiftWriteMap<M, C>(m,v);
  1073   }
  1074 
  1075 
  1076   /// Scales a map with a constant.
  1077 
  1078   /// This \ref concepts::ReadMap "read-only map" returns the value of
  1079   /// the given map multiplied from the left side with a constant value.
  1080   /// Its \c Key and \c Value are inherited from \c M.
  1081   ///
  1082   /// Actually,
  1083   /// \code
  1084   ///   ScaleMap<M> sc(m,v);
  1085   /// \endcode
  1086   /// is equivalent to
  1087   /// \code
  1088   ///   ConstMap<M::Key, M::Value> cm(v);
  1089   ///   MulMap<ConstMap<M::Key, M::Value>, M> sc(cm,m);
  1090   /// \endcode
  1091   ///
  1092   /// The simplest way of using this map is through the scaleMap()
  1093   /// function.
  1094   ///
  1095   /// \sa ScaleWriteMap
  1096   template<typename M, typename C = typename M::Value>
  1097   class ScaleMap : public MapBase<typename M::Key, typename M::Value> {
  1098     const M &_m;
  1099     C _v;
  1100   public:
  1101     typedef MapBase<typename M::Key, typename M::Value> Parent;
  1102     typedef typename Parent::Key Key;
  1103     typedef typename Parent::Value Value;
  1104 
  1105     /// Constructor
  1106 
  1107     /// Constructor.
  1108     /// \param m The undelying map.
  1109     /// \param v The constant value.
  1110     ScaleMap(const M &m, const C &v) : _m(m), _v(v) {}
  1111     /// \e
  1112     Value operator[](const Key &k) const { return _v*_m[k]; }
  1113   };
  1114 
  1115   /// Scales a map with a constant (read-write version).
  1116 
  1117   /// This \ref concepts::ReadWriteMap "read-write map" returns the value of
  1118   /// the given map multiplied from the left side with a constant value.
  1119   /// Its \c Key and \c Value are inherited from \c M.
  1120   /// It can also be used as write map if the \c / operator is defined
  1121   /// between \c Value and \c C and the given multiplier is not zero.
  1122   ///
  1123   /// The simplest way of using this map is through the scaleWriteMap()
  1124   /// function.
  1125   ///
  1126   /// \sa ScaleMap
  1127   template<typename M, typename C = typename M::Value>
  1128   class ScaleWriteMap : public MapBase<typename M::Key, typename M::Value> {
  1129     M &_m;
  1130     C _v;
  1131   public:
  1132     typedef MapBase<typename M::Key, typename M::Value> Parent;
  1133     typedef typename Parent::Key Key;
  1134     typedef typename Parent::Value Value;
  1135 
  1136     /// Constructor
  1137 
  1138     /// Constructor.
  1139     /// \param m The undelying map.
  1140     /// \param v The constant value.
  1141     ScaleWriteMap(M &m, const C &v) : _m(m), _v(v) {}
  1142     /// \e
  1143     Value operator[](const Key &k) const { return _v*_m[k]; }
  1144     /// \e
  1145     void set(const Key &k, const Value &v) { _m.set(k, v/_v); }
  1146   };
  1147 
  1148   /// Returns a \ref ScaleMap class
  1149 
  1150   /// This function just returns a \ref ScaleMap class.
  1151   ///
  1152   /// For example, if \c m is a map with \c double values and \c v is
  1153   /// \c double, then <tt>scaleMap(m,v)[x]</tt> will be equal to
  1154   /// <tt>v*m[x]</tt>.
  1155   ///
  1156   /// \relates ScaleMap
  1157   template<typename M, typename C>
  1158   inline ScaleMap<M, C> scaleMap(const M &m, const C &v) {
  1159     return ScaleMap<M, C>(m,v);
  1160   }
  1161 
  1162   /// Returns a \ref ScaleWriteMap class
  1163 
  1164   /// This function just returns a \ref ScaleWriteMap class.
  1165   ///
  1166   /// For example, if \c m is a map with \c double values and \c v is
  1167   /// \c double, then <tt>scaleWriteMap(m,v)[x]</tt> will be equal to
  1168   /// <tt>v*m[x]</tt>.
  1169   /// Moreover it makes also possible to write the map.
  1170   ///
  1171   /// \relates ScaleWriteMap
  1172   template<typename M, typename C>
  1173   inline ScaleWriteMap<M, C> scaleWriteMap(M &m, const C &v) {
  1174     return ScaleWriteMap<M, C>(m,v);
  1175   }
  1176 
  1177 
  1178   /// Negative of a map
  1179 
  1180   /// This \ref concepts::ReadMap "read-only map" returns the negative
  1181   /// of the values of the given map (using the unary \c - operator).
  1182   /// Its \c Key and \c Value are inherited from \c M.
  1183   ///
  1184   /// If M::Value is \c int, \c double etc., then
  1185   /// \code
  1186   ///   NegMap<M> neg(m);
  1187   /// \endcode
  1188   /// is equivalent to
  1189   /// \code
  1190   ///   ScaleMap<M> neg(m,-1);
  1191   /// \endcode
  1192   ///
  1193   /// The simplest way of using this map is through the negMap()
  1194   /// function.
  1195   ///
  1196   /// \sa NegWriteMap
  1197   template<typename M>
  1198   class NegMap : public MapBase<typename M::Key, typename M::Value> {
  1199     const M& _m;
  1200   public:
  1201     typedef MapBase<typename M::Key, typename M::Value> Parent;
  1202     typedef typename Parent::Key Key;
  1203     typedef typename Parent::Value Value;
  1204 
  1205     /// Constructor
  1206     NegMap(const M &m) : _m(m) {}
  1207     /// \e
  1208     Value operator[](const Key &k) const { return -_m[k]; }
  1209   };
  1210 
  1211   /// Negative of a map (read-write version)
  1212 
  1213   /// This \ref concepts::ReadWriteMap "read-write map" returns the
  1214   /// negative of the values of the given map (using the unary \c -
  1215   /// operator).
  1216   /// Its \c Key and \c Value are inherited from \c M.
  1217   /// It makes also possible to write the map.
  1218   ///
  1219   /// If M::Value is \c int, \c double etc., then
  1220   /// \code
  1221   ///   NegWriteMap<M> neg(m);
  1222   /// \endcode
  1223   /// is equivalent to
  1224   /// \code
  1225   ///   ScaleWriteMap<M> neg(m,-1);
  1226   /// \endcode
  1227   ///
  1228   /// The simplest way of using this map is through the negWriteMap()
  1229   /// function.
  1230   ///
  1231   /// \sa NegMap
  1232   template<typename M>
  1233   class NegWriteMap : public MapBase<typename M::Key, typename M::Value> {
  1234     M &_m;
  1235   public:
  1236     typedef MapBase<typename M::Key, typename M::Value> Parent;
  1237     typedef typename Parent::Key Key;
  1238     typedef typename Parent::Value Value;
  1239 
  1240     /// Constructor
  1241     NegWriteMap(M &m) : _m(m) {}
  1242     /// \e
  1243     Value operator[](const Key &k) const { return -_m[k]; }
  1244     /// \e
  1245     void set(const Key &k, const Value &v) { _m.set(k, -v); }
  1246   };
  1247 
  1248   /// Returns a \ref NegMap class
  1249 
  1250   /// This function just returns a \ref NegMap class.
  1251   ///
  1252   /// For example, if \c m is a map with \c double values, then
  1253   /// <tt>negMap(m)[x]</tt> will be equal to <tt>-m[x]</tt>.
  1254   ///
  1255   /// \relates NegMap
  1256   template <typename M>
  1257   inline NegMap<M> negMap(const M &m) {
  1258     return NegMap<M>(m);
  1259   }
  1260 
  1261   /// Returns a \ref NegWriteMap class
  1262 
  1263   /// This function just returns a \ref NegWriteMap class.
  1264   ///
  1265   /// For example, if \c m is a map with \c double values, then
  1266   /// <tt>negWriteMap(m)[x]</tt> will be equal to <tt>-m[x]</tt>.
  1267   /// Moreover it makes also possible to write the map.
  1268   ///
  1269   /// \relates NegWriteMap
  1270   template <typename M>
  1271   inline NegWriteMap<M> negWriteMap(M &m) {
  1272     return NegWriteMap<M>(m);
  1273   }
  1274 
  1275 
  1276   /// Absolute value of a map
  1277 
  1278   /// This \ref concepts::ReadMap "read-only map" returns the absolute
  1279   /// value of the values of the given map.
  1280   /// Its \c Key and \c Value are inherited from \c M.
  1281   /// \c Value must be comparable to \c 0 and the unary \c -
  1282   /// operator must be defined for it, of course.
  1283   ///
  1284   /// The simplest way of using this map is through the absMap()
  1285   /// function.
  1286   template<typename M>
  1287   class AbsMap : public MapBase<typename M::Key, typename M::Value> {
  1288     const M &_m;
  1289   public:
  1290     typedef MapBase<typename M::Key, typename M::Value> Parent;
  1291     typedef typename Parent::Key Key;
  1292     typedef typename Parent::Value Value;
  1293 
  1294     /// Constructor
  1295     AbsMap(const M &m) : _m(m) {}
  1296     /// \e
  1297     Value operator[](const Key &k) const {
  1298       Value tmp = _m[k];
  1299       return tmp >= 0 ? tmp : -tmp;
  1300     }
  1301 
  1302   };
  1303 
  1304   /// Returns an \ref AbsMap class
  1305 
  1306   /// This function just returns an \ref AbsMap class.
  1307   ///
  1308   /// For example, if \c m is a map with \c double values, then
  1309   /// <tt>absMap(m)[x]</tt> will be equal to <tt>m[x]</tt> if
  1310   /// it is positive or zero and <tt>-m[x]</tt> if <tt>m[x]</tt> is
  1311   /// negative.
  1312   ///
  1313   /// \relates AbsMap
  1314   template<typename M>
  1315   inline AbsMap<M> absMap(const M &m) {
  1316     return AbsMap<M>(m);
  1317   }
  1318 
  1319   /// @}
  1320   
  1321   // Logical maps and map adaptors:
  1322 
  1323   /// \addtogroup maps
  1324   /// @{
  1325 
  1326   /// Constant \c true map.
  1327 
  1328   /// This \ref concepts::ReadMap "read-only map" assigns \c true to
  1329   /// each key.
  1330   ///
  1331   /// Note that
  1332   /// \code
  1333   ///   TrueMap<K> tm;
  1334   /// \endcode
  1335   /// is equivalent to
  1336   /// \code
  1337   ///   ConstMap<K,bool> tm(true);
  1338   /// \endcode
  1339   ///
  1340   /// \sa FalseMap
  1341   /// \sa ConstMap
  1342   template <typename K>
  1343   class TrueMap : public MapBase<K, bool> {
  1344   public:
  1345     typedef MapBase<K, bool> Parent;
  1346     typedef typename Parent::Key Key;
  1347     typedef typename Parent::Value Value;
  1348 
  1349     /// Gives back \c true.
  1350     Value operator[](const Key&) const { return true; }
  1351   };
  1352 
  1353   /// Returns a \ref TrueMap class
  1354 
  1355   /// This function just returns a \ref TrueMap class.
  1356   /// \relates TrueMap
  1357   template<typename K>
  1358   inline TrueMap<K> trueMap() {
  1359     return TrueMap<K>();
  1360   }
  1361 
  1362 
  1363   /// Constant \c false map.
  1364 
  1365   /// This \ref concepts::ReadMap "read-only map" assigns \c false to
  1366   /// each key.
  1367   ///
  1368   /// Note that
  1369   /// \code
  1370   ///   FalseMap<K> fm;
  1371   /// \endcode
  1372   /// is equivalent to
  1373   /// \code
  1374   ///   ConstMap<K,bool> fm(false);
  1375   /// \endcode
  1376   ///
  1377   /// \sa TrueMap
  1378   /// \sa ConstMap
  1379   template <typename K>
  1380   class FalseMap : public MapBase<K, bool> {
  1381   public:
  1382     typedef MapBase<K, bool> Parent;
  1383     typedef typename Parent::Key Key;
  1384     typedef typename Parent::Value Value;
  1385 
  1386     /// Gives back \c false.
  1387     Value operator[](const Key&) const { return false; }
  1388   };
  1389 
  1390   /// Returns a \ref FalseMap class
  1391 
  1392   /// This function just returns a \ref FalseMap class.
  1393   /// \relates FalseMap
  1394   template<typename K>
  1395   inline FalseMap<K> falseMap() {
  1396     return FalseMap<K>();
  1397   }
  1398 
  1399   /// @}
  1400 
  1401   /// \addtogroup map_adaptors
  1402   /// @{
  1403 
  1404   /// Logical 'and' of two maps
  1405 
  1406   /// This \ref concepts::ReadMap "read-only map" returns the logical
  1407   /// 'and' of the values of the two given maps.
  1408   /// Its \c Key type is inherited from \c M1 and its \c Value type is
  1409   /// \c bool. \c M2::Key must be convertible to \c M1::Key.
  1410   ///
  1411   /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
  1412   /// \code
  1413   ///   AndMap<M1,M2> am(m1,m2);
  1414   /// \endcode
  1415   /// <tt>am[x]</tt> will be equal to <tt>m1[x]&&m2[x]</tt>.
  1416   ///
  1417   /// The simplest way of using this map is through the andMap()
  1418   /// function.
  1419   ///
  1420   /// \sa OrMap
  1421   /// \sa NotMap, NotWriteMap
  1422   template<typename M1, typename M2>
  1423   class AndMap : public MapBase<typename M1::Key, bool> {
  1424     const M1 &_m1;
  1425     const M2 &_m2;
  1426   public:
  1427     typedef MapBase<typename M1::Key, bool> Parent;
  1428     typedef typename Parent::Key Key;
  1429     typedef typename Parent::Value Value;
  1430 
  1431     /// Constructor
  1432     AndMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
  1433     /// \e
  1434     Value operator[](const Key &k) const { return _m1[k]&&_m2[k]; }
  1435   };
  1436 
  1437   /// Returns an \ref AndMap class
  1438 
  1439   /// This function just returns an \ref AndMap class.
  1440   ///
  1441   /// For example, if \c m1 and \c m2 are both maps with \c bool values,
  1442   /// then <tt>andMap(m1,m2)[x]</tt> will be equal to
  1443   /// <tt>m1[x]&&m2[x]</tt>.
  1444   ///
  1445   /// \relates AndMap
  1446   template<typename M1, typename M2>
  1447   inline AndMap<M1, M2> andMap(const M1 &m1, const M2 &m2) {
  1448     return AndMap<M1, M2>(m1,m2);
  1449   }
  1450 
  1451 
  1452   /// Logical 'or' of two maps
  1453 
  1454   /// This \ref concepts::ReadMap "read-only map" returns the logical
  1455   /// 'or' of the values of the two given maps.
  1456   /// Its \c Key type is inherited from \c M1 and its \c Value type is
  1457   /// \c bool. \c M2::Key must be convertible to \c M1::Key.
  1458   ///
  1459   /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
  1460   /// \code
  1461   ///   OrMap<M1,M2> om(m1,m2);
  1462   /// \endcode
  1463   /// <tt>om[x]</tt> will be equal to <tt>m1[x]||m2[x]</tt>.
  1464   ///
  1465   /// The simplest way of using this map is through the orMap()
  1466   /// function.
  1467   ///
  1468   /// \sa AndMap
  1469   /// \sa NotMap, NotWriteMap
  1470   template<typename M1, typename M2>
  1471   class OrMap : public MapBase<typename M1::Key, bool> {
  1472     const M1 &_m1;
  1473     const M2 &_m2;
  1474   public:
  1475     typedef MapBase<typename M1::Key, bool> Parent;
  1476     typedef typename Parent::Key Key;
  1477     typedef typename Parent::Value Value;
  1478 
  1479     /// Constructor
  1480     OrMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
  1481     /// \e
  1482     Value operator[](const Key &k) const { return _m1[k]||_m2[k]; }
  1483   };
  1484 
  1485   /// Returns an \ref OrMap class
  1486 
  1487   /// This function just returns an \ref OrMap class.
  1488   ///
  1489   /// For example, if \c m1 and \c m2 are both maps with \c bool values,
  1490   /// then <tt>orMap(m1,m2)[x]</tt> will be equal to
  1491   /// <tt>m1[x]||m2[x]</tt>.
  1492   ///
  1493   /// \relates OrMap
  1494   template<typename M1, typename M2>
  1495   inline OrMap<M1, M2> orMap(const M1 &m1, const M2 &m2) {
  1496     return OrMap<M1, M2>(m1,m2);
  1497   }
  1498 
  1499 
  1500   /// Logical 'not' of a map
  1501 
  1502   /// This \ref concepts::ReadMap "read-only map" returns the logical
  1503   /// negation of the values of the given map.
  1504   /// Its \c Key is inherited from \c M and its \c Value is \c bool.
  1505   ///
  1506   /// The simplest way of using this map is through the notMap()
  1507   /// function.
  1508   ///
  1509   /// \sa NotWriteMap
  1510   template <typename M>
  1511   class NotMap : public MapBase<typename M::Key, bool> {
  1512     const M &_m;
  1513   public:
  1514     typedef MapBase<typename M::Key, bool> Parent;
  1515     typedef typename Parent::Key Key;
  1516     typedef typename Parent::Value Value;
  1517 
  1518     /// Constructor
  1519     NotMap(const M &m) : _m(m) {}
  1520     /// \e
  1521     Value operator[](const Key &k) const { return !_m[k]; }
  1522   };
  1523 
  1524   /// Logical 'not' of a map (read-write version)
  1525 
  1526   /// This \ref concepts::ReadWriteMap "read-write map" returns the
  1527   /// logical negation of the values of the given map.
  1528   /// Its \c Key is inherited from \c M and its \c Value is \c bool.
  1529   /// It makes also possible to write the map. When a value is set,
  1530   /// the opposite value is set to the original map.
  1531   ///
  1532   /// The simplest way of using this map is through the notWriteMap()
  1533   /// function.
  1534   ///
  1535   /// \sa NotMap
  1536   template <typename M>
  1537   class NotWriteMap : public MapBase<typename M::Key, bool> {
  1538     M &_m;
  1539   public:
  1540     typedef MapBase<typename M::Key, bool> Parent;
  1541     typedef typename Parent::Key Key;
  1542     typedef typename Parent::Value Value;
  1543 
  1544     /// Constructor
  1545     NotWriteMap(M &m) : _m(m) {}
  1546     /// \e
  1547     Value operator[](const Key &k) const { return !_m[k]; }
  1548     /// \e
  1549     void set(const Key &k, bool v) { _m.set(k, !v); }
  1550   };
  1551 
  1552   /// Returns a \ref NotMap class
  1553 
  1554   /// This function just returns a \ref NotMap class.
  1555   ///
  1556   /// For example, if \c m is a map with \c bool values, then
  1557   /// <tt>notMap(m)[x]</tt> will be equal to <tt>!m[x]</tt>.
  1558   ///
  1559   /// \relates NotMap
  1560   template <typename M>
  1561   inline NotMap<M> notMap(const M &m) {
  1562     return NotMap<M>(m);
  1563   }
  1564 
  1565   /// Returns a \ref NotWriteMap class
  1566 
  1567   /// This function just returns a \ref NotWriteMap class.
  1568   ///
  1569   /// For example, if \c m is a map with \c bool values, then
  1570   /// <tt>notWriteMap(m)[x]</tt> will be equal to <tt>!m[x]</tt>.
  1571   /// Moreover it makes also possible to write the map.
  1572   ///
  1573   /// \relates NotWriteMap
  1574   template <typename M>
  1575   inline NotWriteMap<M> notWriteMap(M &m) {
  1576     return NotWriteMap<M>(m);
  1577   }
  1578 
  1579 
  1580   /// Combination of two maps using the \c == operator
  1581 
  1582   /// This \ref concepts::ReadMap "read-only map" assigns \c true to
  1583   /// the keys for which the corresponding values of the two maps are
  1584   /// equal.
  1585   /// Its \c Key type is inherited from \c M1 and its \c Value type is
  1586   /// \c bool. \c M2::Key must be convertible to \c M1::Key.
  1587   ///
  1588   /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
  1589   /// \code
  1590   ///   EqualMap<M1,M2> em(m1,m2);
  1591   /// \endcode
  1592   /// <tt>em[x]</tt> will be equal to <tt>m1[x]==m2[x]</tt>.
  1593   ///
  1594   /// The simplest way of using this map is through the equalMap()
  1595   /// function.
  1596   ///
  1597   /// \sa LessMap
  1598   template<typename M1, typename M2>
  1599   class EqualMap : public MapBase<typename M1::Key, bool> {
  1600     const M1 &_m1;
  1601     const M2 &_m2;
  1602   public:
  1603     typedef MapBase<typename M1::Key, bool> Parent;
  1604     typedef typename Parent::Key Key;
  1605     typedef typename Parent::Value Value;
  1606 
  1607     /// Constructor
  1608     EqualMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
  1609     /// \e
  1610     Value operator[](const Key &k) const { return _m1[k]==_m2[k]; }
  1611   };
  1612 
  1613   /// Returns an \ref EqualMap class
  1614 
  1615   /// This function just returns an \ref EqualMap class.
  1616   ///
  1617   /// For example, if \c m1 and \c m2 are maps with keys and values of
  1618   /// the same type, then <tt>equalMap(m1,m2)[x]</tt> will be equal to
  1619   /// <tt>m1[x]==m2[x]</tt>.
  1620   ///
  1621   /// \relates EqualMap
  1622   template<typename M1, typename M2>
  1623   inline EqualMap<M1, M2> equalMap(const M1 &m1, const M2 &m2) {
  1624     return EqualMap<M1, M2>(m1,m2);
  1625   }
  1626 
  1627 
  1628   /// Combination of two maps using the \c < operator
  1629 
  1630   /// This \ref concepts::ReadMap "read-only map" assigns \c true to
  1631   /// the keys for which the corresponding value of the first map is
  1632   /// less then the value of the second map.
  1633   /// Its \c Key type is inherited from \c M1 and its \c Value type is
  1634   /// \c bool. \c M2::Key must be convertible to \c M1::Key.
  1635   ///
  1636   /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
  1637   /// \code
  1638   ///   LessMap<M1,M2> lm(m1,m2);
  1639   /// \endcode
  1640   /// <tt>lm[x]</tt> will be equal to <tt>m1[x]<m2[x]</tt>.
  1641   ///
  1642   /// The simplest way of using this map is through the lessMap()
  1643   /// function.
  1644   ///
  1645   /// \sa EqualMap
  1646   template<typename M1, typename M2>
  1647   class LessMap : public MapBase<typename M1::Key, bool> {
  1648     const M1 &_m1;
  1649     const M2 &_m2;
  1650   public:
  1651     typedef MapBase<typename M1::Key, bool> Parent;
  1652     typedef typename Parent::Key Key;
  1653     typedef typename Parent::Value Value;
  1654 
  1655     /// Constructor
  1656     LessMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
  1657     /// \e
  1658     Value operator[](const Key &k) const { return _m1[k]<_m2[k]; }
  1659   };
  1660 
  1661   /// Returns an \ref LessMap class
  1662 
  1663   /// This function just returns an \ref LessMap class.
  1664   ///
  1665   /// For example, if \c m1 and \c m2 are maps with keys and values of
  1666   /// the same type, then <tt>lessMap(m1,m2)[x]</tt> will be equal to
  1667   /// <tt>m1[x]<m2[x]</tt>.
  1668   ///
  1669   /// \relates LessMap
  1670   template<typename M1, typename M2>
  1671   inline LessMap<M1, M2> lessMap(const M1 &m1, const M2 &m2) {
  1672     return LessMap<M1, M2>(m1,m2);
  1673   }
  1674 
  1675   namespace _maps_bits {
  1676 
  1677     template <typename Value>
  1678     struct Identity {
  1679       typedef Value argument_type;
  1680       typedef Value result_type;
  1681       Value operator()(const Value& val) const {
  1682 	return val;
  1683       }
  1684     };
  1685 
  1686     template <typename _Iterator, typename Enable = void>
  1687     struct IteratorTraits {
  1688       typedef typename std::iterator_traits<_Iterator>::value_type Value;
  1689     };
  1690 
  1691     template <typename _Iterator>
  1692     struct IteratorTraits<_Iterator,
  1693       typename exists<typename _Iterator::container_type>::type>
  1694     {
  1695       typedef typename _Iterator::container_type::value_type Value;
  1696     };
  1697 
  1698   }
  1699 
  1700   /// \brief Writable bool map for logging each \c true assigned element
  1701   ///
  1702   /// A \ref concepts::ReadWriteMap "read-write" bool map for logging
  1703   /// each \c true assigned element, i.e it copies subsequently each
  1704   /// keys set to \c true to the given iterator.
  1705   ///
  1706   /// \tparam It the type of the Iterator.
  1707   /// \tparam Ke the type of the map's Key. The default value should
  1708   /// work in most cases.
  1709   ///
  1710   /// \note The container of the iterator must contain enough space
  1711   /// for the elements. (Or it should be an inserter iterator).
  1712   ///
  1713   /// \todo Revise the name of this class and give an example code.
  1714   template <typename It,
  1715 	    typename Ke=typename _maps_bits::IteratorTraits<It>::Value>
  1716   class StoreBoolMap {
  1717   public:
  1718     typedef It Iterator;
  1719 
  1720     typedef Ke Key;
  1721     typedef bool Value;
  1722 
  1723     /// Constructor
  1724     StoreBoolMap(Iterator it)
  1725       : _begin(it), _end(it) {}
  1726 
  1727     /// Gives back the given iterator set for the first key
  1728     Iterator begin() const {
  1729       return _begin;
  1730     }
  1731 
  1732     /// Gives back the the 'after the last' iterator
  1733     Iterator end() const {
  1734       return _end;
  1735     }
  1736 
  1737     /// The set function of the map
  1738     void set(const Key& key, Value value) const {
  1739       if (value) {
  1740 	*_end++ = key;
  1741       }
  1742     }
  1743 
  1744   private:
  1745     Iterator _begin;
  1746     mutable Iterator _end;
  1747   };
  1748 
  1749   /// @}
  1750 }
  1751 
  1752 #endif // LEMON_MAPS_H