|  | // Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | package com.android.tools.r8.utils; | 
|  |  | 
|  | import com.google.common.collect.Sets; | 
|  | import java.util.ArrayList; | 
|  | import java.util.List; | 
|  | import java.util.Set; | 
|  | import java.util.function.Function; | 
|  | import java.util.function.Predicate; | 
|  |  | 
|  | public class PredicateSet<T> { | 
|  |  | 
|  | private final Set<T> elements = Sets.newIdentityHashSet(); | 
|  | private final List<Predicate<T>> predicates = new ArrayList<>(); | 
|  |  | 
|  | public boolean addElement(T element) { | 
|  | return elements.add(element); | 
|  | } | 
|  |  | 
|  | public void addPredicate(Predicate<T> predicate) { | 
|  | predicates.add(predicate); | 
|  | } | 
|  |  | 
|  | public static <T> PredicateSet<T> empty() { | 
|  | return new PredicateSet<>(); | 
|  | } | 
|  |  | 
|  | public PredicateSet<T> rewriteItems(Function<T, T> mapping) { | 
|  | PredicateSet<T> set = new PredicateSet<>(); | 
|  | for (T item : elements) { | 
|  | set.elements.add(mapping.apply(item)); | 
|  | } | 
|  | // It is assumed that the predicates do not need rewriting. Otherwise, this method must be | 
|  | // overwritten. | 
|  | set.predicates.addAll(predicates); | 
|  | return set; | 
|  | } | 
|  |  | 
|  | public boolean contains(T element) { | 
|  | if (elements.contains(element)) { | 
|  | return true; | 
|  | } | 
|  | for (Predicate<T> predicate : predicates) { | 
|  | if (predicate.test(element)) { | 
|  | return true; | 
|  | } | 
|  | } | 
|  | return false; | 
|  | } | 
|  | } |