blob: 17c5e4af1c20a42106b7228bc85021277101cf0c [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.collections;
import com.android.tools.r8.errors.Unreachable;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Collection;
import java.util.Deque;
import java.util.function.Predicate;
@SuppressWarnings("NullableProblems")
public class ImmutableDeque<T> extends ArrayDeque<T> {
private boolean isClosed = false;
private ImmutableDeque(Collection<T> items) {
super(items);
}
private void close() {
isClosed = true;
}
@Override
public void push(T t) {
throw new Unreachable("Modification not allowed on immutable structure");
}
@Override
public T pop() {
throw new Unreachable("Modification not allowed on immutable structure");
}
@Override
public void addFirst(T t) {
throw new Unreachable("Modification not allowed on immutable structure");
}
@Override
public void addLast(T t) {
if (isClosed) {
throw new Unreachable("Modification not allowed on immutable structure");
} else {
super.addLast(t);
}
}
@Override
public boolean removeFirstOccurrence(Object o) {
throw new Unreachable("Modification not allowed on immutable structure");
}
@Override
public boolean remove(Object o) {
throw new Unreachable("Modification not allowed on immutable structure");
}
@Override
public T removeFirst() {
throw new Unreachable("Modification not allowed on immutable structure");
}
@Override
public boolean removeAll(Collection<?> c) {
throw new Unreachable("Modification not allowed on immutable structure");
}
@Override
public boolean removeIf(Predicate<? super T> filter) {
throw new Unreachable("Modification not allowed on immutable structure");
}
@Override
public boolean removeLastOccurrence(Object o) {
throw new Unreachable("Modification not allowed on immutable structure");
}
@Override
public T removeLast() {
throw new Unreachable("Modification not allowed on immutable structure");
}
@Override
public T remove() {
throw new Unreachable("Modification not allowed on immutable structure");
}
@Override
public boolean add(T t) {
if (isClosed) {
throw new Unreachable("Modification not allowed on immutable structure");
} else {
return super.add(t);
}
}
@Override
public boolean addAll(Collection<? extends T> c) {
if (isClosed) {
throw new Unreachable("Modification not allowed on immutable structure");
} else {
return super.addAll(c);
}
}
@SafeVarargs
public static <T> Deque<T> of(T... items) {
ImmutableDeque<T> deque = new ImmutableDeque<>(Arrays.asList(items));
deque.close();
return deque;
}
}