CrackMe.apk
Download file
package com.google.common.graph;
import com.google.common.base.Preconditions;
import java.util.Objects;
import javax.annotation.CheckForNull;
@ElementTypesAreNonnullByDefault
final class StandardMutableValueGraph<N, V> extends StandardValueGraph<N, V> implements MutableValueGraph<N, V> {
private final ElementOrder<N> incidentEdgeOrder;
StandardMutableValueGraph(AbstractGraphBuilder<? super N> abstractGraphBuilder) {
super(abstractGraphBuilder);
this.incidentEdgeOrder = abstractGraphBuilder.incidentEdgeOrder.cast();
}
public ElementOrder<N> incidentEdgeOrder() {
return this.incidentEdgeOrder;
}
public boolean addNode(N n) {
Preconditions.checkNotNull(n, "node");
if (containsNode(n)) {
return false;
}
addNodeInternal(n);
return true;
}
private GraphConnections<N, V> addNodeInternal(N n) {
GraphConnections<N, V> newConnections = newConnections();
Preconditions.checkState(this.nodeConnections.put(n, newConnections) == null);
return newConnections;
}
@CheckForNull
public V putEdgeValue(N n, N n2, V v) {
Preconditions.checkNotNull(n, "nodeU");
Preconditions.checkNotNull(n2, "nodeV");
Preconditions.checkNotNull(v, "value");
if (!allowsSelfLoops()) {
Preconditions.checkArgument(!n.equals(n2), "Cannot add self-loop edge on node %s, as self-loops are not allowed. To construct a graph that allows self-loops, call allowsSelfLoops(true) on the Builder.", (Object) n);
}
GraphConnections graphConnections = (GraphConnections) this.nodeConnections.get(n);
if (graphConnections == null) {
graphConnections = addNodeInternal(n);
}
V addSuccessor = graphConnections.addSuccessor(n2, v);
GraphConnections graphConnections2 = (GraphConnections) this.nodeConnections.get(n2);
if (graphConnections2 == null) {
graphConnections2 = addNodeInternal(n2);
}
graphConnections2.addPredecessor(n, v);
if (addSuccessor == null) {
long j = this.edgeCount + 1;
this.edgeCount = j;
Graphs.checkPositive(j);
}
return addSuccessor;
}
@CheckForNull
public V putEdgeValue(EndpointPair<N> endpointPair, V v) {
validateEndpoints(endpointPair);
return putEdgeValue(endpointPair.nodeU(), endpointPair.nodeV(), v);
}
public boolean removeNode(N n) {
Preconditions.checkNotNull(n, "node");
GraphConnections graphConnections = (GraphConnections) this.nodeConnections.get(n);
if (graphConnections == null) {
return false;
}
if (allowsSelfLoops() && graphConnections.removeSuccessor(n) != null) {
graphConnections.removePredecessor(n);
this.edgeCount--;
}
for (Object withoutCaching : graphConnections.successors()) {
GraphConnections graphConnections2 = (GraphConnections) this.nodeConnections.getWithoutCaching(withoutCaching);
Objects.requireNonNull(graphConnections2);
GraphConnections graphConnections3 = graphConnections2;
graphConnections2.removePredecessor(n);
this.edgeCount--;
}
if (isDirected()) {
for (Object withoutCaching2 : graphConnections.predecessors()) {
GraphConnections graphConnections4 = (GraphConnections) this.nodeConnections.getWithoutCaching(withoutCaching2);
Objects.requireNonNull(graphConnections4);
GraphConnections graphConnections5 = graphConnections4;
Preconditions.checkState(graphConnections4.removeSuccessor(n) != null);
this.edgeCount--;
}
}
this.nodeConnections.remove(n);
Graphs.checkNonNegative(this.edgeCount);
return true;
}
@CheckForNull
public V removeEdge(N n, N n2) {
Preconditions.checkNotNull(n, "nodeU");
Preconditions.checkNotNull(n2, "nodeV");
GraphConnections graphConnections = (GraphConnections) this.nodeConnections.get(n);
GraphConnections graphConnections2 = (GraphConnections) this.nodeConnections.get(n2);
if (graphConnections == null || graphConnections2 == null) {
return null;
}
V removeSuccessor = graphConnections.removeSuccessor(n2);
if (removeSuccessor != null) {
graphConnections2.removePredecessor(n);
long j = this.edgeCount - 1;
this.edgeCount = j;
Graphs.checkNonNegative(j);
}
return removeSuccessor;
}
@CheckForNull
public V removeEdge(EndpointPair<N> endpointPair) {
validateEndpoints(endpointPair);
return removeEdge(endpointPair.nodeU(), endpointPair.nodeV());
}
private GraphConnections<N, V> newConnections() {
if (isDirected()) {
return DirectedGraphConnections.of(this.incidentEdgeOrder);
}
return UndirectedGraphConnections.of(this.incidentEdgeOrder);
}
}
Download file