|
14 | 14 | #include <array> |
15 | 15 | #include <climits> |
16 | 16 | #include <cstddef> |
| 17 | +#include <functional> |
17 | 18 | #include <initializer_list> |
18 | 19 | #include <iterator> |
19 | 20 | #include <list> |
@@ -1610,6 +1611,54 @@ TEST(STLExtrasTest, Accumulate) { |
1610 | 1611 | EXPECT_EQ(accumulate(V1, 10), std::accumulate(V1.begin(), V1.end(), 10)); |
1611 | 1612 | EXPECT_EQ(accumulate(drop_begin(V1), 7), |
1612 | 1613 | std::accumulate(V1.begin() + 1, V1.end(), 7)); |
| 1614 | + |
| 1615 | + EXPECT_EQ(accumulate(V1, 2, std::multiplies<>{}), 240); |
| 1616 | +} |
| 1617 | + |
| 1618 | +TEST(STLExtrasTest, SumOf) { |
| 1619 | + EXPECT_EQ(sum_of(std::vector<int>()), 0); |
| 1620 | + EXPECT_EQ(sum_of(std::vector<int>(), 1), 1); |
| 1621 | + std::vector<int> V1 = {1, 2, 3, 4, 5}; |
| 1622 | + static_assert(std::is_same_v<decltype(sum_of(V1)), int>); |
| 1623 | + static_assert(std::is_same_v<decltype(sum_of(V1, 1)), int>); |
| 1624 | + EXPECT_EQ(sum_of(V1), 15); |
| 1625 | + EXPECT_EQ(sum_of(V1, 1), 16); |
| 1626 | + |
| 1627 | + std::vector<float> V2 = {1.0f, 2.0f, 4.0f}; |
| 1628 | + static_assert(std::is_same_v<decltype(sum_of(V2)), float>); |
| 1629 | + static_assert(std::is_same_v<decltype(sum_of(V2), 1.0f), float>); |
| 1630 | + static_assert(std::is_same_v<decltype(sum_of(V2), 1.0), double>); |
| 1631 | + EXPECT_EQ(sum_of(V2), 7.0f); |
| 1632 | + EXPECT_EQ(sum_of(V2, 1.0f), 8.0f); |
| 1633 | + |
| 1634 | + // Make sure that for a const argument the return value is non-const. |
| 1635 | + const std::vector<float> V3 = {1.0f, 2.0f}; |
| 1636 | + static_assert(std::is_same_v<decltype(sum_of(V3)), float>); |
| 1637 | + EXPECT_EQ(sum_of(V3), 3.0f); |
| 1638 | +} |
| 1639 | + |
| 1640 | +TEST(STLExtrasTest, ProductOf) { |
| 1641 | + EXPECT_EQ(product_of(std::vector<int>()), 1); |
| 1642 | + EXPECT_EQ(product_of(std::vector<int>(), 0), 0); |
| 1643 | + EXPECT_EQ(product_of(std::vector<int>(), 1), 1); |
| 1644 | + std::vector<int> V1 = {1, 2, 3, 4, 5}; |
| 1645 | + static_assert(std::is_same_v<decltype(product_of(V1)), int>); |
| 1646 | + static_assert(std::is_same_v<decltype(product_of(V1, 1)), int>); |
| 1647 | + EXPECT_EQ(product_of(V1), 120); |
| 1648 | + EXPECT_EQ(product_of(V1, 1), 120); |
| 1649 | + EXPECT_EQ(product_of(V1, 2), 240); |
| 1650 | + |
| 1651 | + std::vector<float> V2 = {1.0f, 2.0f, 4.0f}; |
| 1652 | + static_assert(std::is_same_v<decltype(product_of(V2)), float>); |
| 1653 | + static_assert(std::is_same_v<decltype(product_of(V2), 1.0f), float>); |
| 1654 | + static_assert(std::is_same_v<decltype(product_of(V2), 1.0), double>); |
| 1655 | + EXPECT_EQ(product_of(V2), 8.0f); |
| 1656 | + EXPECT_EQ(product_of(V2, 4.0f), 32.0f); |
| 1657 | + |
| 1658 | + // Make sure that for a const argument the return value is non-const. |
| 1659 | + const std::vector<float> V3 = {1.0f, 2.0f}; |
| 1660 | + static_assert(std::is_same_v<decltype(product_of(V3)), float>); |
| 1661 | + EXPECT_EQ(product_of(V3), 2.0f); |
1613 | 1662 | } |
1614 | 1663 |
|
1615 | 1664 | struct Foo; |
|
0 commit comments