gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge
0 2 0
merge default
0 files changed with 74 insertions and 18 deletions:
↑ Collapse diff ↑
Ignore white space 6 line context
... ...
@@ -1293,460 +1293,494 @@
1293 1293

	
1294 1294
    /// Constructor
1295 1295
    AbsMap(const M &m) : _m(m) {}
1296 1296
    /// \e
1297 1297
    Value operator[](const Key &k) const {
1298 1298
      Value tmp = _m[k];
1299 1299
      return tmp >= 0 ? tmp : -tmp;
1300 1300
    }
1301 1301

	
1302 1302
  };
1303 1303

	
1304 1304
  /// Returns an \ref AbsMap class
1305 1305

	
1306 1306
  /// This function just returns an \ref AbsMap class.
1307 1307
  ///
1308 1308
  /// For example, if \c m is a map with \c double values, then
1309 1309
  /// <tt>absMap(m)[x]</tt> will be equal to <tt>m[x]</tt> if
1310 1310
  /// it is positive or zero and <tt>-m[x]</tt> if <tt>m[x]</tt> is
1311 1311
  /// negative.
1312 1312
  ///
1313 1313
  /// \relates AbsMap
1314 1314
  template<typename M>
1315 1315
  inline AbsMap<M> absMap(const M &m) {
1316 1316
    return AbsMap<M>(m);
1317 1317
  }
1318 1318

	
1319 1319
  /// @}
1320 1320
  
1321 1321
  // Logical maps and map adaptors:
1322 1322

	
1323 1323
  /// \addtogroup maps
1324 1324
  /// @{
1325 1325

	
1326 1326
  /// Constant \c true map.
1327 1327

	
1328 1328
  /// This \ref concepts::ReadMap "read-only map" assigns \c true to
1329 1329
  /// each key.
1330 1330
  ///
1331 1331
  /// Note that
1332 1332
  /// \code
1333 1333
  ///   TrueMap<K> tm;
1334 1334
  /// \endcode
1335 1335
  /// is equivalent to
1336 1336
  /// \code
1337 1337
  ///   ConstMap<K,bool> tm(true);
1338 1338
  /// \endcode
1339 1339
  ///
1340 1340
  /// \sa FalseMap
1341 1341
  /// \sa ConstMap
1342 1342
  template <typename K>
1343 1343
  class TrueMap : public MapBase<K, bool> {
1344 1344
  public:
1345 1345
    typedef MapBase<K, bool> Parent;
1346 1346
    typedef typename Parent::Key Key;
1347 1347
    typedef typename Parent::Value Value;
1348 1348

	
1349 1349
    /// Gives back \c true.
1350 1350
    Value operator[](const Key&) const { return true; }
1351 1351
  };
1352 1352

	
1353 1353
  /// Returns a \ref TrueMap class
1354 1354

	
1355 1355
  /// This function just returns a \ref TrueMap class.
1356 1356
  /// \relates TrueMap
1357 1357
  template<typename K>
1358 1358
  inline TrueMap<K> trueMap() {
1359 1359
    return TrueMap<K>();
1360 1360
  }
1361 1361

	
1362 1362

	
1363 1363
  /// Constant \c false map.
1364 1364

	
1365 1365
  /// This \ref concepts::ReadMap "read-only map" assigns \c false to
1366 1366
  /// each key.
1367 1367
  ///
1368 1368
  /// Note that
1369 1369
  /// \code
1370 1370
  ///   FalseMap<K> fm;
1371 1371
  /// \endcode
1372 1372
  /// is equivalent to
1373 1373
  /// \code
1374 1374
  ///   ConstMap<K,bool> fm(false);
1375 1375
  /// \endcode
1376 1376
  ///
1377 1377
  /// \sa TrueMap
1378 1378
  /// \sa ConstMap
1379 1379
  template <typename K>
1380 1380
  class FalseMap : public MapBase<K, bool> {
1381 1381
  public:
1382 1382
    typedef MapBase<K, bool> Parent;
1383 1383
    typedef typename Parent::Key Key;
1384 1384
    typedef typename Parent::Value Value;
1385 1385

	
1386 1386
    /// Gives back \c false.
1387 1387
    Value operator[](const Key&) const { return false; }
1388 1388
  };
1389 1389

	
1390 1390
  /// Returns a \ref FalseMap class
1391 1391

	
1392 1392
  /// This function just returns a \ref FalseMap class.
1393 1393
  /// \relates FalseMap
1394 1394
  template<typename K>
1395 1395
  inline FalseMap<K> falseMap() {
1396 1396
    return FalseMap<K>();
1397 1397
  }
1398 1398

	
1399 1399
  /// @}
1400 1400

	
1401 1401
  /// \addtogroup map_adaptors
1402 1402
  /// @{
1403 1403

	
1404 1404
  /// Logical 'and' of two maps
1405 1405

	
1406 1406
  /// This \ref concepts::ReadMap "read-only map" returns the logical
1407 1407
  /// 'and' of the values of the two given maps.
1408 1408
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1409 1409
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1410 1410
  ///
1411 1411
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1412 1412
  /// \code
