From f29422f745a534d09cb0917a8587639ac5b08e10 Mon Sep 17 00:00:00 2001 From: Jannis Harder Date: Thu, 11 Apr 2024 13:47:14 +0200 Subject: [PATCH] topo_scc: Add sources_first option --- kernel/topo_scc.h | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/kernel/topo_scc.h b/kernel/topo_scc.h index 0ae0e696b..89df8928a 100644 --- a/kernel/topo_scc.h +++ b/kernel/topo_scc.h @@ -194,7 +194,7 @@ public: }; template -void topo_sorted_sccs(G &graph, ComponentCallback component) +void topo_sorted_sccs(G &graph, ComponentCallback component, bool sources_first = false) { typedef typename G::node_enumerator node_enumerator; typedef typename G::successor_enumerator successor_enumerator; @@ -217,6 +217,23 @@ void topo_sorted_sccs(G &graph, ComponentCallback component) node_enumerator nodes = graph.enumerate_nodes(); + if (sources_first) { + while (!nodes.finished()) { + node_type node = nodes.next(); + successor_enumerator successors = graph.enumerate_successors(node); + if (successors.finished()) + { + graph.dfs_index(node) = next_index; + next_index++; + component_stack.push_back(node); + component(component_stack.data(), component_stack.data() + 1); + component_stack.clear(); + graph.dfs_index(node) = INT_MAX; + } + } + nodes = graph.enumerate_nodes(); + } + // iterate over all nodes to ensure we process the whole graph while (!nodes.finished()) { node_type node = nodes.next();