1/*
2 * Copyright (C) 2007 The Guava Authors
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.google.common.base;
18
19import static com.google.common.base.Preconditions.checkNotNull;
20
21import com.google.common.annotations.Beta;
22import com.google.common.annotations.GwtCompatible;
23import com.google.common.annotations.GwtIncompatible;
24
25import java.io.Serializable;
26import java.util.ArrayList;
27import java.util.Arrays;
28import java.util.Collection;
29import java.util.List;
30import java.util.regex.Pattern;
31
32import javax.annotation.Nullable;
33
34/**
35 * Static utility methods pertaining to {@code Predicate} instances.
36 *
37 * <p>All methods returns serializable predicates as long as they're given
38 * serializable parameters.
39 *
40 * @author Kevin Bourrillion
41 * @since 2.0 (imported from Google Collections Library)
42 */
43@GwtCompatible(emulated = true)
44public final class Predicates {
45  private Predicates() {}
46
47  // TODO(kevinb): considering having these implement a VisitablePredicate
48  // interface which specifies an accept(PredicateVisitor) method.
49
50  /**
51   * Returns a predicate that always evaluates to {@code true}.
52   */
53  @GwtCompatible(serializable = true)
54  public static <T> Predicate<T> alwaysTrue() {
55    return ObjectPredicate.ALWAYS_TRUE.withNarrowedType();
56  }
57
58  /**
59   * Returns a predicate that always evaluates to {@code false}.
60   */
61  @GwtCompatible(serializable = true)
62  public static <T> Predicate<T> alwaysFalse() {
63    return ObjectPredicate.ALWAYS_FALSE.withNarrowedType();
64  }
65
66  /**
67   * Returns a predicate that evaluates to {@code true} if the object reference
68   * being tested is null.
69   */
70  @GwtCompatible(serializable = true)
71  public static <T> Predicate<T> isNull() {
72    return ObjectPredicate.IS_NULL.withNarrowedType();
73  }
74
75  /**
76   * Returns a predicate that evaluates to {@code true} if the object reference
77   * being tested is not null.
78   */
79  @GwtCompatible(serializable = true)
80  public static <T> Predicate<T> notNull() {
81    return ObjectPredicate.NOT_NULL.withNarrowedType();
82  }
83
84  /**
85   * Returns a predicate that evaluates to {@code true} if the given predicate
86   * evaluates to {@code false}.
87   */
88  public static <T> Predicate<T> not(Predicate<T> predicate) {
89    return new NotPredicate<T>(predicate);
90  }
91
92  /**
93   * Returns a predicate that evaluates to {@code true} if each of its
94   * components evaluates to {@code true}. The components are evaluated in
95   * order, and evaluation will be "short-circuited" as soon as a false
96   * predicate is found. It defensively copies the iterable passed in, so future
97   * changes to it won't alter the behavior of this predicate. If {@code
98   * components} is empty, the returned predicate will always evaluate to {@code
99   * true}.
100   */
101  public static <T> Predicate<T> and(
102      Iterable<? extends Predicate<? super T>> components) {
103    return new AndPredicate<T>(defensiveCopy(components));
104  }
105
106  /**
107   * Returns a predicate that evaluates to {@code true} if each of its
108   * components evaluates to {@code true}. The components are evaluated in
109   * order, and evaluation will be "short-circuited" as soon as a false
110   * predicate is found. It defensively copies the array passed in, so future
111   * changes to it won't alter the behavior of this predicate. If {@code
112   * components} is empty, the returned predicate will always evaluate to {@code
113   * true}.
114   */
115  public static <T> Predicate<T> and(Predicate<? super T>... components) {
116    return new AndPredicate<T>(defensiveCopy(components));
117  }
118
119  /**
120   * Returns a predicate that evaluates to {@code true} if both of its
121   * components evaluate to {@code true}. The components are evaluated in
122   * order, and evaluation will be "short-circuited" as soon as a false
123   * predicate is found.
124   */
125  public static <T> Predicate<T> and(Predicate<? super T> first,
126      Predicate<? super T> second) {
127    return new AndPredicate<T>(Predicates.<T>asList(
128        checkNotNull(first), checkNotNull(second)));
129  }
130
131  /**
132   * Returns a predicate that evaluates to {@code true} if any one of its
133   * components evaluates to {@code true}. The components are evaluated in
134   * order, and evaluation will be "short-circuited" as soon as a
135   * true predicate is found. It defensively copies the iterable passed in, so
136   * future changes to it won't alter the behavior of this predicate. If {@code
137   * components} is empty, the returned predicate will always evaluate to {@code
138   * false}.
139   */
140  public static <T> Predicate<T> or(
141      Iterable<? extends Predicate<? super T>> components) {
142    return new OrPredicate<T>(defensiveCopy(components));
143  }
144
145  /**
146   * Returns a predicate that evaluates to {@code true} if any one of its
147   * components evaluates to {@code true}. The components are evaluated in
148   * order, and evaluation will be "short-circuited" as soon as a
149   * true predicate is found. It defensively copies the array passed in, so
150   * future changes to it won't alter the behavior of this predicate. If {@code
151   * components} is empty, the returned predicate will always evaluate to {@code
152   * false}.
153   */
154  public static <T> Predicate<T> or(Predicate<? super T>... components) {
155    return new OrPredicate<T>(defensiveCopy(components));
156  }
157
158  /**
159   * Returns a predicate that evaluates to {@code true} if either of its
160   * components evaluates to {@code true}. The components are evaluated in
161   * order, and evaluation will be "short-circuited" as soon as a
162   * true predicate is found.
163   */
164  public static <T> Predicate<T> or(
165      Predicate<? super T> first, Predicate<? super T> second) {
166    return new OrPredicate<T>(Predicates.<T>asList(
167        checkNotNull(first), checkNotNull(second)));
168  }
169
170  /**
171   * Returns a predicate that evaluates to {@code true} if the object being
172   * tested {@code equals()} the given target or both are null.
173   */
174  public static <T> Predicate<T> equalTo(@Nullable T target) {
175    return (target == null)
176        ? Predicates.<T>isNull()
177        : new IsEqualToPredicate<T>(target);
178  }
179
180  /**
181   * Returns a predicate that evaluates to {@code true} if the object being
182   * tested is an instance of the given class. If the object being tested
183   * is {@code null} this predicate evaluates to {@code false}.
184   *
185   * <p>If you want to filter an {@code Iterable} to narrow its type, consider
186   * using {@link com.google.common.collect.Iterables#filter(Iterable, Class)}
187   * in preference.
188   *
189   * <p><b>Warning:</b> contrary to the typical assumptions about predicates (as
190   * documented at {@link Predicate#apply}), the returned predicate may not be
191   * <i>consistent with equals</i>. For example, {@code
192   * instanceOf(ArrayList.class)} will yield different results for the two equal
193   * instances {@code Lists.newArrayList(1)} and {@code Arrays.asList(1)}.
194   */
195  @GwtIncompatible("Class.isInstance")
196  public static Predicate<Object> instanceOf(Class<?> clazz) {
197    return new InstanceOfPredicate(clazz);
198  }
199
200  /**
201   * Returns a predicate that evaluates to {@code true} if the class being
202   * tested is assignable from the given class.  The returned predicate
203   * does not allow null inputs.
204   *
205   * @since 10.0
206   */
207  @GwtIncompatible("Class.isAssignableFrom")
208  @Beta
209  public static Predicate<Class<?>> assignableFrom(Class<?> clazz) {
210    return new AssignableFromPredicate(clazz);
211  }
212
213  /**
214   * Returns a predicate that evaluates to {@code true} if the object reference
215   * being tested is a member of the given collection. It does not defensively
216   * copy the collection passed in, so future changes to it will alter the
217   * behavior of the predicate.
218   *
219   * <p>This method can technically accept any {@code Collection<?>}, but using
220   * a typed collection helps prevent bugs. This approach doesn't block any
221   * potential users since it is always possible to use {@code
222   * Predicates.<Object>in()}.
223   *
224   * @param target the collection that may contain the function input
225   */
226  public static <T> Predicate<T> in(Collection<? extends T> target) {
227    return new InPredicate<T>(target);
228  }
229
230  /**
231   * Returns the composition of a function and a predicate. For every {@code x},
232   * the generated predicate returns {@code predicate(function(x))}.
233   *
234   * @return the composition of the provided function and predicate
235   */
236  public static <A, B> Predicate<A> compose(
237      Predicate<B> predicate, Function<A, ? extends B> function) {
238    return new CompositionPredicate<A, B>(predicate, function);
239  }
240
241  /**
242   * Returns a predicate that evaluates to {@code true} if the
243   * {@code CharSequence} being tested contains any match for the given
244   * regular expression pattern. The test used is equivalent to
245   * {@code Pattern.compile(pattern).matcher(arg).find()}
246   *
247   * @throws java.util.regex.PatternSyntaxException if the pattern is invalid
248   * @since 3.0
249   */
250  @GwtIncompatible(value = "java.util.regex.Pattern")
251  public static Predicate<CharSequence> containsPattern(String pattern) {
252    return new ContainsPatternPredicate(pattern);
253  }
254
255  /**
256   * Returns a predicate that evaluates to {@code true} if the
257   * {@code CharSequence} being tested contains any match for the given
258   * regular expression pattern. The test used is equivalent to
259   * {@code pattern.matcher(arg).find()}
260   *
261   * @since 3.0
262   */
263  @GwtIncompatible(value = "java.util.regex.Pattern")
264  public static Predicate<CharSequence> contains(Pattern pattern) {
265    return new ContainsPatternPredicate(pattern);
266  }
267
268  // End public API, begin private implementation classes.
269
270  // Package private for GWT serialization.
271  enum ObjectPredicate implements Predicate<Object> {
272    ALWAYS_TRUE {
273      @Override public boolean apply(@Nullable Object o) {
274        return true;
275      }
276    },
277    ALWAYS_FALSE {
278      @Override public boolean apply(@Nullable Object o) {
279        return false;
280      }
281    },
282    IS_NULL {
283      @Override public boolean apply(@Nullable Object o) {
284        return o == null;
285      }
286    },
287    NOT_NULL {
288      @Override public boolean apply(@Nullable Object o) {
289        return o != null;
290      }
291    };
292
293    @SuppressWarnings("unchecked") // these Object predicates work for any T
294    <T> Predicate<T> withNarrowedType() {
295      return (Predicate<T>) this;
296    }
297  }
298
299  /** @see Predicates#not(Predicate) */
300  private static class NotPredicate<T> implements Predicate<T>, Serializable {
301    final Predicate<T> predicate;
302
303    NotPredicate(Predicate<T> predicate) {
304      this.predicate = checkNotNull(predicate);
305    }
306    @Override
307    public boolean apply(T t) {
308      return !predicate.apply(t);
309    }
310    @Override public int hashCode() {
311      return ~predicate.hashCode();
312    }
313    @Override public boolean equals(@Nullable Object obj) {
314      if (obj instanceof NotPredicate) {
315        NotPredicate<?> that = (NotPredicate<?>) obj;
316        return predicate.equals(that.predicate);
317      }
318      return false;
319    }
320    @Override public String toString() {
321      return "Not(" + predicate.toString() + ")";
322    }
323    private static final long serialVersionUID = 0;
324  }
325
326  private static final Joiner COMMA_JOINER = Joiner.on(",");
327
328  /** @see Predicates#and(Iterable) */
329  private static class AndPredicate<T> implements Predicate<T>, Serializable {
330    private final List<? extends Predicate<? super T>> components;
331
332    private AndPredicate(List<? extends Predicate<? super T>> components) {
333      this.components = components;
334    }
335    @Override
336    public boolean apply(T t) {
337      for (int i = 0; i < components.size(); i++) {
338        if (!components.get(i).apply(t)) {
339          return false;
340        }
341      }
342      return true;
343    }
344    @Override public int hashCode() {
345      // 0x12472c2c is a random number to help avoid collisions with OrPredicate
346      return components.hashCode() + 0x12472c2c;
347    }
348    @Override public boolean equals(@Nullable Object obj) {
349      if (obj instanceof AndPredicate) {
350        AndPredicate<?> that = (AndPredicate<?>) obj;
351        return components.equals(that.components);
352      }
353      return false;
354    }
355    @Override public String toString() {
356      return "And(" + COMMA_JOINER.join(components) + ")";
357    }
358    private static final long serialVersionUID = 0;
359  }
360
361  /** @see Predicates#or(Iterable) */
362  private static class OrPredicate<T> implements Predicate<T>, Serializable {
363    private final List<? extends Predicate<? super T>> components;
364
365    private OrPredicate(List<? extends Predicate<? super T>> components) {
366      this.components = components;
367    }
368    @Override
369    public boolean apply(T t) {
370      for (int i = 0; i < components.size(); i++) {
371        if (components.get(i).apply(t)) {
372          return true;
373        }
374      }
375      return false;
376    }
377    @Override public int hashCode() {
378      // 0x053c91cf is a random number to help avoid collisions with AndPredicate
379      return components.hashCode() + 0x053c91cf;
380    }
381    @Override public boolean equals(@Nullable Object obj) {
382      if (obj instanceof OrPredicate) {
383        OrPredicate<?> that = (OrPredicate<?>) obj;
384        return components.equals(that.components);
385      }
386      return false;
387    }
388    @Override public String toString() {
389      return "Or(" + COMMA_JOINER.join(components) + ")";
390    }
391    private static final long serialVersionUID = 0;
392  }
393
394  /** @see Predicates#equalTo(Object) */
395  private static class IsEqualToPredicate<T>
396      implements Predicate<T>, Serializable {
397    private final T target;
398
399    private IsEqualToPredicate(T target) {
400      this.target = target;
401    }
402    @Override
403    public boolean apply(T t) {
404      return target.equals(t);
405    }
406    @Override public int hashCode() {
407      return target.hashCode();
408    }
409    @Override public boolean equals(@Nullable Object obj) {
410      if (obj instanceof IsEqualToPredicate) {
411        IsEqualToPredicate<?> that = (IsEqualToPredicate<?>) obj;
412        return target.equals(that.target);
413      }
414      return false;
415    }
416    @Override public String toString() {
417      return "IsEqualTo(" + target + ")";
418    }
419    private static final long serialVersionUID = 0;
420  }
421
422  /** @see Predicates#instanceOf(Class) */
423  @GwtIncompatible("Class.isInstance")
424  private static class InstanceOfPredicate
425      implements Predicate<Object>, Serializable {
426    private final Class<?> clazz;
427
428    private InstanceOfPredicate(Class<?> clazz) {
429      this.clazz = checkNotNull(clazz);
430    }
431    @Override
432    public boolean apply(@Nullable Object o) {
433      return clazz.isInstance(o);
434    }
435    @Override public int hashCode() {
436      return clazz.hashCode();
437    }
438    @Override public boolean equals(@Nullable Object obj) {
439      if (obj instanceof InstanceOfPredicate) {
440        InstanceOfPredicate that = (InstanceOfPredicate) obj;
441        return clazz == that.clazz;
442      }
443      return false;
444    }
445    @Override public String toString() {
446      return "IsInstanceOf(" + clazz.getName() + ")";
447    }
448    private static final long serialVersionUID = 0;
449  }
450
451  /** @see Predicates#assignableFrom(Class) */
452  @GwtIncompatible("Class.isAssignableFrom")
453  private static class AssignableFromPredicate
454      implements Predicate<Class<?>>, Serializable {
455    private final Class<?> clazz;
456
457    private AssignableFromPredicate(Class<?> clazz) {
458      this.clazz = checkNotNull(clazz);
459    }
460    @Override
461    public boolean apply(Class<?> input) {
462      return clazz.isAssignableFrom(input);
463    }
464    @Override public int hashCode() {
465      return clazz.hashCode();
466    }
467    @Override public boolean equals(@Nullable Object obj) {
468      if (obj instanceof AssignableFromPredicate) {
469        AssignableFromPredicate that = (AssignableFromPredicate) obj;
470        return clazz == that.clazz;
471      }
472      return false;
473    }
474    @Override public String toString() {
475      return "IsAssignableFrom(" + clazz.getName() + ")";
476    }
477    private static final long serialVersionUID = 0;
478  }
479
480  /** @see Predicates#in(Collection) */
481  private static class InPredicate<T> implements Predicate<T>, Serializable {
482    private final Collection<?> target;
483
484    private InPredicate(Collection<?> target) {
485      this.target = checkNotNull(target);
486    }
487
488    @Override
489    public boolean apply(T t) {
490      try {
491        return target.contains(t);
492      } catch (NullPointerException e) {
493        return false;
494      } catch (ClassCastException e) {
495        return false;
496      }
497    }
498
499    @Override public boolean equals(@Nullable Object obj) {
500      if (obj instanceof InPredicate) {
501        InPredicate<?> that = (InPredicate<?>) obj;
502        return target.equals(that.target);
503      }
504      return false;
505    }
506
507    @Override public int hashCode() {
508      return target.hashCode();
509    }
510
511    @Override public String toString() {
512      return "In(" + target + ")";
513    }
514    private static final long serialVersionUID = 0;
515  }
516
517  /** @see Predicates#compose(Predicate, Function) */
518  private static class CompositionPredicate<A, B>
519      implements Predicate<A>, Serializable {
520    final Predicate<B> p;
521    final Function<A, ? extends B> f;
522
523    private CompositionPredicate(Predicate<B> p, Function<A, ? extends B> f) {
524      this.p = checkNotNull(p);
525      this.f = checkNotNull(f);
526    }
527
528    @Override
529    public boolean apply(A a) {
530      return p.apply(f.apply(a));
531    }
532
533    @Override public boolean equals(@Nullable Object obj) {
534      if (obj instanceof CompositionPredicate) {
535        CompositionPredicate<?, ?> that = (CompositionPredicate<?, ?>) obj;
536        return f.equals(that.f) && p.equals(that.p);
537      }
538      return false;
539    }
540
541    @Override public int hashCode() {
542      return f.hashCode() ^ p.hashCode();
543    }
544
545    @Override public String toString() {
546      return p.toString() + "(" + f.toString() + ")";
547    }
548
549    private static final long serialVersionUID = 0;
550  }
551
552  /**
553   * @see Predicates#contains(Pattern)
554   * @see Predicates#containsPattern(String)
555   */
556  @GwtIncompatible("Only used by other GWT-incompatible code.")
557  private static class ContainsPatternPredicate
558      implements Predicate<CharSequence>, Serializable {
559    final Pattern pattern;
560
561    ContainsPatternPredicate(Pattern pattern) {
562      this.pattern = checkNotNull(pattern);
563    }
564
565    ContainsPatternPredicate(String patternStr) {
566      this(Pattern.compile(patternStr));
567    }
568
569    @Override
570    public boolean apply(CharSequence t) {
571      return pattern.matcher(t).find();
572    }
573
574    @Override public int hashCode() {
575      // Pattern uses Object.hashCode, so we have to reach
576      // inside to build a hashCode consistent with equals.
577
578      return Objects.hashCode(pattern.pattern(), pattern.flags());
579    }
580
581    @Override public boolean equals(@Nullable Object obj) {
582      if (obj instanceof ContainsPatternPredicate) {
583        ContainsPatternPredicate that = (ContainsPatternPredicate) obj;
584
585        // Pattern uses Object (identity) equality, so we have to reach
586        // inside to compare individual fields.
587        return Objects.equal(pattern.pattern(), that.pattern.pattern())
588            && Objects.equal(pattern.flags(), that.pattern.flags());
589      }
590      return false;
591    }
592
593    @Override public String toString() {
594      return Objects.toStringHelper(this)
595          .add("pattern", pattern)
596          .add("pattern.flags", Integer.toHexString(pattern.flags()))
597          .toString();
598    }
599
600    private static final long serialVersionUID = 0;
601  }
602
603  @SuppressWarnings("unchecked")
604  private static <T> List<Predicate<? super T>> asList(
605      Predicate<? super T> first, Predicate<? super T> second) {
606    return Arrays.<Predicate<? super T>>asList(first, second);
607  }
608
609  private static <T> List<T> defensiveCopy(T... array) {
610    return defensiveCopy(Arrays.asList(array));
611  }
612
613  static <T> List<T> defensiveCopy(Iterable<T> iterable) {
614    ArrayList<T> list = new ArrayList<T>();
615    for (T element : iterable) {
616      list.add(checkNotNull(element));
617    }
618    return list;
619  }
620}
621