1413 1413
  ///   AndMap<M1,M2> am(m1,m2);
1414 1414
  /// \endcode
1415 1415
  /// <tt>am[x]</tt> will be equal to <tt>m1[x]&&m2[x]</tt>.
1416 1416
  ///
1417 1417
  /// The simplest way of using this map is through the andMap()
1418 1418
  /// function.
1419 1419
  ///
1420 1420
  /// \sa OrMap
1421 1421
  /// \sa NotMap, NotWriteMap
1422 1422
  template<typename M1, typename M2>
1423 1423
  class AndMap : public MapBase<typename M1::Key, bool> {
1424 1424
    const M1 &_m1;
1425 1425
    const M2 &_m2;
1426 1426
  public:
1427 1427
    typedef MapBase<typename M1::Key, bool> Parent;
1428 1428
    typedef typename Parent::Key Key;
1429 1429
    typedef typename Parent::Value Value;
1430 1430

	
1431 1431
    /// Constructor
1432 1432
    AndMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1433 1433
    /// \e
1434 1434
    Value operator[](const Key &k) const { return _m1[k]&&_m2[k]; }
1435 1435
  };
1436 1436

	
1437 1437
  /// Returns an \ref AndMap class
1438 1438

	
1439 1439
  /// This function just returns an \ref AndMap class.
1440 1440
  ///
1441 1441
  /// For example, if \c m1 and \c m2 are both maps with \c bool values,
1442 1442
  /// then <tt>andMap(m1,m2)[x]</tt> will be equal to
1443 1443
  /// <tt>m1[x]&&m2[x]</tt>.
1444 1444
  ///
1445 1445
  /// \relates AndMap
1446 1446
  template<typename M1, typename M2>
1447 1447
  inline AndMap<M1, M2> andMap(const M1 &m1, const M2 &m2) {
1448 1448
    return AndMap<M1, M2>(m1,m2);
1449 1449
  }
1450 1450

	
1451 1451

	
1452 1452
  /// Logical 'or' of two maps
1453 1453

	
1454 1454
  /// This \ref concepts::ReadMap "read-only map" returns the logical
1455 1455
  /// 'or' of the values of the two given maps.
1456 1456
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1457 1457
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1458 1458
  ///
1459 1459
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1460 1460
  /// \code
1461 1461
  ///   OrMap<M1,M2> om(m1,m2);
1462 1462
  /// \endcode
1463 1463
  /// <tt>om[x]</tt> will be equal to <tt>m1[x]||m2[x]</tt>.
1464 1464
  ///
1465 1465
  /// The simplest way of using this map is through the orMap()
1466 1466
  /// function.
1467 1467
  ///
1468 1468
  /// \sa AndMap
1469 1469
  /// \sa NotMap, NotWriteMap
1470 1470
  template<typename M1, typename M2>
1471 1471
  class OrMap : public MapBase<typename M1::Key, bool> {
1472 1472
    const M1 &_m1;
1473 1473
    const M2 &_m2;
1474 1474
  public:
1475 1475
    typedef MapBase<typename M1::Key, bool> Parent;
1476 1476
    typedef typename Parent::Key Key;
1477 1477
    typedef typename Parent::Value Value;
1478 1478

	
1479 1479
    /// Constructor
1480 1480
    OrMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1481 1481
    /// \e
1482 1482
    Value operator[](const Key &k) const { return _m1[k]||_m2[k]; }
1483 1483
  };
1484 1484

	
1485 1485
  /// Returns an \ref OrMap class
1486 1486

	
1487 1487
  /// This function just returns an \ref OrMap class.
1488 1488
  ///
1489 1489
  /// For example, if \c m1 and \c m2 are both maps with \c bool values,
1490 1490
  /// then <tt>orMap(m1,m2)[x]</tt> will be equal to
1491 1491
  /// <tt>m1[x]||m2[x]</tt>.
1492 1492
  ///
1493 1493
  /// \relates OrMap
1494 1494
  template<typename M1, typename M2>
1495 1495
  inline OrMap<M1, M2> orMap(const M1 &m1, const M2 &m2) {
1496 1496
    return OrMap<M1, M2>(m1,m2);
1497 1497
  }
1498 1498

	
1499 1499

	
1500 1500
  /// Logical 'not' of a map
1501 1501

	
1502 1502
  /// This \ref concepts::ReadMap "read-only map" returns the logical
1503 1503
  /// negation of the values of the given map.
1504 1504
  /// Its \c Key is inherited from \c M and its \c Value is \c bool.
1505 1505
  ///
1506 1506
  /// The simplest way of using this map is through the notMap()
1507 1507
  /// function.
1508 1508
  ///
1509 1509
  /// \sa NotWriteMap
1510 1510
  template <typename M>
1511 1511
  class NotMap : public MapBase<typename M::Key, bool> {
1512 1512
    const M &_m;
1513 1513
  public:
1514 1514
    typedef MapBase<typename M::Key, bool> Parent;
1515 1515
    typedef typename Parent::Key Key;
1516 1516
    typedef typename Parent::Value Value;
1517 1517

	
1518 1518
    /// Constructor
1519 1519
    NotMap(const M &m) : _m(m) {}
1520 1520
    /// \e
1521 1521
    Value operator[](const Key &k) const { return !_m[k]; }
1522 1522
  };
