package sk.stuba.fiit.perconik.core.java.dom; import javax.annotation.Nullable; import com.google.common.base.Predicate; import org.eclipse.jdt.core.dom.ASTNode; import sk.stuba.fiit.perconik.utilities.function.Numerate; import static com.google.common.base.Preconditions.checkNotNull; public final class NodeFilteringCounter<N extends ASTNode> implements Numerate<N> { final Predicate<ASTNode> filter; NodeFilteringCounter(final Predicate<ASTNode> filter) { this.filter = checkNotNull(filter); } public static <N extends ASTNode> NodeFilteringCounter<N> using(final Predicate<ASTNode> filter) { return new NodeFilteringCounter<>(filter); } public int apply(final N node) { return new Processor().perform(node); } private final class Processor extends AbstractCountingVisitor<N> { Processor() {} @Override public void preVisit(final ASTNode node) { if (NodeFilteringCounter.this.filter.apply(node)) { this.count ++; } } } @Override public boolean equals(@Nullable final Object o) { if (o instanceof NodeFilteringCounter) { NodeFilteringCounter<?> other = (NodeFilteringCounter<?>) o; return this.filter.equals(other.filter); } return false; } @Override public int hashCode() { return this.filter.hashCode(); } @Override public String toString() { return "counter(" + this.filter + ")"; } }