diff --git a/common/node_link_store.hh b/common/node_link_store.hh index 993ff0f..0d84f16 100644 --- a/common/node_link_store.hh +++ b/common/node_link_store.hh @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -65,6 +66,8 @@ class NodeLinkStore { inline std::unique_ptr CreateCommandToRemoveExpired( uint64_t id, std::span in, std::span out) noexcept; + inline std::unique_ptr CreateCommandToRemoveExpired( + const std::unordered_set& ids) noexcept; std::span items() const noexcept { return links_; } @@ -111,7 +114,19 @@ std::unique_ptr NodeLinkStore::CreateCommandToRemoveExpir const bool rm = (lk.src_id == id && std::find(out.begin(), out.end(), lk.src_name) == out.end()) || (lk.dst_id == id && std::find(in .begin(), in .end(), lk.dst_name) == in .end()); - if (rm) cmds.push_back(SwapCommand::CreateToRemove(*this, Link(lk))); + if (rm) cmds.push_back(SwapCommand::CreateToRemove(*this, Link {lk})); + } + if (cmds.empty()) return nullptr; + return std::make_unique(std::move(cmds)); +} + +std::unique_ptr NodeLinkStore::CreateCommandToRemoveExpired( + const std::unordered_set& ids) noexcept { + std::vector> cmds; + for (const auto& lk : links_) { + if (!ids.contains(lk.src_id) || !ids.contains(lk.dst_id)) { + cmds.push_back(SwapCommand::CreateToRemove(*this, Link {lk})); + } } if (cmds.empty()) return nullptr; return std::make_unique(std::move(cmds)); diff --git a/file/node_network.cc b/file/node_network.cc index 1be9af9..f473aaa 100644 --- a/file/node_network.cc +++ b/file/node_network.cc @@ -807,6 +807,9 @@ void Network::Sanitize() { cmd->Apply(); } } + if (auto cmd = links_.CreateCommandToRemoveExpired(ids)) { + cmd->Apply(); + } } File* Network::PreFind(std::string_view name) const noexcept try {