Skip to content

Commit

Permalink
topo_scc: Add sources_first option
Browse files Browse the repository at this point in the history
  • Loading branch information
jix committed Apr 11, 2024
1 parent 6e58712 commit 99164ec
Showing 1 changed file with 18 additions and 1 deletion.
19 changes: 18 additions & 1 deletion kernel/topo_scc.h
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ class IntGraph {
};

template<typename G, typename ComponentCallback>
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;
Expand All @@ -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();
Expand Down

0 comments on commit 99164ec

Please sign in to comment.