/** * * Copyright (c) 2006-2017, Speedment, Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); You may not * use this file except in compliance with the License. You may obtain a copy of * the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.speedment.runtime.field.internal.predicate; import com.speedment.runtime.field.predicate.CombinedPredicate; import com.speedment.runtime.field.predicate.trait.HasNegated; import static java.util.Objects.requireNonNull; import java.util.function.Predicate; /** * This class represents a Predicate that is used to build up higher orders * of predicates. * * @param <T> the type being evaluated * * @author Per Minborg * @since 2.1.0 */ abstract class AbstractPredicate<T> implements HasNegated, Predicate<T> { private final boolean negated; AbstractPredicate(boolean negated) { this.negated = negated; } @Override public Predicate<T> and(Predicate<? super T> other) { requireNonNull(other); return CombinedPredicate.and(this, other); } @Override public Predicate<T> or(Predicate<? super T> other) { requireNonNull(other); return CombinedPredicate.or(this, other); } @Override public boolean isNegated() { return negated; } @Override public final boolean test(T instance) { return testWithoutNegation(instance) ^ negated; } /** * Tests this predicate without applying negation. If the predicate * has been negated, the result from this method will be negated * afterwards. * * @param instance the instance to test * @return the result of the test (without negation) */ protected abstract boolean testWithoutNegation(T instance); }