| // Copyright (c) 2018, 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.android.tools.r8.graph.DexClassAndMethod; | |
| import com.android.tools.r8.graph.DexEncodedMethod; | |
| import com.google.common.collect.Lists; | |
| import java.util.Collection; | |
| import java.util.Collections; | |
| import java.util.LinkedHashSet; | |
| import java.util.List; | |
| import java.util.Set; | |
| public interface IROrdering { | |
| Iterable<DexEncodedMethod> order(Iterable<DexEncodedMethod> methods); | |
| Iterable<DexClassAndMethod> orderClassMethods(Iterable<DexClassAndMethod> methods); | |
| Collection<DexEncodedMethod> order(Collection<DexEncodedMethod> methods); | |
| Set<DexEncodedMethod> order(Set<DexEncodedMethod> methods); | |
| class IdentityIROrdering implements IROrdering { | |
| private static final IdentityIROrdering INSTANCE = new IdentityIROrdering(); | |
| private IdentityIROrdering() {} | |
| public static IdentityIROrdering getInstance() { | |
| return INSTANCE; | |
| } | |
| @Override | |
| public Iterable<DexEncodedMethod> order(Iterable<DexEncodedMethod> methods) { | |
| return methods; | |
| } | |
| @Override | |
| public Iterable<DexClassAndMethod> orderClassMethods(Iterable<DexClassAndMethod> methods) { | |
| return methods; | |
| } | |
| @Override | |
| public Collection<DexEncodedMethod> order(Collection<DexEncodedMethod> methods) { | |
| return methods; | |
| } | |
| @Override | |
| public Set<DexEncodedMethod> order(Set<DexEncodedMethod> methods) { | |
| return methods; | |
| } | |
| } | |
| class NondeterministicIROrdering implements IROrdering { | |
| private static final NondeterministicIROrdering INSTANCE = new NondeterministicIROrdering(); | |
| private NondeterministicIROrdering() {} | |
| public static NondeterministicIROrdering getInstance() { | |
| return INSTANCE; | |
| } | |
| @Override | |
| public List<DexEncodedMethod> order(Iterable<DexEncodedMethod> methods) { | |
| List<DexEncodedMethod> toShuffle = Lists.newArrayList(methods); | |
| Collections.shuffle(toShuffle); | |
| return toShuffle; | |
| } | |
| @Override | |
| public List<DexClassAndMethod> orderClassMethods(Iterable<DexClassAndMethod> methods) { | |
| List<DexClassAndMethod> toShuffle = Lists.newArrayList(methods); | |
| Collections.shuffle(toShuffle); | |
| return toShuffle; | |
| } | |
| @Override | |
| public List<DexEncodedMethod> order(Collection<DexEncodedMethod> methods) { | |
| return order((Iterable<DexEncodedMethod>) methods); | |
| } | |
| @Override | |
| public Set<DexEncodedMethod> order(Set<DexEncodedMethod> methods) { | |
| return new LinkedHashSet<>(order((Iterable<DexEncodedMethod>) methods)); | |
| } | |
| } | |
| } |