From 44f28c5ceafafd88b68de6fe2c05fac332ff3c33 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Mon, 17 Aug 2026 14:02:08 +0200 Subject: kstd: implement erase_if for flat map --- libs/kstd/kstd/flat_map.hpp | 23 +++++++++++++++++++++++ libs/kstd/kstd/flat_map.tests.cpp | 31 +++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) (limited to 'libs') diff --git a/libs/kstd/kstd/flat_map.hpp b/libs/kstd/kstd/flat_map.hpp index f3cf827a..e140f7dd 100644 --- a/libs/kstd/kstd/flat_map.hpp +++ b/libs/kstd/kstd/flat_map.hpp @@ -1121,6 +1121,13 @@ namespace kstd key_compare m_comparator; }; + template + constexpr auto friend erase_if( + flat_map & map, + Predicate predicate) + -> flat_map::size_type; + constexpr auto do_sort() -> void { auto zipped = std::views::zip(m_containers.keys, m_containers.values); @@ -1161,6 +1168,22 @@ namespace kstd -> flat_map; + template + constexpr auto erase_if(flat_map & map, + Predicate predicate) + -> flat_map::size_type + { + auto zipped = std::views::zip(map.m_containers.keys, map.m_containers.values); + auto removed = std::ranges::remove_if(zipped, predicate, [](auto const & e) { + return + typename flat_map::const_reference{e}; + }); + auto count = removed.size(); + map.erase(map.end() - count, map.end()); + return count; + } + } // namespace kstd #endif \ No newline at end of file diff --git a/libs/kstd/kstd/flat_map.tests.cpp b/libs/kstd/kstd/flat_map.tests.cpp index 59b5fb99..1c16b5a3 100644 --- a/libs/kstd/kstd/flat_map.tests.cpp +++ b/libs/kstd/kstd/flat_map.tests.cpp @@ -388,6 +388,37 @@ SCENARIO("Flat Map modifiers", "[flat_map]") REQUIRE(map.size() == old_size); } } + + WHEN("erasing a single element by predicate") + { + auto count = erase_if(map, [](auto const & v) { return v.first == 'b'; }); + + THEN("one element is removed") + { + REQUIRE(count == 1); + REQUIRE_FALSE(map.contains('b')); + } + + THEN("the size is reduced") + { + REQUIRE(map.size() < old_size); + } + } + + WHEN("erasing multiple elements by predicate") + { + auto count = erase_if(map, [](auto const & v) { return v.first == 'b' || v.first == 'f'; }); + + THEN("two elements are removed") + { + REQUIRE(count == 2); + } + + THEN("the size is reduced") + { + REQUIRE(map.size() < old_size); + } + } } } -- cgit v1.2.3