blob: 3f0f76113f3ad53fa7185e9d9b54b49318dac7f4 [file] [log] [blame]
// Copyright (c) 2021, 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.utils.structural.StructuralItem;
import com.android.tools.r8.utils.structural.StructuralMapping;
import com.android.tools.r8.utils.structural.StructuralSpecification;
import com.google.common.collect.ImmutableList;
import com.google.common.primitives.Ints;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.function.BiConsumer;
public class Int2StructuralItemArrayMap<T extends StructuralItem<T>>
implements StructuralItem<Int2StructuralItemArrayMap<T>> {
private final int[] keys;
private final List<T> values;
private Int2StructuralItemArrayMap(int[] keys, List<T> values) {
this.keys = keys;
this.values = values;
assert keys.length == values.size();
}
@Override
public Int2StructuralItemArrayMap<T> self() {
return this;
}
@Override
public StructuralMapping<Int2StructuralItemArrayMap<T>> getStructuralMapping() {
return Int2StructuralItemArrayMap::specify;
}
private static <T extends StructuralItem<T>> void specify(
StructuralSpecification<Int2StructuralItemArrayMap<T>, ?> spec) {
spec.withIntArray(p -> p.keys).withItemCollection(p -> p.values);
}
public T lookup(int key) {
for (int i = 0; i < keys.length; i++) {
if (keys[i] == key) {
return values.get(i);
}
}
return null;
}
public void forEach(BiConsumer<Integer, T> visitor) {
for (int i = 0; i < keys.length; i++) {
visitor.accept(keys[i], values.get(i));
}
}
@SuppressWarnings("unchecked")
@Override
public boolean equals(Object other) {
return other instanceof Int2StructuralItemArrayMap
&& compareTo((Int2StructuralItemArrayMap<T>) other) == 0;
}
@Override
public int hashCode() {
return Objects.hash(Arrays.hashCode(keys), values);
}
public static <T extends StructuralItem<T>> Builder<T> builder() {
return new Builder<T>();
}
public boolean isEmpty() {
return keys.length == 0;
}
public static class Builder<T extends StructuralItem<T>> {
private final List<Integer> keys = new ArrayList<>();
private final ImmutableList.Builder<T> values = ImmutableList.builder();
private Builder() {}
public Builder<T> put(int key, T value) {
keys.add(key);
values.add(value);
return this;
}
public boolean isEmpty() {
return keys.isEmpty();
}
public Int2StructuralItemArrayMap<T> build() {
return new Int2StructuralItemArrayMap<T>(Ints.toArray(keys), values.build());
}
}
}