lemon/maps.h
author deba
Mon, 03 Apr 2006 09:45:23 +0000
changeset 2031 080d51024ac5
parent 1956 a055123339d5
child 2032 18c08f9129e4
permissions -rw-r--r--
Correcting the structure of the graph's and adaptor's map.
The template assign operators and map iterators can be used for adaptors also.

Some bugfix in the adaptors

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