CrackMe.apk
Download file
package com.google.common.collect;
import com.google.common.base.Function;
import com.google.common.base.Preconditions;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Iterator;
import java.util.Queue;
import javax.annotation.CheckForNull;
@ElementTypesAreNonnullByDefault
@Deprecated
public abstract class TreeTraverser<T> {
public abstract Iterable<T> children(T t);
@Deprecated
public static <T> TreeTraverser<T> using(final Function<T, ? extends Iterable<T>> function) {
Preconditions.checkNotNull(function);
return new TreeTraverser<T>() {
public Iterable<T> children(T t) {
return (Iterable) Function.this.apply(t);
}
};
}
@Deprecated
public final FluentIterable<T> preOrderTraversal(final T t) {
Preconditions.checkNotNull(t);
return new FluentIterable<T>() {
public UnmodifiableIterator<T> iterator() {
return TreeTraverser.this.preOrderIterator(t);
}
};
}
/* access modifiers changed from: package-private */
public UnmodifiableIterator<T> preOrderIterator(T t) {
return new PreOrderIterator(t);
}
private final class PreOrderIterator extends UnmodifiableIterator<T> {
private final Deque<Iterator<T>> stack;
PreOrderIterator(T t) {
ArrayDeque arrayDeque = new ArrayDeque();
this.stack = arrayDeque;
arrayDeque.addLast(Iterators.singletonIterator(Preconditions.checkNotNull(t)));
}
public boolean hasNext() {
return !this.stack.isEmpty();
}
public T next() {
Iterator last = this.stack.getLast();
T checkNotNull = Preconditions.checkNotNull(last.next());
if (!last.hasNext()) {
this.stack.removeLast();
}
Iterator it = TreeTraverser.this.children(checkNotNull).iterator();
if (it.hasNext()) {
this.stack.addLast(it);
}
return checkNotNull;
}
}
@Deprecated
public final FluentIterable<T> postOrderTraversal(final T t) {
Preconditions.checkNotNull(t);
return new FluentIterable<T>() {
public UnmodifiableIterator<T> iterator() {
return TreeTraverser.this.postOrderIterator(t);
}
};
}
/* access modifiers changed from: package-private */
public UnmodifiableIterator<T> postOrderIterator(T t) {
return new PostOrderIterator(t);
}
private static final class PostOrderNode<T> {
final Iterator<T> childIterator;
final T root;
PostOrderNode(T t, Iterator<T> it) {
this.root = Preconditions.checkNotNull(t);
this.childIterator = (Iterator) Preconditions.checkNotNull(it);
}
}
private final class PostOrderIterator extends AbstractIterator<T> {
private final ArrayDeque<PostOrderNode<T>> stack;
PostOrderIterator(T t) {
ArrayDeque<PostOrderNode<T>> arrayDeque = new ArrayDeque<>();
this.stack = arrayDeque;
arrayDeque.addLast(expand(t));
}
/* access modifiers changed from: protected */
@CheckForNull
public T computeNext() {
while (!this.stack.isEmpty()) {
PostOrderNode last = this.stack.getLast();
if (last.childIterator.hasNext()) {
this.stack.addLast(expand(last.childIterator.next()));
} else {
this.stack.removeLast();
return last.root;
}
}
return endOfData();
}
private PostOrderNode<T> expand(T t) {
return new PostOrderNode<>(t, TreeTraverser.this.children(t).iterator());
}
}
@Deprecated
public final FluentIterable<T> breadthFirstTraversal(final T t) {
Preconditions.checkNotNull(t);
return new FluentIterable<T>() {
public UnmodifiableIterator<T> iterator() {
return new BreadthFirstIterator(t);
}
};
}
private final class BreadthFirstIterator extends UnmodifiableIterator<T> implements PeekingIterator<T> {
private final Queue<T> queue;
BreadthFirstIterator(T t) {
ArrayDeque arrayDeque = new ArrayDeque();
this.queue = arrayDeque;
arrayDeque.add(t);
}
public boolean hasNext() {
return !this.queue.isEmpty();
}
public T peek() {
return this.queue.element();
}
public T next() {
T remove = this.queue.remove();
Iterables.addAll(this.queue, TreeTraverser.this.children(remove));
return remove;
}
}
}
Download file