diff options
Diffstat (limited to 'platform/core-impl/src/com/intellij/util/graph/impl/GraphAlgorithmsImpl.java')
-rw-r--r-- | platform/core-impl/src/com/intellij/util/graph/impl/GraphAlgorithmsImpl.java | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/platform/core-impl/src/com/intellij/util/graph/impl/GraphAlgorithmsImpl.java b/platform/core-impl/src/com/intellij/util/graph/impl/GraphAlgorithmsImpl.java index 37d98c2300b2..01f3ca7e8521 100644 --- a/platform/core-impl/src/com/intellij/util/graph/impl/GraphAlgorithmsImpl.java +++ b/platform/core-impl/src/com/intellij/util/graph/impl/GraphAlgorithmsImpl.java @@ -3,13 +3,46 @@ package com.intellij.util.graph.impl; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.util.Chunk; +import com.intellij.util.containers.ContainerUtil; import com.intellij.util.graph.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.function.Consumer; public final class GraphAlgorithmsImpl extends GraphAlgorithms { + + @Override + public @NotNull <Node> Collection<Node> findNodesWhichBelongToAnyPathBetweenTwoNodes( + @NotNull Graph<Node> graph, + @NotNull Node start, + @NotNull Node finish + ) { + final Set<Node> reachableFromStart = new HashSet<>(); + final Set<Node> leadToFinish = new HashSet<>(); + + Dfs.performDfs(graph, start, reachableFromStart::add); + Dfs.performDfs(invertEdgeDirections(graph), finish, leadToFinish::add); + + return ContainerUtil.intersection(reachableFromStart, leadToFinish); + } + + @Override + public @NotNull <Node> Collection<Node> findNodeNeighbourhood( + @NotNull Graph<Node> graph, + @NotNull Node node, + int levelBound + ) { + final Set<Node> neighbourhood = new HashSet<>(); + Bfs.performBfs(graph, node, (neighbour, level) -> { + if (level <= levelBound) { + neighbourhood.add(neighbour); + } + }); + return neighbourhood; + } + @Nullable @Override public <Node> List<Node> findShortestPath(@NotNull InboundSemiGraph<Node> graph, @NotNull Node start, @NotNull Node finish) { @@ -29,6 +62,11 @@ public final class GraphAlgorithmsImpl extends GraphAlgorithms { return new CycleFinder<>(graph).getNodeCycles(node); } + @Override + public <Node> void iterateOverAllSimpleCycles(@NotNull Graph<Node> graph, @NotNull Consumer<List<Node>> cycleConsumer) { + new SimpleCyclesIterator<>(graph).iterateSimpleCycles(cycleConsumer); + } + @NotNull @Override public <Node> Graph<Node> invertEdgeDirections(@NotNull final Graph<Node> graph) { @@ -50,7 +88,6 @@ public final class GraphAlgorithmsImpl extends GraphAlgorithms { public Iterator<Node> getOut(final Node n) { return graph.getIn(n); } - }; } |