diff options
author | 2021-09-13 11:00:22 -0700 | |
---|---|---|
committer | 2021-09-26 19:31:26 -0700 | |
commit | 44828cecf86354ca3a18dfca8d0d5c110c86da48 (patch) | |
tree | 55d7c0e3a5cdb8421a213ac89a8e7e27d97f3aaa | |
parent | 4eecba7daea5100d69bf8c2d3efbbba222dc8cf5 (diff) |
FTL: Add clear() to containers
Bug: 185536303
Test: ftl_test
Change-Id: Icc13d1dcfdc006fd26a418e4904e5d2ce12724dd
-rw-r--r-- | include/ftl/small_map.h | 6 | ||||
-rw-r--r-- | include/ftl/small_vector.h | 19 | ||||
-rw-r--r-- | include/ftl/static_vector.h | 12 | ||||
-rw-r--r-- | libs/ftl/small_map_test.cpp | 17 | ||||
-rw-r--r-- | libs/ftl/small_vector_test.cpp | 30 | ||||
-rw-r--r-- | libs/ftl/static_vector_test.cpp | 15 |
6 files changed, 88 insertions, 11 deletions
diff --git a/include/ftl/small_map.h b/include/ftl/small_map.h index bcaba82934..988431a7e9 100644 --- a/include/ftl/small_map.h +++ b/include/ftl/small_map.h @@ -237,6 +237,12 @@ class SmallMap final { // bool erase(const key_type& key) { return erase(key, begin()); } + // Removes all mappings. + // + // All iterators are invalidated. + // + void clear() { map_.clear(); } + private: iterator find(const key_type& key, iterator first) { return std::find_if(first, end(), [&key](const auto& pair) { return pair.first == key; }); diff --git a/include/ftl/small_vector.h b/include/ftl/small_vector.h index 0341435813..65a953670d 100644 --- a/include/ftl/small_vector.h +++ b/include/ftl/small_vector.h @@ -151,8 +151,6 @@ class SmallVector final : ArrayTraits<T>, ArrayComparators<SmallVector> { DISPATCH(reference, back, noexcept) DISPATCH(const_reference, back, const) -#undef DISPATCH - reference operator[](size_type i) { return dynamic() ? std::get<Dynamic>(vector_)[i] : std::get<Static>(vector_)[i]; } @@ -214,13 +212,15 @@ class SmallVector final : ArrayTraits<T>, ArrayComparators<SmallVector> { // // The last() and end() iterators are invalidated. // - void pop_back() { - if (dynamic()) { - std::get<Dynamic>(vector_).pop_back(); - } else { - std::get<Static>(vector_).pop_back(); - } - } + DISPATCH(void, pop_back, noexcept) + + // Removes all elements. + // + // All iterators are invalidated. + // + DISPATCH(void, clear, noexcept) + +#undef DISPATCH // Erases an element, but does not preserve order. Rather than shifting subsequent elements, // this moves the last element to the slot of the erased element. @@ -345,6 +345,7 @@ class SmallVector<T, 0> final : ArrayTraits<T>, return true; } + using Impl::clear; using Impl::pop_back; void unstable_erase(iterator it) { diff --git a/include/ftl/static_vector.h b/include/ftl/static_vector.h index 96a1ae853d..cd7b92a758 100644 --- a/include/ftl/static_vector.h +++ b/include/ftl/static_vector.h @@ -189,8 +189,7 @@ class StaticVector final : ArrayTraits<T>, } StaticVector& operator=(StaticVector&& other) { - std::destroy(begin(), end()); - size_ = 0; + clear(); swap<true>(other); return *this; } @@ -280,6 +279,15 @@ class StaticVector final : ArrayTraits<T>, // void pop_back() { unstable_erase(last()); } + // Removes all elements. + // + // All iterators are invalidated. + // + void clear() { + std::destroy(begin(), end()); + size_ = 0; + } + // Erases an element, but does not preserve order. Rather than shifting subsequent elements, // this moves the last element to the slot of the erased element. // diff --git a/libs/ftl/small_map_test.cpp b/libs/ftl/small_map_test.cpp index 2e81022f38..c292108c46 100644 --- a/libs/ftl/small_map_test.cpp +++ b/libs/ftl/small_map_test.cpp @@ -345,4 +345,21 @@ TEST(SmallMap, Erase) { } } +TEST(SmallMap, Clear) { + SmallMap map = ftl::init::map(1, '1')(2, '2')(3, '3'); + + map.clear(); + + EXPECT_TRUE(map.empty()); + EXPECT_FALSE(map.dynamic()); + + map = ftl::init::map(1, '1')(2, '2')(3, '3'); + map.try_emplace(4, '4'); + + map.clear(); + + EXPECT_TRUE(map.empty()); + EXPECT_TRUE(map.dynamic()); +} + } // namespace android::test diff --git a/libs/ftl/small_vector_test.cpp b/libs/ftl/small_vector_test.cpp index 3a03e696d1..42374969f1 100644 --- a/libs/ftl/small_vector_test.cpp +++ b/libs/ftl/small_vector_test.cpp @@ -460,4 +460,34 @@ TEST(SmallVector, Destroy) { EXPECT_EQ(0, dead); } +TEST(SmallVector, Clear) { + int live = 0; + int dead = 0; + + SmallVector<DestroyCounts, 2> counts; + counts.emplace_back(live, dead); + counts.emplace_back(live, dead); + + counts.clear(); + + EXPECT_TRUE(counts.empty()); + EXPECT_FALSE(counts.dynamic()); + + EXPECT_EQ(2, live); + EXPECT_EQ(0, dead); + + live = 0; + counts.emplace_back(live, dead); + counts.emplace_back(live, dead); + counts.emplace_back(live, dead); + + counts.clear(); + + EXPECT_TRUE(counts.empty()); + EXPECT_TRUE(counts.dynamic()); + + EXPECT_EQ(3, live); + EXPECT_EQ(2, dead); +} + } // namespace android::test diff --git a/libs/ftl/static_vector_test.cpp b/libs/ftl/static_vector_test.cpp index cbe8dff527..2de3ad273e 100644 --- a/libs/ftl/static_vector_test.cpp +++ b/libs/ftl/static_vector_test.cpp @@ -396,4 +396,19 @@ TEST(StaticVector, Destroy) { EXPECT_EQ(0, dead); } +TEST(StaticVector, Clear) { + int live = 0; + int dead = 0; + + StaticVector<DestroyCounts, 5> counts; + counts.emplace_back(live, dead); + counts.emplace_back(live, dead); + + counts.clear(); + + EXPECT_TRUE(counts.empty()); + EXPECT_EQ(2, live); + EXPECT_EQ(0, dead); +} + } // namespace android::test |