lemon/maps.h
changeset 91 e28fc773f3c0
parent 81 7ff1c348ae0c
child 104 cdbba181b786
equal deleted inserted replaced
16:d943b06a775f 17:3f5906a50500
    84   }
    84   }
    85 
    85 
    86 
    86 
    87   /// Constant map.
    87   /// Constant map.
    88 
    88 
    89   /// This is a \ref concepts::ReadMap "readable" map which assigns a
    89   /// This \ref concepts::ReadMap "readable map" assigns a specified
    90   /// specified value to each key.
    90   /// value to each key.
    91   ///
    91   ///
    92   /// In other aspects it is equivalent to \ref NullMap.
    92   /// In other aspects it is equivalent to \ref NullMap.
    93   /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
    93   /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
    94   /// concept, but it absorbs the data written to it.
    94   /// concept, but it absorbs the data written to it.
    95   ///
    95   ///
   147   template<typename T, T v>
   147   template<typename T, T v>
   148   struct Const {};
   148   struct Const {};
   149 
   149 
   150   /// Constant map with inlined constant value.
   150   /// Constant map with inlined constant value.
   151 
   151 
   152   /// This is a \ref concepts::ReadMap "readable" map which assigns a
   152   /// This \ref concepts::ReadMap "readable map" assigns a specified
   153   /// specified value to each key.
   153   /// value to each key.
   154   ///
   154   ///
   155   /// In other aspects it is equivalent to \ref NullMap.
   155   /// In other aspects it is equivalent to \ref NullMap.
   156   /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
   156   /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
   157   /// concept, but it absorbs the data written to it.
   157   /// concept, but it absorbs the data written to it.
   158   ///
   158   ///
   187   inline ConstMap<K, Const<V, v> > constMap() {
   187   inline ConstMap<K, Const<V, v> > constMap() {
   188     return ConstMap<K, Const<V, v> >();
   188     return ConstMap<K, Const<V, v> >();
   189   }
   189   }
   190 
   190 
   191 
   191 
   192   /// \brief Identity map.
   192   /// Identity map.
   193   ///
   193 
   194   /// This map gives back the given key as value without any
   194   /// This \ref concepts::ReadMap "read-only map" gives back the given
   195   /// modification.
   195   /// key as value without any modification.
   196   ///
   196   ///
   197   /// \sa ConstMap
   197   /// \sa ConstMap
   198   template <typename T>
   198   template <typename T>
   199   class IdentityMap : public MapBase<T, T> {
   199   class IdentityMap : public MapBase<T, T> {
   200   public:
   200   public:
   201     typedef MapBase<T, T> Parent;
   201     typedef MapBase<T, T> Parent;
   202     typedef typename Parent::Key Key;
   202     typedef typename Parent::Key Key;
   203     typedef typename Parent::Value Value;
   203     typedef typename Parent::Value Value;
   204 
   204 
   205     /// Gives back the given value without any modification.
   205     /// Gives back the given value without any modification.
   206     const T& operator[](const T& t) const {
   206     Value operator[](const Key &k) const {
   207       return t;
   207       return k;
   208     }
   208     }
   209   };
   209   };
   210 
   210 
   211   /// Returns an \ref IdentityMap class
   211   /// Returns an \ref IdentityMap class
   212 
   212 
   462   /// \addtogroup map_adaptors
   462   /// \addtogroup map_adaptors
   463   /// @{
   463   /// @{
   464 
   464 
   465   /// Composition of two maps
   465   /// Composition of two maps
   466 
   466 
   467   /// This \ref concepts::ReadMap "read only map" returns the
   467   /// This \ref concepts::ReadMap "read-only map" returns the
   468   /// composition of two given maps. That is to say, if \c m1 is of
   468   /// composition of two given maps. That is to say, if \c m1 is of
   469   /// type \c M1 and \c m2 is of \c M2, then for
   469   /// type \c M1 and \c m2 is of \c M2, then for
   470   /// \code
   470   /// \code
   471   ///   ComposeMap<M1, M2> cm(m1,m2);
   471   ///   ComposeMap<M1, M2> cm(m1,m2);
   472   /// \endcode
   472   /// \endcode
   514   }
   514   }
   515 
   515 
   516 
   516 
   517   /// Combination of two maps using an STL (binary) functor.
   517   /// Combination of two maps using an STL (binary) functor.
   518 
   518 
   519   /// This \ref concepts::ReadMap "read only map" takes two maps and a
   519   /// This \ref concepts::ReadMap "read-only map" takes two maps and a
   520   /// binary functor and returns the combination of the two given maps
   520   /// binary functor and returns the combination of the two given maps
   521   /// using the functor.
   521   /// using the functor.
   522   /// That is to say, if \c m1 is of type \c M1 and \c m2 is of \c M2
   522   /// That is to say, if \c m1 is of type \c M1 and \c m2 is of \c M2
   523   /// and \c f is of \c F, then for
   523   /// and \c f is of \c F, then for
   524   /// \code
   524   /// \code
   593   }
   593   }
   594 
   594 
   595 
   595 
   596   /// Converts an STL style (unary) functor to a map
   596   /// Converts an STL style (unary) functor to a map
   597 
   597 
   598   /// This \ref concepts::ReadMap "read only map" returns the value
   598   /// This \ref concepts::ReadMap "read-only map" returns the value
   599   /// of a given functor. Actually, it just wraps the functor and
   599   /// of a given functor. Actually, it just wraps the functor and
   600   /// provides the \c Key and \c Value typedefs.
   600   /// provides the \c Key and \c Value typedefs.
   601   ///
   601   ///
   602   /// Template parameters \c K and \c V will become its \c Key and
   602   /// Template parameters \c K and \c V will become its \c Key and
   603   /// \c Value. In most cases they have to be given explicitly because
   603   /// \c Value. In most cases they have to be given explicitly because
   773   }
   773   }
   774 
   774 
   775 
   775 
   776   /// Sum of two maps
   776   /// Sum of two maps
   777 
   777 
   778   /// This \ref concepts::ReadMap "read only map" returns the sum
   778   /// This \ref concepts::ReadMap "read-only map" returns the sum
   779   /// of the values of the two given maps.
   779   /// of the values of the two given maps.
   780   /// Its \c Key and \c Value types are inherited from \c M1.
   780   /// Its \c Key and \c Value types are inherited from \c M1.
   781   /// The \c Key and \c Value of \c M2 must be convertible to those of
   781   /// The \c Key and \c Value of \c M2 must be convertible to those of
   782   /// \c M1.
   782   /// \c M1.
   783   ///
   783   ///
   822   }
   822   }
   823 
   823 
   824 
   824 
   825   /// Difference of two maps
   825   /// Difference of two maps
   826 
   826 
   827   /// This \ref concepts::ReadMap "read only map" returns the difference
   827   /// This \ref concepts::ReadMap "read-only map" returns the difference
   828   /// of the values of the two given maps.
   828   /// of the values of the two given maps.
   829   /// Its \c Key and \c Value types are inherited from \c M1.
   829   /// Its \c Key and \c Value types are inherited from \c M1.
   830   /// The \c Key and \c Value of \c M2 must be convertible to those of
   830   /// The \c Key and \c Value of \c M2 must be convertible to those of
   831   /// \c M1.
   831   /// \c M1.
   832   ///
   832   ///
   870   }
   870   }
   871 
   871 
   872 
   872 
   873   /// Product of two maps
   873   /// Product of two maps
   874 
   874 
   875   /// This \ref concepts::ReadMap "read only map" returns the product
   875   /// This \ref concepts::ReadMap "read-only map" returns the product
   876   /// of the values of the two given maps.
   876   /// of the values of the two given maps.
   877   /// Its \c Key and \c Value types are inherited from \c M1.
   877   /// Its \c Key and \c Value types are inherited from \c M1.
   878   /// The \c Key and \c Value of \c M2 must be convertible to those of
   878   /// The \c Key and \c Value of \c M2 must be convertible to those of
   879   /// \c M1.
   879   /// \c M1.
   880   ///
   880   ///
   919   }
   919   }
   920 
   920 
   921 
   921 
   922   /// Quotient of two maps
   922   /// Quotient of two maps
   923 
   923 
   924   /// This \ref concepts::ReadMap "read only map" returns the quotient
   924   /// This \ref concepts::ReadMap "read-only map" returns the quotient
   925   /// of the values of the two given maps.
   925   /// of the values of the two given maps.
   926   /// Its \c Key and \c Value types are inherited from \c M1.
   926   /// Its \c Key and \c Value types are inherited from \c M1.
   927   /// The \c Key and \c Value of \c M2 must be convertible to those of
   927   /// The \c Key and \c Value of \c M2 must be convertible to those of
   928   /// \c M1.
   928   /// \c M1.
   929   ///
   929   ///
   967   }
   967   }
   968 
   968 
   969 
   969 
   970   /// Shifts a map with a constant.
   970   /// Shifts a map with a constant.
   971 
   971 
   972   /// This \ref concepts::ReadMap "read only map" returns the sum of
   972   /// This \ref concepts::ReadMap "read-only map" returns the sum of
   973   /// the given map and a constant value (i.e. it shifts the map with
   973   /// the given map and a constant value (i.e. it shifts the map with
   974   /// the constant). Its \c Key and \c Value are inherited from \c M.
   974   /// the constant). Its \c Key and \c Value are inherited from \c M.
   975   ///
   975   ///
   976   /// Actually,
   976   /// Actually,
   977   /// \code
   977   /// \code
  1068   }
  1068   }
  1069 
  1069 
  1070 
  1070 
  1071   /// Scales a map with a constant.
  1071   /// Scales a map with a constant.
  1072 
  1072 
  1073   /// This \ref concepts::ReadMap "read only map" returns the value of
  1073   /// This \ref concepts::ReadMap "read-only map" returns the value of
  1074   /// the given map multiplied from the left side with a constant value.
  1074   /// the given map multiplied from the left side with a constant value.
  1075   /// Its \c Key and \c Value are inherited from \c M.
  1075   /// Its \c Key and \c Value are inherited from \c M.
  1076   ///
  1076   ///
  1077   /// Actually,
  1077   /// Actually,
  1078   /// \code
  1078   /// \code
  1170   }
  1170   }
  1171 
  1171 
  1172 
  1172 
  1173   /// Negative of a map
  1173   /// Negative of a map
  1174 
  1174 
  1175   /// This \ref concepts::ReadMap "read only map" returns the negative
  1175   /// This \ref concepts::ReadMap "read-only map" returns the negative
  1176   /// of the values of the given map (using the unary \c - operator).
  1176   /// of the values of the given map (using the unary \c - operator).
  1177   /// Its \c Key and \c Value are inherited from \c M.
  1177   /// Its \c Key and \c Value are inherited from \c M.
  1178   ///
  1178   ///
  1179   /// If M::Value is \c int, \c double etc., then
  1179   /// If M::Value is \c int, \c double etc., then
  1180   /// \code
  1180   /// \code
  1268   }
  1268   }
  1269 
  1269 
  1270 
  1270 
  1271   /// Absolute value of a map
  1271   /// Absolute value of a map
  1272 
  1272 
  1273   /// This \ref concepts::ReadMap "read only map" returns the absolute
  1273   /// This \ref concepts::ReadMap "read-only map" returns the absolute
  1274   /// value of the values of the given map.
  1274   /// value of the values of the given map.
  1275   /// Its \c Key and \c Value are inherited from \c M.
  1275   /// Its \c Key and \c Value are inherited from \c M.
  1276   /// \c Value must be comparable to \c 0 and the unary \c -
  1276   /// \c Value must be comparable to \c 0 and the unary \c -
  1277   /// operator must be defined for it, of course.
  1277   /// operator must be defined for it, of course.
  1278   ///
  1278   ///
  1309   template<typename M>
  1309   template<typename M>
  1310   inline AbsMap<M> absMap(const M &m) {
  1310   inline AbsMap<M> absMap(const M &m) {
  1311     return AbsMap<M>(m);
  1311     return AbsMap<M>(m);
  1312   }
  1312   }
  1313 
  1313 
       
  1314   /// @}
       
  1315   
       
  1316   // Logical maps and map adaptors:
       
  1317 
       
  1318   /// \addtogroup maps
       
  1319   /// @{
       
  1320 
       
  1321   /// Constant \c true map.
       
  1322 
       
  1323   /// This \ref concepts::ReadMap "read-only map" assigns \c true to
       
  1324   /// each key.
       
  1325   ///
       
  1326   /// Note that
       
  1327   /// \code
       
  1328   ///   TrueMap<K> tm;
       
  1329   /// \endcode
       
  1330   /// is equivalent to
       
  1331   /// \code
       
  1332   ///   ConstMap<K,bool> tm(true);
       
  1333   /// \endcode
       
  1334   ///
       
  1335   /// \sa FalseMap
       
  1336   /// \sa ConstMap
       
  1337   template <typename K>
       
  1338   class TrueMap : public MapBase<K, bool> {
       
  1339   public:
       
  1340     typedef MapBase<K, bool> Parent;
       
  1341     typedef typename Parent::Key Key;
       
  1342     typedef typename Parent::Value Value;
       
  1343 
       
  1344     /// Gives back \c true.
       
  1345     Value operator[](const Key&) const { return true; }
       
  1346   };
       
  1347 
       
  1348   /// Returns a \ref TrueMap class
       
  1349 
       
  1350   /// This function just returns a \ref TrueMap class.
       
  1351   /// \relates TrueMap
       
  1352   template<typename K>
       
  1353   inline TrueMap<K> trueMap() {
       
  1354     return TrueMap<K>();
       
  1355   }
       
  1356 
       
  1357 
       
  1358   /// Constant \c false map.
       
  1359 
       
  1360   /// This \ref concepts::ReadMap "read-only map" assigns \c false to
       
  1361   /// each key.
       
  1362   ///
       
  1363   /// Note that
       
  1364   /// \code
       
  1365   ///   FalseMap<K> fm;
       
  1366   /// \endcode
       
  1367   /// is equivalent to
       
  1368   /// \code
       
  1369   ///   ConstMap<K,bool> fm(false);
       
  1370   /// \endcode
       
  1371   ///
       
  1372   /// \sa TrueMap
       
  1373   /// \sa ConstMap
       
  1374   template <typename K>
       
  1375   class FalseMap : public MapBase<K, bool> {
       
  1376   public:
       
  1377     typedef MapBase<K, bool> Parent;
       
  1378     typedef typename Parent::Key Key;
       
  1379     typedef typename Parent::Value Value;
       
  1380 
       
  1381     /// Gives back \c false.
       
  1382     Value operator[](const Key&) const { return false; }
       
  1383   };
       
  1384 
       
  1385   /// Returns a \ref FalseMap class
       
  1386 
       
  1387   /// This function just returns a \ref FalseMap class.
       
  1388   /// \relates FalseMap
       
  1389   template<typename K>
       
  1390   inline FalseMap<K> falseMap() {
       
  1391     return FalseMap<K>();
       
  1392   }
       
  1393 
       
  1394   /// @}
       
  1395 
       
  1396   /// \addtogroup map_adaptors
       
  1397   /// @{
       
  1398 
       
  1399   /// Logical 'and' of two maps
       
  1400 
       
  1401   /// This \ref concepts::ReadMap "read-only map" returns the logical
       
  1402   /// 'and' of the values of the two given maps.
       
  1403   /// Its \c Key type is inherited from \c M1 and its \c Value type is
       
  1404   /// \c bool. \c M2::Key must be convertible to \c M1::Key.
       
  1405   ///
       
  1406   /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
       
  1407   /// \code
       
  1408   ///   AndMap<M1,M2> am(m1,m2);
       
  1409   /// \endcode
       
  1410   /// <tt>am[x]</tt> will be equal to <tt>m1[x]&&m2[x]</tt>.
       
  1411   ///
       
  1412   /// The simplest way of using this map is through the andMap()
       
  1413   /// function.
       
  1414   ///
       
  1415   /// \sa OrMap
       
  1416   /// \sa NotMap, NotWriteMap
       
  1417   template<typename M1, typename M2>
       
  1418   class AndMap : public MapBase<typename M1::Key, bool> {
       
  1419     const M1 &_m1;
       
  1420     const M2 &_m2;
       
  1421   public:
       
  1422     typedef MapBase<typename M1::Key, bool> Parent;
       
  1423     typedef typename Parent::Key Key;
       
  1424     typedef typename Parent::Value Value;
       
  1425 
       
  1426     /// Constructor
       
  1427     AndMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
       
  1428     /// \e
       
  1429     Value operator[](const Key &k) const { return _m1[k]&&_m2[k]; }
       
  1430   };
       
  1431 
       
  1432   /// Returns an \ref AndMap class
       
  1433 
       
  1434   /// This function just returns an \ref AndMap class.
       
  1435   ///
       
  1436   /// For example, if \c m1 and \c m2 are both maps with \c bool values,
       
  1437   /// then <tt>andMap(m1,m2)[x]</tt> will be equal to
       
  1438   /// <tt>m1[x]&&m2[x]</tt>.
       
  1439   ///
       
  1440   /// \relates AndMap
       
  1441   template<typename M1, typename M2>
       
  1442   inline AndMap<M1, M2> andMap(const M1 &m1, const M2 &m2) {
       
  1443     return AndMap<M1, M2>(m1,m2);
       
  1444   }
       
  1445 
       
  1446 
       
  1447   /// Logical 'or' of two maps
       
  1448 
       
  1449   /// This \ref concepts::ReadMap "read-only map" returns the logical
       
  1450   /// 'or' of the values of the two given maps.
       
  1451   /// Its \c Key type is inherited from \c M1 and its \c Value type is
       
  1452   /// \c bool. \c M2::Key must be convertible to \c M1::Key.
       
  1453   ///
       
  1454   /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
       
  1455   /// \code
       
  1456   ///   OrMap<M1,M2> om(m1,m2);
       
  1457   /// \endcode
       
  1458   /// <tt>om[x]</tt> will be equal to <tt>m1[x]||m2[x]</tt>.
       
  1459   ///
       
  1460   /// The simplest way of using this map is through the orMap()
       
  1461   /// function.
       
  1462   ///
       
  1463   /// \sa AndMap
       
  1464   /// \sa NotMap, NotWriteMap
       
  1465   template<typename M1, typename M2>
       
  1466   class OrMap : public MapBase<typename M1::Key, bool> {
       
  1467     const M1 &_m1;
       
  1468     const M2 &_m2;
       
  1469   public:
       
  1470     typedef MapBase<typename M1::Key, bool> Parent;
       
  1471     typedef typename Parent::Key Key;
       
  1472     typedef typename Parent::Value Value;
       
  1473 
       
  1474     /// Constructor
       
  1475     OrMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
       
  1476     /// \e
       
  1477     Value operator[](const Key &k) const { return _m1[k]||_m2[k]; }
       
  1478   };
       
  1479 
       
  1480   /// Returns an \ref OrMap class
       
  1481 
       
  1482   /// This function just returns an \ref OrMap class.
       
  1483   ///
       
  1484   /// For example, if \c m1 and \c m2 are both maps with \c bool values,
       
  1485   /// then <tt>orMap(m1,m2)[x]</tt> will be equal to
       
  1486   /// <tt>m1[x]||m2[x]</tt>.
       
  1487   ///
       
  1488   /// \relates OrMap
       
  1489   template<typename M1, typename M2>
       
  1490   inline OrMap<M1, M2> orMap(const M1 &m1, const M2 &m2) {
       
  1491     return OrMap<M1, M2>(m1,m2);
       
  1492   }
       
  1493 
  1314 
  1494 
  1315   /// Logical 'not' of a map
  1495   /// Logical 'not' of a map
  1316 
  1496 
  1317   /// This \ref concepts::ReadMap "read only map" returns the logical
  1497   /// This \ref concepts::ReadMap "read-only map" returns the logical
  1318   /// negation of the values of the given map.
  1498   /// negation of the values of the given map.
  1319   /// Its \c Key is inherited from \c M and its \c Value is \c bool.
  1499   /// Its \c Key is inherited from \c M and its \c Value is \c bool.
  1320   ///
  1500   ///
  1321   /// The simplest way of using this map is through the notMap()
  1501   /// The simplest way of using this map is through the notMap()
  1322   /// function.
  1502   /// function.
  1389   template <typename M>
  1569   template <typename M>
  1390   inline NotWriteMap<M> notWriteMap(M &m) {
  1570   inline NotWriteMap<M> notWriteMap(M &m) {
  1391     return NotWriteMap<M>(m);
  1571     return NotWriteMap<M>(m);
  1392   }
  1572   }
  1393 
  1573 
       
  1574 
       
  1575   /// Combination of two maps using the \c == operator
       
  1576 
       
  1577   /// This \ref concepts::ReadMap "read-only map" assigns \c true to
       
  1578   /// the keys for which the corresponding values of the two maps are
       
  1579   /// equal.
       
  1580   /// Its \c Key type is inherited from \c M1 and its \c Value type is
       
  1581   /// \c bool. \c M2::Key must be convertible to \c M1::Key.
       
  1582   ///
       
  1583   /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
       
  1584   /// \code
       
  1585   ///   EqualMap<M1,M2> em(m1,m2);
       
  1586   /// \endcode
       
  1587   /// <tt>em[x]</tt> will be equal to <tt>m1[x]==m2[x]</tt>.
       
  1588   ///
       
  1589   /// The simplest way of using this map is through the equalMap()
       
  1590   /// function.
       
  1591   ///
       
  1592   /// \sa LessMap
       
  1593   template<typename M1, typename M2>
       
  1594   class EqualMap : public MapBase<typename M1::Key, bool> {
       
  1595     const M1 &_m1;
       
  1596     const M2 &_m2;
       
  1597   public:
       
  1598     typedef MapBase<typename M1::Key, bool> Parent;
       
  1599     typedef typename Parent::Key Key;
       
  1600     typedef typename Parent::Value Value;
       
  1601 
       
  1602     /// Constructor
       
  1603     EqualMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
       
  1604     /// \e
       
  1605     Value operator[](const Key &k) const { return _m1[k]==_m2[k]; }
       
  1606   };
       
  1607 
       
  1608   /// Returns an \ref EqualMap class
       
  1609 
       
  1610   /// This function just returns an \ref EqualMap class.
       
  1611   ///
       
  1612   /// For example, if \c m1 and \c m2 are maps with keys and values of
       
  1613   /// the same type, then <tt>equalMap(m1,m2)[x]</tt> will be equal to
       
  1614   /// <tt>m1[x]==m2[x]</tt>.
       
  1615   ///
       
  1616   /// \relates EqualMap
       
  1617   template<typename M1, typename M2>
       
  1618   inline EqualMap<M1, M2> equalMap(const M1 &m1, const M2 &m2) {
       
  1619     return EqualMap<M1, M2>(m1,m2);
       
  1620   }
       
  1621 
       
  1622 
       
  1623   /// Combination of two maps using the \c < operator
       
  1624 
       
  1625   /// This \ref concepts::ReadMap "read-only map" assigns \c true to
       
  1626   /// the keys for which the corresponding value of the first map is
       
  1627   /// less then the value of the second map.
       
  1628   /// Its \c Key type is inherited from \c M1 and its \c Value type is
       
  1629   /// \c bool. \c M2::Key must be convertible to \c M1::Key.
       
  1630   ///
       
  1631   /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
       
  1632   /// \code
       
  1633   ///   LessMap<M1,M2> lm(m1,m2);
       
  1634   /// \endcode
       
  1635   /// <tt>lm[x]</tt> will be equal to <tt>m1[x]<m2[x]</tt>.
       
  1636   ///
       
  1637   /// The simplest way of using this map is through the lessMap()
       
  1638   /// function.
       
  1639   ///
       
  1640   /// \sa EqualMap
       
  1641   template<typename M1, typename M2>
       
  1642   class LessMap : public MapBase<typename M1::Key, bool> {
       
  1643     const M1 &_m1;
       
  1644     const M2 &_m2;
       
  1645   public:
       
  1646     typedef MapBase<typename M1::Key, bool> Parent;
       
  1647     typedef typename Parent::Key Key;
       
  1648     typedef typename Parent::Value Value;
       
  1649 
       
  1650     /// Constructor
       
  1651     LessMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
       
  1652     /// \e
       
  1653     Value operator[](const Key &k) const { return _m1[k]<_m2[k]; }
       
  1654   };
       
  1655 
       
  1656   /// Returns an \ref LessMap class
       
  1657 
       
  1658   /// This function just returns an \ref LessMap class.
       
  1659   ///
       
  1660   /// For example, if \c m1 and \c m2 are maps with keys and values of
       
  1661   /// the same type, then <tt>lessMap(m1,m2)[x]</tt> will be equal to
       
  1662   /// <tt>m1[x]<m2[x]</tt>.
       
  1663   ///
       
  1664   /// \relates LessMap
       
  1665   template<typename M1, typename M2>
       
  1666   inline LessMap<M1, M2> lessMap(const M1 &m1, const M2 &m2) {
       
  1667     return LessMap<M1, M2>(m1,m2);
       
  1668   }
       
  1669 
  1394   /// @}
  1670   /// @}
  1395 }
  1671 }
  1396 
  1672 
  1397 #endif // LEMON_MAPS_H
  1673 #endif // LEMON_MAPS_H