|
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>
|
@@ -1658,6 +1659,54 @@ TEST(STLExtrasTest, Accumulate) {
|
1658 | 1659 | EXPECT_EQ(accumulate(V1, 10), std::accumulate(V1.begin(), V1.end(), 10));
|
1659 | 1660 | EXPECT_EQ(accumulate(drop_begin(V1), 7),
|
1660 | 1661 | std::accumulate(V1.begin() + 1, V1.end(), 7));
|
| 1662 | + |
| 1663 | + EXPECT_EQ(accumulate(V1, 2, std::multiplies<>{}), 240); |
| 1664 | +} |
| 1665 | + |
| 1666 | +TEST(STLExtrasTest, SumOf) { |
| 1667 | + EXPECT_EQ(sum_of(std::vector<int>()), 0); |
| 1668 | + EXPECT_EQ(sum_of(std::vector<int>(), 1), 1); |
| 1669 | + std::vector<int> V1 = {1, 2, 3, 4, 5}; |
| 1670 | + static_assert(std::is_same_v<decltype(sum_of(V1)), int>); |
| 1671 | + static_assert(std::is_same_v<decltype(sum_of(V1, 1)), int>); |
| 1672 | + EXPECT_EQ(sum_of(V1), 15); |
| 1673 | + EXPECT_EQ(sum_of(V1, 1), 16); |
| 1674 | + |
| 1675 | + std::vector<float> V2 = {1.0f, 2.0f, 4.0f}; |
| 1676 | + static_assert(std::is_same_v<decltype(sum_of(V2)), float>); |
| 1677 | + static_assert(std::is_same_v<decltype(sum_of(V2), 1.0f), float>); |
| 1678 | + static_assert(std::is_same_v<decltype(sum_of(V2), 1.0), double>); |
| 1679 | + EXPECT_EQ(sum_of(V2), 7.0f); |
| 1680 | + EXPECT_EQ(sum_of(V2, 1.0f), 8.0f); |
| 1681 | + |
| 1682 | + // Make sure that for a const argument the return value is non-const. |
| 1683 | + const std::vector<float> V3 = {1.0f, 2.0f}; |
| 1684 | + static_assert(std::is_same_v<decltype(sum_of(V3)), float>); |
| 1685 | + EXPECT_EQ(sum_of(V3), 3.0f); |
| 1686 | +} |
| 1687 | + |
| 1688 | +TEST(STLExtrasTest, ProductOf) { |
| 1689 | + EXPECT_EQ(product_of(std::vector<int>()), 1); |
| 1690 | + EXPECT_EQ(product_of(std::vector<int>(), 0), 0); |
| 1691 | + EXPECT_EQ(product_of(std::vector<int>(), 1), 1); |
| 1692 | + std::vector<int> V1 = {1, 2, 3, 4, 5}; |
| 1693 | + static_assert(std::is_same_v<decltype(product_of(V1)), int>); |
| 1694 | + static_assert(std::is_same_v<decltype(product_of(V1, 1)), int>); |
| 1695 | + EXPECT_EQ(product_of(V1), 120); |
| 1696 | + EXPECT_EQ(product_of(V1, 1), 120); |
| 1697 | + EXPECT_EQ(product_of(V1, 2), 240); |
| 1698 | + |
| 1699 | + std::vector<float> V2 = {1.0f, 2.0f, 4.0f}; |
| 1700 | + static_assert(std::is_same_v<decltype(product_of(V2)), float>); |
| 1701 | + static_assert(std::is_same_v<decltype(product_of(V2), 1.0f), float>); |
| 1702 | + static_assert(std::is_same_v<decltype(product_of(V2), 1.0), double>); |
| 1703 | + EXPECT_EQ(product_of(V2), 8.0f); |
| 1704 | + EXPECT_EQ(product_of(V2, 4.0f), 32.0f); |
| 1705 | + |
| 1706 | + // Make sure that for a const argument the return value is non-const. |
| 1707 | + const std::vector<float> V3 = {1.0f, 2.0f}; |
| 1708 | + static_assert(std::is_same_v<decltype(product_of(V3)), float>); |
| 1709 | + EXPECT_EQ(product_of(V3), 2.0f); |
1661 | 1710 | }
|
1662 | 1711 |
|
1663 | 1712 | struct Foo;
|
|
0 commit comments