From 45da0d41c0d5c14e2c9b3a1c015e10a1db0b898e Mon Sep 17 00:00:00 2001 From: Duncan Horn Date: Wed, 29 Jul 2020 10:58:27 -0700 Subject: [PATCH] Make vector work again --- strings/base_collections_base.h | 8 +++-- .../UnitTests/single_threaded_vector.cpp | 30 +++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/strings/base_collections_base.h b/strings/base_collections_base.h index a405cffdd..b2d58f602 100644 --- a/strings/base_collections_base.h +++ b/strings/base_collections_base.h @@ -60,7 +60,8 @@ namespace winrt::impl struct removed_value { // Trivially destructible; okay to run destructor under lock - void assign(T&) {} + template + void assign(U&&) {} }; template @@ -68,7 +69,8 @@ namespace winrt::impl { std::optional m_value; - void assign(T& value) + template + void assign(U&& value) { m_value.emplace(std::move(value)); } @@ -313,7 +315,7 @@ WINRT_EXPORT namespace winrt } this->increment_version(); - auto& pos = static_cast(*this).get_container()[index]; + auto&& pos = static_cast(*this).get_container()[index]; oldValue.assign(pos); pos = static_cast(*this).wrap_value(value); } diff --git a/test/old_tests/UnitTests/single_threaded_vector.cpp b/test/old_tests/UnitTests/single_threaded_vector.cpp index 736ecb51e..fc2594d46 100644 --- a/test/old_tests/UnitTests/single_threaded_vector.cpp +++ b/test/old_tests/UnitTests/single_threaded_vector.cpp @@ -110,3 +110,33 @@ TEST_CASE("test_single_threaded_vector") test_vector(single_threaded_vector()); test_vector(single_threaded_observable_vector()); } + +TEST_CASE("single_threaded_vector of bool") +{ + auto values = single_threaded_vector(); + values.Append(true); + values.ReplaceAll({ false, true, false, true }); + values.InsertAt(1, false); + values.SetAt(2, false); + REQUIRE(values.Size() == 5); + REQUIRE(!values.GetAt(0)); + uint32_t index; + REQUIRE((values.IndexOf(true, index) && (index == 4))); + + auto itr = values.First(); + REQUIRE(itr.HasCurrent()); + REQUIRE(!itr.Current()); + REQUIRE(itr.MoveNext()); + REQUIRE(itr.MoveNext()); + bool temp[5]; + REQUIRE(itr.GetMany(temp) == 3); + REQUIRE((!temp[0] && !temp[1] && temp[2])); + + values.RemoveAt(0); + values.RemoveAtEnd(); + REQUIRE(values.Size() == 3); + REQUIRE(values.GetMany(0, temp) == 3); + REQUIRE((!temp[0] && !temp[1] && !temp[2])); + values.Clear(); + REQUIRE(values.Size() == 0); +}