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 --- kernel/kernel/filesystem/devfs/filesystem.cpp | 6 +++--- kernel/kernel/filesystem/devfs/filesystem.hpp | 5 +---- libs/kstd/kstd/flat_map.hpp | 23 ++++++++++++++++++++ libs/kstd/kstd/flat_map.tests.cpp | 31 +++++++++++++++++++++++++++ 4 files changed, 58 insertions(+), 7 deletions(-) diff --git a/kernel/kernel/filesystem/devfs/filesystem.cpp b/kernel/kernel/filesystem/devfs/filesystem.cpp index c8447a2d..cdc3bd1c 100644 --- a/kernel/kernel/filesystem/devfs/filesystem.cpp +++ b/kernel/kernel/filesystem/devfs/filesystem.cpp @@ -11,10 +11,10 @@ #include +#include #include #include #include -#include #include #include @@ -50,7 +50,7 @@ namespace kernel::filesystem::devfs std::ranges::for_each(device_number_registry::get().all(), [&](auto const & numbered) { if (auto device = numbered.device.lock()) { - m_inodes.emplace_back(numbered.name, kstd::make_shared(device)); + m_inodes.emplace(numbered.name, kstd::make_shared(device)); } }); @@ -97,7 +97,7 @@ namespace kernel::filesystem::devfs { if (auto device = numbered.device.lock()) { - m_inodes.emplace_back(numbered.name, kstd::make_shared(device)); + m_inodes.emplace(numbered.name, kstd::make_shared(device)); } } diff --git a/kernel/kernel/filesystem/devfs/filesystem.hpp b/kernel/kernel/filesystem/devfs/filesystem.hpp index 8d2199e3..986dc27f 100644 --- a/kernel/kernel/filesystem/devfs/filesystem.hpp +++ b/kernel/kernel/filesystem/devfs/filesystem.hpp @@ -14,11 +14,9 @@ #include #include #include -#include #include #include -#include namespace kernel::filesystem::devfs { @@ -51,8 +49,7 @@ namespace kernel::filesystem::devfs auto on_device_numbered(device_number_registry::entry const & numbered) -> void override; auto on_device_unnumbered(device_number_registry::entry const & numbered) -> void override; - // TODO: change to flat_map again once flat_map supports erase. - kstd::vector>> m_inodes{}; + kstd::flat_map> m_inodes{}; }; } // namespace kernel::filesystem::devfs 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