1523 1523

	
1524 1524
  /// Logical 'not' of a map (read-write version)
1525 1525

	
1526 1526
  /// This \ref concepts::ReadWriteMap "read-write map" returns the
1527 1527
  /// logical negation of the values of the given map.
1528 1528
  /// Its \c Key is inherited from \c M and its \c Value is \c bool.
1529 1529
  /// It makes also possible to write the map. When a value is set,
1530 1530
  /// the opposite value is set to the original map.
1531 1531
  ///
1532 1532
  /// The simplest way of using this map is through the notWriteMap()
1533 1533
  /// function.
1534 1534
  ///
1535 1535
  /// \sa NotMap
1536 1536
  template <typename M>
1537 1537
  class NotWriteMap : public MapBase<typename M::Key, bool> {
1538 1538
    M &_m;
1539 1539
  public:
1540 1540
    typedef MapBase<typename M::Key, bool> Parent;
1541 1541
    typedef typename Parent::Key Key;
1542 1542
    typedef typename Parent::Value Value;
1543 1543

	
1544 1544
    /// Constructor
1545 1545
    NotWriteMap(M &m) : _m(m) {}
1546 1546
    /// \e
1547 1547
    Value operator[](const Key &k) const { return !_m[k]; }
1548 1548
    /// \e
1549 1549
    void set(const Key &k, bool v) { _m.set(k, !v); }
1550 1550
  };
1551 1551

	
1552 1552
  /// Returns a \ref NotMap class
1553 1553

	
1554 1554
  /// This function just returns a \ref NotMap class.
1555 1555
  ///
1556 1556
  /// For example, if \c m is a map with \c bool values, then
1557 1557
  /// <tt>notMap(m)[x]</tt> will be equal to <tt>!m[x]</tt>.
1558 1558
  ///
1559 1559
  /// \relates NotMap
1560 1560
  template <typename M>
1561 1561
  inline NotMap<M> notMap(const M &m) {
1562 1562
    return NotMap<M>(m);
1563 1563
  }
1564 1564

	
1565 1565
  /// Returns a \ref NotWriteMap class
1566 1566

	
1567 1567
  /// This function just returns a \ref NotWriteMap class.
1568 1568
  ///
1569 1569
  /// For example, if \c m is a map with \c bool values, then
1570 1570
  /// <tt>notWriteMap(m)[x]</tt> will be equal to <tt>!m[x]</tt>.
1571 1571
  /// Moreover it makes also possible to write the map.
1572 1572
  ///
1573 1573
  /// \relates NotWriteMap
1574 1574
  template <typename M>
1575 1575
  inline NotWriteMap<M> notWriteMap(M &m) {
1576 1576
    return NotWriteMap<M>(m);
1577 1577
  }
1578 1578

	
1579 1579

	
1580 1580
  /// Combination of two maps using the \c == operator
1581 1581

	
1582 1582
  /// This \ref concepts::ReadMap "read-only map" assigns \c true to
1583 1583
  /// the keys for which the corresponding values of the two maps are
1584 1584
  /// equal.
1585 1585
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1586 1586
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1587 1587
  ///
1588 1588
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1589 1589
  /// \code
1590 1590
  ///   EqualMap<M1,M2> em(m1,m2);
1591 1591
  /// \endcode
1592 1592
  /// <tt>em[x]</tt> will be equal to <tt>m1[x]==m2[x]</tt>.
1593 1593
  ///
1594 1594
  /// The simplest way of using this map is through the equalMap()
1595 1595
  /// function.
1596 1596
  ///
1597 1597
  /// \sa LessMap
1598 1598
  template<typename M1, typename M2>
1599 1599
  class EqualMap : public MapBase<typename M1::Key, bool> {
1600 1600
    const M1 &_m1;
1601 1601
    const M2 &_m2;
1602 1602
  public:
1603 1603
    typedef MapBase<typename M1::Key, bool> Parent;
1604 1604
    typedef typename Parent::Key Key;
1605 1605
    typedef typename Parent::Value Value;
1606 1606

	
1607 1607
    /// Constructor
1608 1608
    EqualMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1609 1609
    /// \e
1610 1610
    Value operator[](const Key &k) const { return _m1[k]==_m2[k]; }
1611 1611
  };
1612 1612

	
1613 1613
  /// Returns an \ref EqualMap class
1614 1614

	
1615 1615
  /// This function just returns an \ref EqualMap class.
1616 1616
  ///
1617 1617
  /// For example, if \c m1 and \c m2 are maps with keys and values of
1618 1618
  /// the same type, then <tt>equalMap(m1,m2)[x]</tt> will be equal to
1619 1619
  /// <tt>m1[x]==m2[x]</tt>.
1620 1620
  ///
1621 1621
  /// \relates EqualMap
1622 1622
  template<typename M1, typename M2>
1623 1623
  inline EqualMap<M1, M2> equalMap(const M1 &m1, const M2 &m2) {
1624 1624
    return EqualMap<M1, M2>(m1,m2);
1625 1625
  }
