|
13 | 13 | #include <util/string.h>
|
14 | 14 | #include <util/time.h>
|
15 | 15 | #include <util/spanparsing.h>
|
| 16 | +#include <util/vector.h> |
16 | 17 |
|
17 | 18 | #include <stdint.h>
|
18 | 19 | #include <thread>
|
@@ -1714,4 +1715,109 @@ BOOST_AUTO_TEST_CASE(test_LogEscapeMessage)
|
1714 | 1715 | BOOST_CHECK_EQUAL(BCLog::LogEscapeMessage(NUL), R"(O\x00O)");
|
1715 | 1716 | }
|
1716 | 1717 |
|
| 1718 | +namespace { |
| 1719 | + |
| 1720 | +struct Tracker |
| 1721 | +{ |
| 1722 | + //! Points to the original object (possibly itself) we moved/copied from |
| 1723 | + const Tracker* origin; |
| 1724 | + //! How many copies where involved between the original object and this one (moves are not counted) |
| 1725 | + int copies; |
| 1726 | + |
| 1727 | + Tracker() noexcept : origin(this), copies(0) {} |
| 1728 | + Tracker(const Tracker& t) noexcept : origin(t.origin), copies(t.copies + 1) {} |
| 1729 | + Tracker(Tracker&& t) noexcept : origin(t.origin), copies(t.copies) {} |
| 1730 | + Tracker& operator=(const Tracker& t) noexcept |
| 1731 | + { |
| 1732 | + origin = t.origin; |
| 1733 | + copies = t.copies + 1; |
| 1734 | + return *this; |
| 1735 | + } |
| 1736 | + Tracker& operator=(Tracker&& t) noexcept |
| 1737 | + { |
| 1738 | + origin = t.origin; |
| 1739 | + copies = t.copies; |
| 1740 | + return *this; |
| 1741 | + } |
| 1742 | +}; |
| 1743 | + |
| 1744 | +} |
| 1745 | + |
| 1746 | +BOOST_AUTO_TEST_CASE(test_tracked_vector) |
| 1747 | +{ |
| 1748 | + Tracker t1; |
| 1749 | + Tracker t2; |
| 1750 | + Tracker t3; |
| 1751 | + |
| 1752 | + BOOST_CHECK(t1.origin == &t1); |
| 1753 | + BOOST_CHECK(t2.origin == &t2); |
| 1754 | + BOOST_CHECK(t3.origin == &t3); |
| 1755 | + |
| 1756 | + auto v1 = Vector(t1); |
| 1757 | + BOOST_CHECK_EQUAL(v1.size(), 1); |
| 1758 | + BOOST_CHECK(v1[0].origin == &t1); |
| 1759 | + BOOST_CHECK_EQUAL(v1[0].copies, 1); |
| 1760 | + |
| 1761 | + auto v2 = Vector(std::move(t2)); |
| 1762 | + BOOST_CHECK_EQUAL(v2.size(), 1); |
| 1763 | + BOOST_CHECK(v2[0].origin == &t2); |
| 1764 | + BOOST_CHECK_EQUAL(v2[0].copies, 0); |
| 1765 | + |
| 1766 | + auto v3 = Vector(t1, std::move(t2)); |
| 1767 | + BOOST_CHECK_EQUAL(v3.size(), 2); |
| 1768 | + BOOST_CHECK(v3[0].origin == &t1); |
| 1769 | + BOOST_CHECK(v3[1].origin == &t2); |
| 1770 | + BOOST_CHECK_EQUAL(v3[0].copies, 1); |
| 1771 | + BOOST_CHECK_EQUAL(v3[1].copies, 0); |
| 1772 | + |
| 1773 | + auto v4 = Vector(std::move(v3[0]), v3[1], std::move(t3)); |
| 1774 | + BOOST_CHECK_EQUAL(v4.size(), 3); |
| 1775 | + BOOST_CHECK(v4[0].origin == &t1); |
| 1776 | + BOOST_CHECK(v4[1].origin == &t2); |
| 1777 | + BOOST_CHECK(v4[2].origin == &t3); |
| 1778 | + BOOST_CHECK_EQUAL(v4[0].copies, 1); |
| 1779 | + BOOST_CHECK_EQUAL(v4[1].copies, 1); |
| 1780 | + BOOST_CHECK_EQUAL(v4[2].copies, 0); |
| 1781 | + |
| 1782 | + auto v5 = Cat(v1, v4); |
| 1783 | + BOOST_CHECK_EQUAL(v5.size(), 4); |
| 1784 | + BOOST_CHECK(v5[0].origin == &t1); |
| 1785 | + BOOST_CHECK(v5[1].origin == &t1); |
| 1786 | + BOOST_CHECK(v5[2].origin == &t2); |
| 1787 | + BOOST_CHECK(v5[3].origin == &t3); |
| 1788 | + BOOST_CHECK_EQUAL(v5[0].copies, 2); |
| 1789 | + BOOST_CHECK_EQUAL(v5[1].copies, 2); |
| 1790 | + BOOST_CHECK_EQUAL(v5[2].copies, 2); |
| 1791 | + BOOST_CHECK_EQUAL(v5[3].copies, 1); |
| 1792 | + |
| 1793 | + auto v6 = Cat(std::move(v1), v3); |
| 1794 | + BOOST_CHECK_EQUAL(v6.size(), 3); |
| 1795 | + BOOST_CHECK(v6[0].origin == &t1); |
| 1796 | + BOOST_CHECK(v6[1].origin == &t1); |
| 1797 | + BOOST_CHECK(v6[2].origin == &t2); |
| 1798 | + BOOST_CHECK_EQUAL(v6[0].copies, 1); |
| 1799 | + BOOST_CHECK_EQUAL(v6[1].copies, 2); |
| 1800 | + BOOST_CHECK_EQUAL(v6[2].copies, 1); |
| 1801 | + |
| 1802 | + auto v7 = Cat(v2, std::move(v4)); |
| 1803 | + BOOST_CHECK_EQUAL(v7.size(), 4); |
| 1804 | + BOOST_CHECK(v7[0].origin == &t2); |
| 1805 | + BOOST_CHECK(v7[1].origin == &t1); |
| 1806 | + BOOST_CHECK(v7[2].origin == &t2); |
| 1807 | + BOOST_CHECK(v7[3].origin == &t3); |
| 1808 | + BOOST_CHECK_EQUAL(v7[0].copies, 1); |
| 1809 | + BOOST_CHECK_EQUAL(v7[1].copies, 1); |
| 1810 | + BOOST_CHECK_EQUAL(v7[2].copies, 1); |
| 1811 | + BOOST_CHECK_EQUAL(v7[3].copies, 0); |
| 1812 | + |
| 1813 | + auto v8 = Cat(std::move(v2), std::move(v3)); |
| 1814 | + BOOST_CHECK_EQUAL(v8.size(), 3); |
| 1815 | + BOOST_CHECK(v8[0].origin == &t2); |
| 1816 | + BOOST_CHECK(v8[1].origin == &t1); |
| 1817 | + BOOST_CHECK(v8[2].origin == &t2); |
| 1818 | + BOOST_CHECK_EQUAL(v8[0].copies, 0); |
| 1819 | + BOOST_CHECK_EQUAL(v8[1].copies, 1); |
| 1820 | + BOOST_CHECK_EQUAL(v8[2].copies, 0); |
| 1821 | +} |
| 1822 | + |
1717 | 1823 | BOOST_AUTO_TEST_SUITE_END()
|
0 commit comments