|  | // 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.horizontalclassmerging; | 
|  |  | 
|  | import com.android.tools.r8.classmerging.Policy; | 
|  | import java.util.Collection; | 
|  | import java.util.concurrent.ExecutionException; | 
|  | import java.util.concurrent.ExecutorService; | 
|  |  | 
|  | public abstract class MultiClassPolicyWithPreprocessing<T> extends Policy { | 
|  |  | 
|  | /** | 
|  | * Apply the multi class policy to a group of program classes. | 
|  | * | 
|  | * @param group This is a group of program classes which can currently still be merged. | 
|  | * @param data The result of calling {@link #preprocess(Collection, ExecutorService)}. | 
|  | * @return The same collection of program classes split into new groups of candidates which can be | 
|  | *     merged. If the policy detects no issues then `group` will be returned unchanged. If classes | 
|  | *     cannot be merged with any other classes they are returned as singleton lists. | 
|  | */ | 
|  | public abstract Collection<HorizontalMergeGroup> apply(HorizontalMergeGroup group, T data); | 
|  |  | 
|  | public abstract T preprocess( | 
|  | Collection<HorizontalMergeGroup> groups, ExecutorService executorService) | 
|  | throws ExecutionException; | 
|  |  | 
|  | @Override | 
|  | public boolean isMultiClassPolicyWithPreprocessing() { | 
|  | return true; | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public MultiClassPolicyWithPreprocessing<?> asMultiClassPolicyWithPreprocessing() { | 
|  | return this; | 
|  | } | 
|  | } |