| // 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.ir.optimize.enums; |
| |
| import com.android.tools.r8.ir.analysis.value.AbstractValue; |
| import com.android.tools.r8.utils.collections.ImmutableInt2ReferenceSortedMap; |
| import java.util.function.BiConsumer; |
| |
| /* |
| * My instances represent the values of an enum field for each of the enum instance. |
| * For example: |
| * <code> enum E { |
| * A(10),B(20); |
| * int f; |
| * public E(int f) { |
| * this.f = f; |
| * } |
| * }</code> |
| * <p> The EnumFieldData for the field E#f is A -> 10, B -> 20. |
| * The EnumFieldData may be unknown, for example, if the enum fields are not set with constants. |
| */ |
| public abstract class EnumInstanceFieldData { |
| |
| public abstract boolean isUnknown(); |
| |
| public boolean isKnown() { |
| return !isUnknown(); |
| } |
| |
| public EnumInstanceFieldKnownData asEnumFieldKnownData() { |
| return null; |
| } |
| |
| public static class EnumInstanceFieldUnknownData extends EnumInstanceFieldData { |
| |
| private static final EnumInstanceFieldUnknownData INSTANCE = new EnumInstanceFieldUnknownData(); |
| |
| public static EnumInstanceFieldUnknownData getInstance() { |
| return INSTANCE; |
| } |
| |
| private EnumInstanceFieldUnknownData() {} |
| |
| @Override |
| public boolean isUnknown() { |
| return true; |
| } |
| } |
| |
| public abstract static class EnumInstanceFieldKnownData extends EnumInstanceFieldData { |
| |
| @Override |
| public boolean isUnknown() { |
| return false; |
| } |
| |
| public abstract boolean isOrdinal(); |
| |
| public abstract boolean isMapping(); |
| |
| @Override |
| public EnumInstanceFieldKnownData asEnumFieldKnownData() { |
| return this; |
| } |
| |
| public EnumInstanceFieldMappingData asEnumFieldMappingData() { |
| return null; |
| } |
| } |
| |
| public static class EnumInstanceFieldOrdinalData extends EnumInstanceFieldKnownData { |
| @Override |
| public boolean isOrdinal() { |
| return true; |
| } |
| |
| @Override |
| public boolean isMapping() { |
| return false; |
| } |
| } |
| |
| public static class EnumInstanceFieldMappingData extends EnumInstanceFieldKnownData { |
| private final ImmutableInt2ReferenceSortedMap<AbstractValue> mapping; |
| |
| public EnumInstanceFieldMappingData(ImmutableInt2ReferenceSortedMap<AbstractValue> mapping) { |
| this.mapping = mapping; |
| } |
| |
| @Override |
| public boolean isOrdinal() { |
| return false; |
| } |
| |
| @Override |
| public boolean isMapping() { |
| return true; |
| } |
| |
| @Override |
| public EnumInstanceFieldMappingData asEnumFieldMappingData() { |
| return this; |
| } |
| |
| public AbstractValue getData(int unboxedEnumValue) { |
| return mapping.get(unboxedEnumValue); |
| } |
| |
| public void forEach(BiConsumer<? super Integer, ? super AbstractValue> consumer) { |
| mapping.forEach(consumer); |
| } |
| } |
| } |