summaryrefslogtreecommitdiff
path: root/platform/core-impl/src/com/intellij/util/graph/impl/GraphAlgorithmsImpl.java
diff options
context:
space:
mode:
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.java39
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);
}
-
};
}