1626 1626

	
1627 1627

	
1628 1628
  /// Combination of two maps using the \c < operator
1629 1629

	
1630 1630
  /// This \ref concepts::ReadMap "read-only map" assigns \c true to
1631 1631
  /// the keys for which the corresponding value of the first map is
1632 1632
  /// less then the value of the second map.
1633 1633
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1634 1634
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1635 1635
  ///
1636 1636
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1637 1637
  /// \code
1638 1638
  ///   LessMap<M1,M2> lm(m1,m2);
1639 1639
  /// \endcode
1640 1640
  /// <tt>lm[x]</tt> will be equal to <tt>m1[x]<m2[x]</tt>.
1641 1641
  ///
1642 1642
  /// The simplest way of using this map is through the lessMap()
1643 1643
  /// function.
1644 1644
  ///
1645 1645
  /// \sa EqualMap
1646 1646
  template<typename M1, typename M2>
1647 1647
  class LessMap : public MapBase<typename M1::Key, bool> {
1648 1648
    const M1 &_m1;
1649 1649
    const M2 &_m2;
1650 1650
  public:
1651 1651
    typedef MapBase<typename M1::Key, bool> Parent;
1652 1652
    typedef typename Parent::Key Key;
1653 1653
    typedef typename Parent::Value Value;
1654 1654

	
1655 1655
    /// Constructor
1656 1656
    LessMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1657 1657
    /// \e
1658 1658
    Value operator[](const Key &k) const { return _m1[k]<_m2[k]; }
1659 1659
  };
1660 1660

	
1661 1661
  /// Returns an \ref LessMap class
1662 1662

	
1663 1663
  /// This function just returns an \ref LessMap class.
1664 1664
  ///
1665 1665
  /// For example, if \c m1 and \c m2 are maps with keys and values of
1666 1666
  /// the same type, then <tt>lessMap(m1,m2)[x]</tt> will be equal to
1667 1667
  /// <tt>m1[x]<m2[x]</tt>.
1668 1668
  ///
1669 1669
  /// \relates LessMap
1670 1670
  template<typename M1, typename M2>
1671 1671
  inline LessMap<M1, M2> lessMap(const M1 &m1, const M2 &m2) {
1672 1672
    return LessMap<M1, M2>(m1,m2);
1673 1673
  }
1674 1674

	
1675 1675
  namespace _maps_bits {
1676 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 1677
    template <typename _Iterator, typename Enable = void>
1687 1678
    struct IteratorTraits {
1688 1679
      typedef typename std::iterator_traits<_Iterator>::value_type Value;
1689 1680
    };
1690 1681

	
1691 1682
    template <typename _Iterator>
1692 1683
    struct IteratorTraits<_Iterator,
1693 1684
      typename exists<typename _Iterator::container_type>::type>
1694 1685
    {
1695 1686
      typedef typename _Iterator::container_type::value_type Value;
1696 1687
    };
1697 1688

	
1698 1689
  }
1699 1690

	
1700 1691
  /// \brief Writable bool map for logging each \c true assigned element
1701 1692
  ///
1702
  /// A \ref concepts::ReadWriteMap "read-write" bool map for logging
1693
  /// A \ref concepts::WriteMap "writable" bool map for logging
1703 1694
  /// each \c true assigned element, i.e it copies subsequently each
1704 1695
  /// keys set to \c true to the given iterator.
1696
  /// The most important usage of it is storing certain nodes or arcs
1697
  /// that were marked \c true by an algorithm.
1705 1698
  ///
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.
1699
  /// There are several algorithms that provide solutions through bool
1700
  /// maps and most of them assign \c true at most once for each key.
1701
  /// In these cases it is a natural request to store each \c true
1702
  /// assigned elements (in order of the assignment), which can be
1703
  /// easily done with StoreBoolMap.
1704
  ///
1705
  /// The simplest way of using this map is through the storeBoolMap()
1706
  /// function.
1707
  ///
1708
  /// \tparam It The type of the iterator.
1709
  /// \tparam Ke The key type of the map. The default value set
1710
  /// according to the iterator type should work in most cases.
1709 1711
  ///
1710 1712
  /// \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.
1713
  /// for the elements or the iterator should be an inserter iterator.
1714
#ifdef DOXYGEN
1715
  template <typename It, typename Ke>
1716
#else
1714 1717
  template <typename It,
1715 1718
	    typename Ke=typename _maps_bits::IteratorTraits<It>::Value>
