/*
* Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.yangtools.util;
import com.google.common.annotations.Beta;
import com.google.common.base.Preconditions;
import java.util.AbstractQueue;
import java.util.Collections;
import java.util.Deque;
import java.util.Iterator;
import java.util.Spliterator;
import java.util.Spliterators;
import org.opendaylight.yangtools.concepts.Immutable;
/**
* A specialized always-empty implementation of {@link java.util.Deque}. This implementation will always refuse new
* elements in its {@link #offer(Object)} method.
* @author Robert Varga
*
* @param <E> the type of elements held in this collection
*/
@Beta
public final class EmptyDeque<E> extends AbstractQueue<E> implements Deque<E>, Immutable {
private static final EmptyDeque<?> INSTANCE = new EmptyDeque<>();
private static final Object[] EMPTY_ARRAY = new Object[0];
private EmptyDeque() {
// No instances
}
@SuppressWarnings("unchecked")
public static <T> EmptyDeque<T> instance() {
return (EmptyDeque<T>) INSTANCE;
}
@Override
public boolean offer(final E entry) {
return false;
}
@Override
public boolean offerFirst(final E e) {
return false;
}
@Override
public boolean offerLast(final E e) {
return false;
}
@Override
public E poll() {
return null;
}
@Override
public E pollFirst() {
return null;
}
@Override
public E pollLast() {
return null;
}
@Override
public E peek() {
return null;
}
@Override
public E peekFirst() {
return null;
}
@Override
public E peekLast() {
return null;
}
@Override
public Iterator<E> iterator() {
return Collections.emptyIterator();
}
@Override
public Spliterator<E> spliterator() {
return Spliterators.emptySpliterator();
}
@Override
public int size() {
return 0;
}
@Override
public Object[] toArray() {
return EMPTY_ARRAY;
}
@Override
public <T> T[] toArray(final T[] a) {
return Preconditions.checkNotNull(a);
}
@Override
public void addFirst(final E e) {
add(e);
}
@Override
public void addLast(final E e) {
add(e);
}
@Override
public E removeFirst() {
return remove();
}
@Override
public E removeLast() {
return remove();
}
@Override
public E getFirst() {
return element();
}
@Override
public E getLast() {
return element();
}
@Override
public boolean removeFirstOccurrence(final Object o) {
return false;
}
@Override
public boolean removeLastOccurrence(final Object o) {
return false;
}
@Override
public void push(final E e) {
addFirst(e);
}
@Override
public E pop() {
return removeFirst();
}
@Override
public Iterator<E> descendingIterator() {
return Collections.emptyIterator();
}
}