blob: a0b2104da95a9927b7433cc047336493bbdc600d [file] [log] [blame]
// 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.structural;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.utils.structural.StructuralItem.CompareToAccept;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
/** Base class for a visitor implementing compareTo on a structural item. */
public abstract class CompareToVisitor {
public abstract int visitBool(boolean value1, boolean value2);
public abstract int visitInt(int value1, int value2);
public abstract int visitLong(long value1, long value2);
public abstract int visitFloat(float value1, float value2);
public abstract int visitDouble(double value1, double value2);
/** Base for visiting an enumeration of items. */
public abstract <S> int visitItemIterator(
Iterator<S> it1, Iterator<S> it2, CompareToAccept<S> compareToAccept);
public final <S extends StructuralItem<S>> int visitItemArray(S[] items1, S[] items2) {
return visitItemCollection(Arrays.asList(items1), Arrays.asList(items2));
}
public final <S extends StructuralItem<S>> int visitItemCollection(
Collection<S> items1, Collection<S> items2) {
return visitItemIterator(
items1.iterator(),
items2.iterator(),
(s, other, visitor) -> s.acceptCompareTo(other, visitor));
}
public abstract int visitDexString(DexString string1, DexString string2);
public abstract int visitDexType(DexType type1, DexType type2);
public int visitDexField(DexField field1, DexField field2) {
return visit(field1, field2, field1.getStructuralMapping());
}
public int visitDexMethod(DexMethod method1, DexMethod method2) {
return visit(method1, method2, method1.getStructuralMapping());
}
public abstract int visitDexReference(DexReference reference1, DexReference reference2);
public abstract <S> int visit(S item1, S item2, StructuralMapping<S> accept);
@Deprecated
public abstract <S> int visit(S item1, S item2, Comparator<S> comparator);
}