1719
#endif
1716 1720
  class StoreBoolMap {
1717 1721
  public:
1718 1722
    typedef It Iterator;
1719 1723

	
1720 1724
    typedef Ke Key;
1721 1725
    typedef bool Value;
1722 1726

	
1723 1727
    /// Constructor
1724 1728
    StoreBoolMap(Iterator it)
1725 1729
      : _begin(it), _end(it) {}
1726 1730

	
1727 1731
    /// Gives back the given iterator set for the first key
1728 1732
    Iterator begin() const {
1729 1733
      return _begin;
1730 1734
    }
1731 1735

	
1732 1736
    /// Gives back the the 'after the last' iterator
1733 1737
    Iterator end() const {
1734 1738
      return _end;
1735 1739
    }
1736 1740

	
1737 1741
    /// The set function of the map
1738
    void set(const Key& key, Value value) const {
1742
    void set(const Key& key, Value value) {
1739 1743
      if (value) {
1740 1744
	*_end++ = key;
1741 1745
      }
1742 1746
    }
1743 1747

	
1744 1748
  private:
1745 1749
    Iterator _begin;
1746
    mutable Iterator _end;
1750
    Iterator _end;
1747 1751
  };
1752
  
1753
  /// Returns a \ref StoreBoolMap class
1754

	
1755
  /// This function just returns a \ref StoreBoolMap class.
1756
  ///
1757
  /// The most important usage of it is storing certain nodes or arcs
1758
  /// that were marked \c true by an algorithm.
1759
  /// For example it makes easier to store the nodes in the processing
1760
  /// order of Dfs algorithm, as the following examples show.
1761
  /// \code
1762
  ///   std::vector<Node> v;
1763
  ///   dfs(g,s).processedMap(storeBoolMap(std::back_inserter(v))).run();
1764
  /// \endcode
1765
  /// \code
1766
  ///   std::vector<Node> v(countNodes(g));
1767
  ///   dfs(g,s).processedMap(storeBoolMap(v.begin())).run();
1768
  /// \endcode
1769
  ///
1770
  /// \note The container of the iterator must contain enough space
1771
  /// for the elements or the iterator should be an inserter iterator.
1772
  ///
1773
  /// \note StoreBoolMap is just \ref concepts::WriteMap "writable", so
1774
  /// it cannot be used when a readable map is needed, for example as
1775
  /// \c ReachedMap for Bfs, Dfs and Dijkstra algorithms.
1776
  ///
1777
  /// \relates StoreBoolMap
1778
  template<typename Iterator>
1779
  inline StoreBoolMap<Iterator> storeBoolMap(Iterator it) {
1780
    return StoreBoolMap<Iterator>(it);
1781
  }
1748 1782

	
1749 1783
  /// @}
1750 1784
}
1751 1785

	
1752 1786
#endif // LEMON_MAPS_H
Ignore white space 768 line context
1 1
/* -*- C++ -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <deque>
20 20
#include <set>
21 21

	
22 22
#include <lemon/concept_check.h>
23 23
#include <lemon/concepts/maps.h>
24 24
#include <lemon/maps.h>
25 25

	
26 26
#include "test_tools.h"
27 27

	
28 28
using namespace lemon;
29 29
using namespace lemon::concepts;
30 30

	
31 31
struct A {};
32 32
inline bool operator<(A, A) { return true; }
33 33
struct B {};
34 34

	
35 35
class C {
36 36
  int x;
37 37
public:
38 38
  C(int _x) : x(_x) {}
39 39
};
40 40

	
41 41
class F {
42 42
public:
43 43
  typedef A argument_type;
44 44
  typedef B result_type;
45 45

	
46 46
  B operator()(const A&) const { return B(); }
47 47
private:
48 48
  F& operator=(const F&);
49 49
};
50 50

	
51 51
int func(A) { return 3; }
52 52

	
53 53
int binc(int a, B) { return a+1; }
54 54

	
55 55
typedef ReadMap<A, double> DoubleMap;
56 56
typedef ReadWriteMap<A, double> DoubleWriteMap;
57 57
typedef ReferenceMap<A, double, double&, const double&> DoubleRefMap;
58 58

	
59 59
typedef ReadMap<A, bool> BoolMap;
60 60
typedef ReadWriteMap<A, bool> BoolWriteMap;
61 61
typedef ReferenceMap<A, bool, bool&, const bool&> BoolRefMap;
62 62

	
63 63
int main()
64 64
{
65 65
  // Map concepts
66 66
  checkConcept<ReadMap<A,B>, ReadMap<A,B> >();
67 67
  checkConcept<ReadMap<A,C>, ReadMap<A,C> >();
68 68
  checkConcept<WriteMap<A,B>, WriteMap<A,B> >();
69 69
  checkConcept<WriteMap<A,C>, WriteMap<A,C> >();
70 70
  checkConcept<ReadWriteMap<A,B>, ReadWriteMap<A,B> >();
71 71
  checkConcept<ReadWriteMap<A,C>, ReadWriteMap<A,C> >();
72 72
  checkConcept<ReferenceMap<A,B,B&,const B&>, ReferenceMap<A,B,B&,const B&> >();
73 73
  checkConcept<ReferenceMap<A,C,C&,const C&>, ReferenceMap<A,C,C&,const C&> >();
74 74

	
75 75
  // NullMap
76 76
  {
77 77
    checkConcept<ReadWriteMap<A,B>, NullMap<A,B> >();
78 78
    NullMap<A,B> map1;
79 79
    NullMap<A,B> map2 = map1;
80 80
    map1 = nullMap<A,B>();
81 81
  }
82 82

	
83 83
  // ConstMap
84 84
  {
85 85
    checkConcept<ReadWriteMap<A,B>, ConstMap<A,B> >();
86 86
    checkConcept<ReadWriteMap<A,C>, ConstMap<A,C> >();
87 87
    ConstMap<A,B> map1;
88 88
    ConstMap<A,B> map2 = B();
89 89
    ConstMap<A,B> map3 = map1;
90 90
    map1 = constMap<A>(B());
91 91
    map1 = constMap<A,B>();
92 92
    map1.setAll(B());
93 93
    ConstMap<A,C> map4(C(1));
94 94
    ConstMap<A,C> map5 = map4;
95 95
    map4 = constMap<A>(C(2));
96 96
    map4.setAll(C(3));
97 97

	
98 98
    checkConcept<ReadWriteMap<A,int>, ConstMap<A,int> >();
99 99
    check(constMap<A>(10)[A()] == 10, "Something is wrong with ConstMap");
100 100

	
101 101
    checkConcept<ReadWriteMap<A,int>, ConstMap<A,Const<int,10> > >();
102 102
    ConstMap<A,Const<int,10> > map6;
103 103
    ConstMap<A,Const<int,10> > map7 = map6;
104 104
    map6 = constMap<A,int,10>();
105 105
    map7 = constMap<A,Const<int,10> >();
106 106
    check(map6[A()] == 10 && map7[A()] == 10, "Something is wrong with ConstMap");
107 107
  }
108 108

	
109 109
  // IdentityMap
110 110
  {
111 111
    checkConcept<ReadMap<A,A>, IdentityMap<A> >();
112 112
    IdentityMap<A> map1;
113 113
    IdentityMap<A> map2 = map1;
114 114
    map1 = identityMap<A>();
115 115

	
116 116
    checkConcept<ReadMap<double,double>, IdentityMap<double> >();
117 117
    check(identityMap<double>()[1.0] == 1.0 && identityMap<double>()[3.14] == 3.14,
118 118
          "Something is wrong with IdentityMap");
119 119
  }
120 120

	
121 121
  // RangeMap
122 122
  {
123 123
    checkConcept<ReferenceMap<int,B,B&,const B&>, RangeMap<B> >();
124 124
    RangeMap<B> map1;
125 125
    RangeMap<B> map2(10);
126 126
    RangeMap<B> map3(10,B());
127 127
    RangeMap<B> map4 = map1;
128 128
    RangeMap<B> map5 = rangeMap<B>();
129 129
    RangeMap<B> map6 = rangeMap<B>(10);
130 130
    RangeMap<B> map7 = rangeMap(10,B());
131 131

	
132 132
    checkConcept< ReferenceMap<int, double, double&, const double&>,
133 133
                  RangeMap<double> >();
134 134
    std::vector<double> v(10, 0);
135 135
    v[5] = 100;
136 136
    RangeMap<double> map8(v);
137 137
    RangeMap<double> map9 = rangeMap(v);
138 138
    check(map9.size() == 10 && map9[2] == 0 && map9[5] == 100,
139 139
          "Something is wrong with RangeMap");
140 140
  }
141 141

	
142 142
  // SparseMap
143 143
  {
144 144
    checkConcept<ReferenceMap<A,B,B&,const B&>, SparseMap<A,B> >();
145 145
    SparseMap<A,B> map1;
146 146
    SparseMap<A,B> map2 = B();
147 147
    SparseMap<A,B> map3 = sparseMap<A,B>();
148 148
    SparseMap<A,B> map4 = sparseMap<A>(B());
149 149

	
150 150
    checkConcept< ReferenceMap<double, int, int&, const int&>,
151 151
                  SparseMap<double, int> >();
152 152
    std::map<double, int> m;
153 153
    SparseMap<double, int> map5(m);
154 154
    SparseMap<double, int> map6(m,10);
155 155
    SparseMap<double, int> map7 = sparseMap(m);
156 156
    SparseMap<double, int> map8 = sparseMap(m,10);
157 157

	
158 158
    check(map5[1.0] == 0 && map5[3.14] == 0 && map6[1.0] == 10 && map6[3.14] == 10,
159 159
          "Something is wrong with SparseMap");
160 160
    map5[1.0] = map6[3.14] = 100;
161 161
    check(map5[1.0] == 100 && map5[3.14] == 0 && map6[1.0] == 10 && map6[3.14] == 100,
162 162
          "Something is wrong with SparseMap");
163 163
  }
164 164

	
165 165
  // ComposeMap
166 166
  {
167 167
    typedef ComposeMap<DoubleMap, ReadMap<B,A> > CompMap;
168 168
    checkConcept<ReadMap<B,double>, CompMap>();
169 169
    CompMap map1(DoubleMap(),ReadMap<B,A>());
170 170
    CompMap map2 = composeMap(DoubleMap(), ReadMap<B,A>());
171 171

	
172 172
    SparseMap<double, bool> m1(false); m1[3.14] = true;
173 173
    RangeMap<double> m2(2); m2[0] = 3.0; m2[1] = 3.14;
174 174
    check(!composeMap(m1,m2)[0] && composeMap(m1,m2)[1], "Something is wrong with ComposeMap")
175 175
  }
176 176

	
177 177
  // CombineMap
178 178
  {
179 179
    typedef CombineMap<DoubleMap, DoubleMap, std::plus<double> > CombMap;
180 180
    checkConcept<ReadMap<A,double>, CombMap>();
181 181
    CombMap map1(DoubleMap(), DoubleMap());
182 182
    CombMap map2 = combineMap(DoubleMap(), DoubleMap(), std::plus<double>());
183 183

	
184 184
    check(combineMap(constMap<B,int,2>(), identityMap<B>(), &binc)[B()] == 3,
185 185
          "Something is wrong with CombineMap");
186 186
  }
187 187

	
188 188
  // FunctorToMap, MapToFunctor
189 189
  {
190 190
    checkConcept<ReadMap<A,B>, FunctorToMap<F,A,B> >();
191 191
    checkConcept<ReadMap<A,B>, FunctorToMap<F> >();
192 192
    FunctorToMap<F> map1;
193 193
    FunctorToMap<F> map2(F());
194 194
    B b = functorToMap(F())[A()];
195 195

	
196 196
    checkConcept<ReadMap<A,B>, MapToFunctor<ReadMap<A,B> > >();
197 197
    MapToFunctor<ReadMap<A,B> > map(ReadMap<A,B>());
198 198

	
199 199
    check(functorToMap(&func)[A()] == 3, "Something is wrong with FunctorToMap");
200 200
    check(mapToFunctor(constMap<A,int>(2))(A()) == 2, "Something is wrong with MapToFunctor");
201 201
    check(mapToFunctor(functorToMap(&func))(A()) == 3 && mapToFunctor(functorToMap(&func))[A()] == 3,
202 202
          "Something is wrong with FunctorToMap or MapToFunctor");
203 203
    check(functorToMap(mapToFunctor(constMap<A,int>(2)))[A()] == 2,
204 204
          "Something is wrong with FunctorToMap or MapToFunctor");
205 205
  }
206 206

	
207 207
  // ConvertMap
208 208
  {
209 209
    checkConcept<ReadMap<double,double>, ConvertMap<ReadMap<double, int>, double> >();
210 210
    ConvertMap<RangeMap<bool>, int> map1(rangeMap(1, true));
211 211
    ConvertMap<RangeMap<bool>, int> map2 = convertMap<int>(rangeMap(2, false));
212 212
  }
213 213

	
214 214
  // ForkMap
215 215
  {
216 216
    checkConcept<DoubleWriteMap, ForkMap<DoubleWriteMap, DoubleWriteMap> >();
217 217

	
218 218
    typedef RangeMap<double> RM;
219 219
    typedef SparseMap<int, double> SM;
220 220
    RM m1(10, -1);
221 221
    SM m2(-1);
222 222
    checkConcept<ReadWriteMap<int, double>, ForkMap<RM, SM> >();
223 223
    checkConcept<ReadWriteMap<int, double>, ForkMap<SM, RM> >();
224 224
    ForkMap<RM, SM> map1(m1,m2);
225 225
    ForkMap<SM, RM> map2 = forkMap(m2,m1);
226 226
    map2.set(5, 10);
227 227
    check(m1[1] == -1 && m1[5] == 10 && m2[1] == -1 && m2[5] == 10 && map2[1] == -1 && map2[5] == 10,
228 228
          "Something is wrong with ForkMap");
229 229
  }
230 230

	
231 231
  // Arithmetic maps:
232 232
  // - AddMap, SubMap, MulMap, DivMap
233 233
  // - ShiftMap, ShiftWriteMap, ScaleMap, ScaleWriteMap
234 234
  // - NegMap, NegWriteMap, AbsMap
235 235
  {
236 236
    checkConcept<DoubleMap, AddMap<DoubleMap,DoubleMap> >();
237 237
    checkConcept<DoubleMap, SubMap<DoubleMap,DoubleMap> >();
238 238
    checkConcept<DoubleMap, MulMap<DoubleMap,DoubleMap> >();
239 239
    checkConcept<DoubleMap, DivMap<DoubleMap,DoubleMap> >();
240 240

	
241 241
    ConstMap<int, double> c1(1.0), c2(3.14);
242 242
    IdentityMap<int> im;
243 243
    ConvertMap<IdentityMap<int>, double> id(im);
244 244
    check(addMap(c1,id)[0] == 1.0  && addMap(c1,id)[10] == 11.0, "Something is wrong with AddMap");
245 245
    check(subMap(id,c1)[0] == -1.0 && subMap(id,c1)[10] == 9.0,  "Something is wrong with SubMap");
246 246
    check(mulMap(id,c2)[0] == 0    && mulMap(id,c2)[2]  == 6.28, "Something is wrong with MulMap");
247 247
    check(divMap(c2,id)[1] == 3.14 && divMap(c2,id)[2]  == 1.57, "Something is wrong with DivMap");
248 248

	
249 249
    checkConcept<DoubleMap, ShiftMap<DoubleMap> >();
250 250
    checkConcept<DoubleWriteMap, ShiftWriteMap<DoubleWriteMap> >();
251 251
    checkConcept<DoubleMap, ScaleMap<DoubleMap> >();
252 252
    checkConcept<DoubleWriteMap, ScaleWriteMap<DoubleWriteMap> >();
253 253
    checkConcept<DoubleMap, NegMap<DoubleMap> >();
254 254
    checkConcept<DoubleWriteMap, NegWriteMap<DoubleWriteMap> >();
255 255
    checkConcept<DoubleMap, AbsMap<DoubleMap> >();
256 256

	
257 257
    check(shiftMap(id, 2.0)[1] == 3.0 && shiftMap(id, 2.0)[10] == 12.0,
258 258
          "Something is wrong with ShiftMap");
259 259
    check(shiftWriteMap(id, 2.0)[1] == 3.0 && shiftWriteMap(id, 2.0)[10] == 12.0,
260 260
          "Something is wrong with ShiftWriteMap");
261 261
    check(scaleMap(id, 2.0)[1] == 2.0 && scaleMap(id, 2.0)[10] == 20.0,
262 262
          "Something is wrong with ScaleMap");
263 263
    check(scaleWriteMap(id, 2.0)[1] == 2.0 && scaleWriteMap(id, 2.0)[10] == 20.0,
264 264
          "Something is wrong with ScaleWriteMap");
265 265
    check(negMap(id)[1] == -1.0 && negMap(id)[-10] == 10.0,
266 266
          "Something is wrong with NegMap");
267 267
    check(negWriteMap(id)[1] == -1.0 && negWriteMap(id)[-10] == 10.0,
268 268
          "Something is wrong with NegWriteMap");
269 269
    check(absMap(id)[1] == 1.0 && absMap(id)[-10] == 10.0,
270 270
          "Something is wrong with AbsMap");
271 271
  }
272 272

	
273 273
  // Logical maps:
274 274
  // - TrueMap, FalseMap
275 275
  // - AndMap, OrMap
276 276
  // - NotMap, NotWriteMap
277 277
  // - EqualMap, LessMap
278 278
  {
279 279
    checkConcept<BoolMap, TrueMap<A> >();
280 280
    checkConcept<BoolMap, FalseMap<A> >();
281 281
    checkConcept<BoolMap, AndMap<BoolMap,BoolMap> >();
282 282
    checkConcept<BoolMap, OrMap<BoolMap,BoolMap> >();
283 283
    checkConcept<BoolMap, NotMap<BoolMap> >();
284 284
    checkConcept<BoolWriteMap, NotWriteMap<BoolWriteMap> >();
285 285
    checkConcept<BoolMap, EqualMap<DoubleMap,DoubleMap> >();
286 286
    checkConcept<BoolMap, LessMap<DoubleMap,DoubleMap> >();
287 287

	
288 288
    TrueMap<int> tm;
289 289
    FalseMap<int> fm;
290 290
    RangeMap<bool> rm(2);
291 291
    rm[0] = true; rm[1] = false;
292 292
    check(andMap(tm,rm)[0] && !andMap(tm,rm)[1] && !andMap(fm,rm)[0] && !andMap(fm,rm)[1],
293 293
          "Something is wrong with AndMap");
294 294
    check(orMap(tm,rm)[0] && orMap(tm,rm)[1] && orMap(fm,rm)[0] && !orMap(fm,rm)[1],
295 295
          "Something is wrong with OrMap");
296 296
    check(!notMap(rm)[0] && notMap(rm)[1], "Something is wrong with NotMap");
297 297
    check(!notWriteMap(rm)[0] && notWriteMap(rm)[1], "Something is wrong with NotWriteMap");
298 298

	
299 299
    ConstMap<int, double> cm(2.0);
300 300
    IdentityMap<int> im;
301 301
    ConvertMap<IdentityMap<int>, double> id(im);
302 302
    check(lessMap(id,cm)[1] && !lessMap(id,cm)[2] && !lessMap(id,cm)[3],
303 303
          "Something is wrong with LessMap");
304 304
    check(!equalMap(id,cm)[1] && equalMap(id,cm)[2] && !equalMap(id,cm)[3],
305 305
          "Something is wrong with EqualMap");
306 306
  }
307
  
308
  // StoreBoolMap
309
  {
310
    typedef std::vector<int> vec;
311
    vec v1;
312
    vec v2(10);
313
    StoreBoolMap<std::back_insert_iterator<vec> > map1(std::back_inserter(v1));
314
    StoreBoolMap<vec::iterator> map2(v2.begin());
315
    map1.set(10, false);
316
    map1.set(20, true);   map2.set(20, true);
317
    map1.set(30, false);  map2.set(40, false);
318
    map1.set(50, true);   map2.set(50, true);
319
    map1.set(60, true);   map2.set(60, true);
320
    check(v1.size() == 3 && v2.size() == 10 &&
321
          v1[0]==20 && v1[1]==50 && v1[2]==60 && v2[0]==20 && v2[1]==50 && v2[2]==60,
322
          "Something is wrong with StoreBoolMap");
323
          
324
    int i = 0;
325
    for ( StoreBoolMap<vec::iterator>::Iterator it = map2.begin();
326
          it != map2.end(); ++it )
327
      check(v1[i++] == *it, "Something is wrong with StoreBoolMap");
328
  }
307 329

	
308 330
  return 0;
309 331
}
0 comments (0 inline)