/* * Copyright (c) 2024, Dan Klishch * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include struct IndexAndValue { size_t index; int value; bool operator==(IndexAndValue const&) const = default; }; TEST_CASE(enumerate) { { Vector result; for (auto [i, value] : enumerate(Vector { 1, 2, 3, 4 })) { result.append({ i, value }); } EXPECT_EQ(result, (Vector { { 0, 1 }, { 1, 2 }, { 2, 3 }, { 3, 4 } })); } { Vector result; Vector values = { 9, 8, 7, 6 }; for (auto [i, value] : enumerate(values)) { static_assert(SameAs); result.append({ i, value }); value = static_cast(i); } EXPECT_EQ(result, (Vector { { 0, 9 }, { 1, 8 }, { 2, 7 }, { 3, 6 } })); EXPECT_EQ(values, (Vector { 0, 1, 2, 3 })); } { Vector result; Vector const& values = { 9, 8, 7, 6 }; for (auto [i, value] : enumerate(values)) { static_assert(SameAs); result.append({ i, value }); } EXPECT_EQ(result, (Vector { { 0, 9 }, { 1, 8 }, { 2, 7 }, { 3, 6 } })); } } class CopyCounter { public: static inline size_t copy_count = 0; CopyCounter() = default; CopyCounter(CopyCounter const&) { ++copy_count; } CopyCounter(CopyCounter&&) { } auto begin() const { return m_vec.begin(); } auto end() const { return m_vec.end(); } private: Vector m_vec { 1, 2, 3, 4 }; }; TEST_CASE(do_not_copy) { { Vector result; CopyCounter::copy_count = 0; CopyCounter counter {}; for (auto [i, value] : enumerate(counter)) result.append({ i, value }); EXPECT_EQ(result, (Vector { { 0, 1 }, { 1, 2 }, { 2, 3 }, { 3, 4 } })); EXPECT_EQ(CopyCounter::copy_count, 0uz); } { Vector result; CopyCounter::copy_count = 0; for (auto [i, value] : enumerate(CopyCounter {})) result.append({ i, value }); EXPECT_EQ(result, (Vector { { 0, 1 }, { 1, 2 }, { 2, 3 }, { 3, 4 } })); EXPECT_EQ(CopyCounter::copy_count, 0uz); } }