package org.inferred.freebuilder.processor.excerpt;
import static org.inferred.freebuilder.processor.util.StaticExcerpt.Type.TYPE;
import static org.inferred.freebuilder.processor.util.feature.FunctionPackage.FUNCTION_PACKAGE;
import com.google.common.collect.ImmutableSet;
import org.inferred.freebuilder.processor.util.ParameterizedType;
import org.inferred.freebuilder.processor.util.SourceBuilder;
import org.inferred.freebuilder.processor.util.StaticExcerpt;
import java.util.AbstractSet;
import java.util.Iterator;
import java.util.Set;
/**
* Excerpts defining a set implementation that delegates to a provided add method to perform
* element validation and insertion into a backing set.
*/
public class CheckedSet {
public static Set<StaticExcerpt> excerpts() {
return ImmutableSet.of(CHECKED_SET);
}
private static final StaticExcerpt CHECKED_SET = new StaticExcerpt(TYPE, "CheckedSet") {
@Override
public void addTo(SourceBuilder code) {
ParameterizedType consumer = code.feature(FUNCTION_PACKAGE).consumer().orNull();
if (consumer != null) {
code.addLine("")
.addLine("/**")
.addLine(" * A set implementation that delegates to a provided add method")
.addLine(" * to perform element validation and insertion into a backing set.")
.addLine(" */")
.addLine("private static class CheckedSet<E> extends %s<E> {", AbstractSet.class)
.addLine("")
.addLine(" private final %s<E> set;", Set.class)
.addLine(" private final %s<E> add;", consumer.getQualifiedName())
.addLine("")
.addLine(" CheckedSet(%s<E> set, %s<E> add) {", Set.class, consumer.getQualifiedName())
.addLine(" this.set = set;")
.addLine(" this.add = add;")
.addLine(" }")
.addLine("")
.addLine("")
.addLine(" @Override public %s<E> iterator() {", Iterator.class)
.addLine(" return set.iterator();")
.addLine(" }")
.addLine("")
.addLine(" @Override public int size() {")
.addLine(" return set.size();")
.addLine(" }")
.addLine("")
.addLine(" @Override public boolean contains(Object e) {")
.addLine(" return set.contains(e);")
.addLine(" }")
.addLine("")
.addLine(" @Override public boolean add(E e) {")
.addLine(" if (!set.contains(e)) {")
.addLine(" add.accept(e);")
.addLine(" return true;")
.addLine(" } else {")
.addLine(" return false;")
.addLine(" }")
.addLine(" }")
.addLine("")
.addLine(" @Override public boolean remove(Object e) {")
.addLine(" return set.remove(e);")
.addLine(" }")
.addLine("}");
}
}
};
private CheckedSet() {}
}