1090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 The Guava Authors
3090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License.
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at
7090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson *
8090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0
9090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson *
10090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Unless required by applicable law or agreed to in writing, software
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
15090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */
16090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
17090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonpackage com.google.common.base;
18090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkNotNull;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.Beta;
22090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport com.google.common.annotations.GwtCompatible;
23090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport com.google.common.annotations.GwtIncompatible;
24090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
25090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.io.Serializable;
26090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.util.ArrayList;
27090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.util.Arrays;
28090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.util.Collection;
29090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.util.List;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.regex.Pattern;
31090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
32090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport javax.annotation.Nullable;
33090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
34090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson/**
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Static utility methods pertaining to {@code Predicate} instances.
36090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson *
37090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * <p>All methods returns serializable predicates as long as they're given
38090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * serializable parameters.
39090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson *
40090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @author Kevin Bourrillion
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 2.0 (imported from Google Collections Library)
42090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
44090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonpublic final class Predicates {
45090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  private Predicates() {}
46090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // TODO(kevinb): considering having these implement a VisitablePredicate
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // interface which specifies an accept(PredicateVisitor) method.
49090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
50090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
51090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Returns a predicate that always evaluates to {@code true}.
52090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
53090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  @GwtCompatible(serializable = true)
54090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public static <T> Predicate<T> alwaysTrue() {
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return ObjectPredicate.ALWAYS_TRUE.withNarrowedType();
56090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
57090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
58090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
59090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Returns a predicate that always evaluates to {@code false}.
60090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
61090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  @GwtCompatible(serializable = true)
62090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public static <T> Predicate<T> alwaysFalse() {
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return ObjectPredicate.ALWAYS_FALSE.withNarrowedType();
64090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
65090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
66090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
67090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Returns a predicate that evaluates to {@code true} if the object reference
68090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * being tested is null.
69090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtCompatible(serializable = true)
71090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public static <T> Predicate<T> isNull() {
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return ObjectPredicate.IS_NULL.withNarrowedType();
73090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
74090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
75090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
76090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Returns a predicate that evaluates to {@code true} if the object reference
77090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * being tested is not null.
78090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtCompatible(serializable = true)
80090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public static <T> Predicate<T> notNull() {
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return ObjectPredicate.NOT_NULL.withNarrowedType();
82090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
83090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
84090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
85090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Returns a predicate that evaluates to {@code true} if the given predicate
86090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * evaluates to {@code false}.
87090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
88090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public static <T> Predicate<T> not(Predicate<T> predicate) {
89090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    return new NotPredicate<T>(predicate);
90090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
91090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
92090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
93090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Returns a predicate that evaluates to {@code true} if each of its
94090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * components evaluates to {@code true}. The components are evaluated in
95090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * order, and evaluation will be "short-circuited" as soon as a false
96090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * predicate is found. It defensively copies the iterable passed in, so future
97090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * changes to it won't alter the behavior of this predicate. If {@code
98090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * components} is empty, the returned predicate will always evaluate to {@code
99090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * true}.
100090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
101090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public static <T> Predicate<T> and(
102090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      Iterable<? extends Predicate<? super T>> components) {
103090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    return new AndPredicate<T>(defensiveCopy(components));
104090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
105090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
106090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
107090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Returns a predicate that evaluates to {@code true} if each of its
108090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * components evaluates to {@code true}. The components are evaluated in
109090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * order, and evaluation will be "short-circuited" as soon as a false
110090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * predicate is found. It defensively copies the array passed in, so future
111090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * changes to it won't alter the behavior of this predicate. If {@code
112090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * components} is empty, the returned predicate will always evaluate to {@code
113090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * true}.
114090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
115090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public static <T> Predicate<T> and(Predicate<? super T>... components) {
116090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    return new AndPredicate<T>(defensiveCopy(components));
117090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
118090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
119090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
120090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Returns a predicate that evaluates to {@code true} if both of its
121090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * components evaluate to {@code true}. The components are evaluated in
122090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * order, and evaluation will be "short-circuited" as soon as a false
123090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * predicate is found.
124090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
125090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public static <T> Predicate<T> and(Predicate<? super T> first,
126090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      Predicate<? super T> second) {
127090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    return new AndPredicate<T>(Predicates.<T>asList(
128090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson        checkNotNull(first), checkNotNull(second)));
129090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
130090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
131090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
132090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Returns a predicate that evaluates to {@code true} if any one of its
133090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * components evaluates to {@code true}. The components are evaluated in
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * order, and evaluation will be "short-circuited" as soon as a
135090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * true predicate is found. It defensively copies the iterable passed in, so
136090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * future changes to it won't alter the behavior of this predicate. If {@code
137090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * components} is empty, the returned predicate will always evaluate to {@code
138090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * false}.
139090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
140090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public static <T> Predicate<T> or(
141090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      Iterable<? extends Predicate<? super T>> components) {
142090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    return new OrPredicate<T>(defensiveCopy(components));
143090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
144090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
145090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
146090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Returns a predicate that evaluates to {@code true} if any one of its
147090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * components evaluates to {@code true}. The components are evaluated in
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * order, and evaluation will be "short-circuited" as soon as a
149090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * true predicate is found. It defensively copies the array passed in, so
150090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * future changes to it won't alter the behavior of this predicate. If {@code
151090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * components} is empty, the returned predicate will always evaluate to {@code
152090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * false}.
153090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
154090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public static <T> Predicate<T> or(Predicate<? super T>... components) {
155090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    return new OrPredicate<T>(defensiveCopy(components));
156090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
157090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
158090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
159090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Returns a predicate that evaluates to {@code true} if either of its
160090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * components evaluates to {@code true}. The components are evaluated in
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * order, and evaluation will be "short-circuited" as soon as a
162090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * true predicate is found.
163090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <T> Predicate<T> or(
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Predicate<? super T> first, Predicate<? super T> second) {
166090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    return new OrPredicate<T>(Predicates.<T>asList(
167090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson        checkNotNull(first), checkNotNull(second)));
168090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
169090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
170090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
171090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Returns a predicate that evaluates to {@code true} if the object being
172090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * tested {@code equals()} the given target or both are null.
173090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
174090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public static <T> Predicate<T> equalTo(@Nullable T target) {
175090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    return (target == null)
176090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson        ? Predicates.<T>isNull()
177090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson        : new IsEqualToPredicate<T>(target);
178090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
179090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
180090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
181090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Returns a predicate that evaluates to {@code true} if the object being
182090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * tested is an instance of the given class. If the object being tested
183090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * is {@code null} this predicate evaluates to {@code false}.
184090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *
185090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * <p>If you want to filter an {@code Iterable} to narrow its type, consider
186090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * using {@link com.google.common.collect.Iterables#filter(Iterable, Class)}
187090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * in preference.
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p><b>Warning:</b> contrary to the typical assumptions about predicates (as
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * documented at {@link Predicate#apply}), the returned predicate may not be
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <i>consistent with equals</i>. For example, {@code
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * instanceOf(ArrayList.class)} will yield different results for the two equal
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * instances {@code Lists.newArrayList(1)} and {@code Arrays.asList(1)}.
194090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
195090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  @GwtIncompatible("Class.isInstance")
196090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public static Predicate<Object> instanceOf(Class<?> clazz) {
197090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    return new InstanceOfPredicate(clazz);
198090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a predicate that evaluates to {@code true} if the class being
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * tested is assignable from the given class.  The returned predicate
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * does not allow null inputs.
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 10.0
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Class.isAssignableFrom")
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Beta
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static Predicate<Class<?>> assignableFrom(Class<?> clazz) {
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new AssignableFromPredicate(clazz);
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
212090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
213090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
214090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Returns a predicate that evaluates to {@code true} if the object reference
215090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * being tested is a member of the given collection. It does not defensively
216090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * copy the collection passed in, so future changes to it will alter the
217090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * behavior of the predicate.
218090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>This method can technically accept any {@code Collection<?>}, but using
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * a typed collection helps prevent bugs. This approach doesn't block any
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * potential users since it is always possible to use {@code
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Predicates.<Object>in()}.
223090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *
224090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * @param target the collection that may contain the function input
225090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
226090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public static <T> Predicate<T> in(Collection<? extends T> target) {
227090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    return new InPredicate<T>(target);
228090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
229090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
230090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
231090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * Returns the composition of a function and a predicate. For every {@code x},
232090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * the generated predicate returns {@code predicate(function(x))}.
233090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   *
234090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   * @return the composition of the provided function and predicate
235090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
236090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  public static <A, B> Predicate<A> compose(
237090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      Predicate<B> predicate, Function<A, ? extends B> function) {
238090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    return new CompositionPredicate<A, B>(predicate, function);
239090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
240090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a predicate that evaluates to {@code true} if the
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@code CharSequence} being tested contains any match for the given
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * regular expression pattern. The test used is equivalent to
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@code Pattern.compile(pattern).matcher(arg).find()}
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws java.util.regex.PatternSyntaxException if the pattern is invalid
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 3.0
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible(value = "java.util.regex.Pattern")
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static Predicate<CharSequence> containsPattern(String pattern) {
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new ContainsPatternPredicate(pattern);
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
254090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a predicate that evaluates to {@code true} if the
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@code CharSequence} being tested contains any match for the given
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * regular expression pattern. The test used is equivalent to
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@code pattern.matcher(arg).find()}
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @since 3.0
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible(value = "java.util.regex.Pattern")
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static Predicate<CharSequence> contains(Pattern pattern) {
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new ContainsPatternPredicate(pattern);
266090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
267090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // End public API, begin private implementation classes.
269090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Package private for GWT serialization.
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  enum ObjectPredicate implements Predicate<Object> {
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ALWAYS_TRUE {
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public boolean apply(@Nullable Object o) {
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return true;
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    },
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ALWAYS_FALSE {
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public boolean apply(@Nullable Object o) {
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return false;
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    },
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    IS_NULL {
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public boolean apply(@Nullable Object o) {
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return o == null;
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    },
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    NOT_NULL {
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public boolean apply(@Nullable Object o) {
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return o != null;
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @SuppressWarnings("unchecked") // these Object predicates work for any T
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    <T> Predicate<T> withNarrowedType() {
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return (Predicate<T>) this;
296090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
297090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
298090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
299090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /** @see Predicates#not(Predicate) */
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class NotPredicate<T> implements Predicate<T>, Serializable {
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final Predicate<T> predicate;
302090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    NotPredicate(Predicate<T> predicate) {
304090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      this.predicate = checkNotNull(predicate);
305090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
307090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    public boolean apply(T t) {
308090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      return !predicate.apply(t);
309090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
310090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    @Override public int hashCode() {
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ~predicate.hashCode();
312090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public boolean equals(@Nullable Object obj) {
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (obj instanceof NotPredicate) {
315090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson        NotPredicate<?> that = (NotPredicate<?>) obj;
316090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson        return predicate.equals(that.predicate);
317090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      }
318090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      return false;
319090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
320090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    @Override public String toString() {
321090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      return "Not(" + predicate.toString() + ")";
322090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
323090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    private static final long serialVersionUID = 0;
324090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
325090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final Joiner COMMA_JOINER = Joiner.on(",");
327090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
328090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /** @see Predicates#and(Iterable) */
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class AndPredicate<T> implements Predicate<T>, Serializable {
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private final List<? extends Predicate<? super T>> components;
331090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private AndPredicate(List<? extends Predicate<? super T>> components) {
333090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      this.components = components;
334090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
336090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    public boolean apply(T t) {
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int i = 0; i < components.size(); i++) {
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        if (!components.get(i).apply(t)) {
339090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson          return false;
340090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson        }
341090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      }
342090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      return true;
343090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
344090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    @Override public int hashCode() {
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // 0x12472c2c is a random number to help avoid collisions with OrPredicate
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return components.hashCode() + 0x12472c2c;
347090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public boolean equals(@Nullable Object obj) {
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (obj instanceof AndPredicate) {
350090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson        AndPredicate<?> that = (AndPredicate<?>) obj;
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return components.equals(that.components);
352090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      }
353090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      return false;
354090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
355090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    @Override public String toString() {
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "And(" + COMMA_JOINER.join(components) + ")";
357090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
358090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    private static final long serialVersionUID = 0;
359090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
360090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
361090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /** @see Predicates#or(Iterable) */
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class OrPredicate<T> implements Predicate<T>, Serializable {
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private final List<? extends Predicate<? super T>> components;
364090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private OrPredicate(List<? extends Predicate<? super T>> components) {
366090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      this.components = components;
367090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
369090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    public boolean apply(T t) {
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int i = 0; i < components.size(); i++) {
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        if (components.get(i).apply(t)) {
372090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson          return true;
373090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson        }
374090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      }
375090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      return false;
376090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
377090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    @Override public int hashCode() {
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // 0x053c91cf is a random number to help avoid collisions with AndPredicate
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return components.hashCode() + 0x053c91cf;
380090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public boolean equals(@Nullable Object obj) {
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (obj instanceof OrPredicate) {
383090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson        OrPredicate<?> that = (OrPredicate<?>) obj;
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return components.equals(that.components);
385090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      }
386090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      return false;
387090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
388090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    @Override public String toString() {
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "Or(" + COMMA_JOINER.join(components) + ")";
390090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
391090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    private static final long serialVersionUID = 0;
392090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
393090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
394090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /** @see Predicates#equalTo(Object) */
395090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  private static class IsEqualToPredicate<T>
396090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      implements Predicate<T>, Serializable {
397090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    private final T target;
398090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
399090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    private IsEqualToPredicate(T target) {
400090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      this.target = target;
401090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
403090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    public boolean apply(T t) {
404090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      return target.equals(t);
405090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
406090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    @Override public int hashCode() {
407090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      return target.hashCode();
408090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public boolean equals(@Nullable Object obj) {
410090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      if (obj instanceof IsEqualToPredicate) {
411090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson        IsEqualToPredicate<?> that = (IsEqualToPredicate<?>) obj;
412090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson        return target.equals(that.target);
413090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      }
414090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      return false;
415090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
416090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    @Override public String toString() {
417090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      return "IsEqualTo(" + target + ")";
418090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
419090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    private static final long serialVersionUID = 0;
420090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
421090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
422090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /** @see Predicates#instanceOf(Class) */
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Class.isInstance")
424090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  private static class InstanceOfPredicate
425090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      implements Predicate<Object>, Serializable {
426090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    private final Class<?> clazz;
427090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
428090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    private InstanceOfPredicate(Class<?> clazz) {
429090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      this.clazz = checkNotNull(clazz);
430090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public boolean apply(@Nullable Object o) {
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return clazz.isInstance(o);
434090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
435090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    @Override public int hashCode() {
436090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      return clazz.hashCode();
437090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public boolean equals(@Nullable Object obj) {
439090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      if (obj instanceof InstanceOfPredicate) {
440090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson        InstanceOfPredicate that = (InstanceOfPredicate) obj;
441090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson        return clazz == that.clazz;
442090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      }
443090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      return false;
444090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
445090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    @Override public String toString() {
446090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      return "IsInstanceOf(" + clazz.getName() + ")";
447090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
448090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    private static final long serialVersionUID = 0;
449090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /** @see Predicates#assignableFrom(Class) */
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Class.isAssignableFrom")
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class AssignableFromPredicate
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      implements Predicate<Class<?>>, Serializable {
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private final Class<?> clazz;
456090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private AssignableFromPredicate(Class<?> clazz) {
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.clazz = checkNotNull(clazz);
459090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public boolean apply(Class<?> input) {
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return clazz.isAssignableFrom(input);
463090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public int hashCode() {
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return clazz.hashCode();
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public boolean equals(@Nullable Object obj) {
4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (obj instanceof AssignableFromPredicate) {
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        AssignableFromPredicate that = (AssignableFromPredicate) obj;
4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return clazz == that.clazz;
4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return false;
473090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
474090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    @Override public String toString() {
4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "IsAssignableFrom(" + clazz.getName() + ")";
476090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private static final long serialVersionUID = 0;
478090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
479090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
480090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /** @see Predicates#in(Collection) */
4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class InPredicate<T> implements Predicate<T>, Serializable {
482090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    private final Collection<?> target;
483090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
484090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    private InPredicate(Collection<?> target) {
485090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      this.target = checkNotNull(target);
486090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
487090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
489090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    public boolean apply(T t) {
490090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      try {
491090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson        return target.contains(t);
492090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      } catch (NullPointerException e) {
493090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson        return false;
494090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      } catch (ClassCastException e) {
495090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson        return false;
496090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      }
497090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
498090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public boolean equals(@Nullable Object obj) {
5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (obj instanceof InPredicate) {
501090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson        InPredicate<?> that = (InPredicate<?>) obj;
502090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson        return target.equals(that.target);
503090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      }
504090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      return false;
505090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
506090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
507090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    @Override public int hashCode() {
508090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      return target.hashCode();
509090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
510090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
511090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    @Override public String toString() {
512090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      return "In(" + target + ")";
513090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
514090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    private static final long serialVersionUID = 0;
515090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
516090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
517090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /** @see Predicates#compose(Predicate, Function) */
518090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  private static class CompositionPredicate<A, B>
519090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      implements Predicate<A>, Serializable {
520090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    final Predicate<B> p;
521090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    final Function<A, ? extends B> f;
522090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
523090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    private CompositionPredicate(Predicate<B> p, Function<A, ? extends B> f) {
524090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      this.p = checkNotNull(p);
525090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      this.f = checkNotNull(f);
526090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
527090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
529090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    public boolean apply(A a) {
530090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      return p.apply(f.apply(a));
531090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
532090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public boolean equals(@Nullable Object obj) {
5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (obj instanceof CompositionPredicate) {
535090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson        CompositionPredicate<?, ?> that = (CompositionPredicate<?, ?>) obj;
536090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson        return f.equals(that.f) && p.equals(that.p);
537090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      }
538090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      return false;
539090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
540090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
541090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    @Override public int hashCode() {
542090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      return f.hashCode() ^ p.hashCode();
543090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
544090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
545090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    @Override public String toString() {
546090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      return p.toString() + "(" + f.toString() + ")";
547090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
548090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
549090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    private static final long serialVersionUID = 0;
550090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
551090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
552090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  /**
5531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @see Predicates#contains(Pattern)
5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @see Predicates#containsPattern(String)
555090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson   */
5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Only used by other GWT-incompatible code.")
5571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class ContainsPatternPredicate
5581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      implements Predicate<CharSequence>, Serializable {
5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final Pattern pattern;
5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ContainsPatternPredicate(Pattern pattern) {
5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.pattern = checkNotNull(pattern);
5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ContainsPatternPredicate(String patternStr) {
5661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this(Pattern.compile(patternStr));
5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
5701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public boolean apply(CharSequence t) {
5711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return pattern.matcher(t).find();
5721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public int hashCode() {
5751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // Pattern uses Object.hashCode, so we have to reach
5761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // inside to build a hashCode consistent with equals.
5771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Objects.hashCode(pattern.pattern(), pattern.flags());
5791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public boolean equals(@Nullable Object obj) {
5821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (obj instanceof ContainsPatternPredicate) {
5831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ContainsPatternPredicate that = (ContainsPatternPredicate) obj;
5841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // Pattern uses Object (identity) equality, so we have to reach
5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // inside to compare individual fields.
5871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Objects.equal(pattern.pattern(), that.pattern.pattern())
5881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            && Objects.equal(pattern.flags(), that.pattern.flags());
589090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      }
5901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return false;
591090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public String toString() {
5941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return Objects.toStringHelper(this)
5951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .add("pattern", pattern)
5961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .add("pattern.flags", Integer.toHexString(pattern.flags()))
5971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .toString();
5981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private static final long serialVersionUID = 0;
601090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
602090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
603090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  @SuppressWarnings("unchecked")
604090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  private static <T> List<Predicate<? super T>> asList(
605090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      Predicate<? super T> first, Predicate<? super T> second) {
606090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    return Arrays.<Predicate<? super T>>asList(first, second);
607090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
608090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
609090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  private static <T> List<T> defensiveCopy(T... array) {
610090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    return defensiveCopy(Arrays.asList(array));
611090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
612090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson
613090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  static <T> List<T> defensiveCopy(Iterable<T> iterable) {
614090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    ArrayList<T> list = new ArrayList<T>();
615090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    for (T element : iterable) {
616090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson      list.add(checkNotNull(element));
617090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    }
618090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson    return list;
619090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson  }
620090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson}
621