package jetbrains.mps.internal.collections.runtime; /*Generated by MPS */ import java.io.Serializable; import java.util.Deque; import java.util.Iterator; import jetbrains.mps.baseLanguage.closures.runtime.AdapterClass; import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes; import jetbrains.mps.internal.collections.runtime.impl.NullDequeSequence; import java.util.LinkedList; import java.util.Collection; import java.util.List; import java.util.Arrays; public class DequeSequence<T> extends AbstractQueueSequence<T> implements IDequeSequence<T>, Serializable { private static final long serialVersionUID = 6994676498844479086L; private DequeSequence(Deque<T> deque) { super(deque); } @Override public void addFirst(T t) { getDeque().addFirst(t); } @Override public void addLast(T t) { getDeque().addLast(t); } @Override public Iterator<T> descendingIterator() { return getDeque().descendingIterator(); } @Override public T getFirst() { return getDeque().getFirst(); } @Override public T getLast() { return getDeque().getLast(); } @Override public boolean offerFirst(T t) { return getDeque().offerFirst(t); } @Override public boolean offerLast(T t) { return getDeque().offerLast(t); } @Override public T peekFirst() { return getDeque().peekFirst(); } @Override public T peekLast() { return getDeque().peekLast(); } @Override public T pollFirst() { return getDeque().pollFirst(); } @Override public T pollLast() { return getDeque().pollLast(); } @Override public T pop() { return getDeque().pop(); } @Override public void push(T t) { getDeque().push(t); } @Override public T removeFirst() { return getDeque().removeFirst(); } @Override public boolean removeFirstOccurrence(Object o) { return getDeque().removeFirstOccurrence(o); } @Override public T removeLast() { return getDeque().removeLast(); } @Override public boolean removeLastOccurrence(Object o) { return getDeque().removeLastOccurrence(o); } @Override public T addFirstElement(T t) { getDeque().addFirst(t); return t; } @Override public T removeLastElement() { if (Sequence.NULL_WHEN_EMPTY) { if (getDeque().isEmpty()) { return null; } } return getDeque().removeLast(); } @Override public T peekElement() { if (Sequence.NULL_WHEN_EMPTY) { if (getDeque().isEmpty()) { return null; } } return getDeque().peek(); } @Override public T popElement() { if (Sequence.NULL_WHEN_EMPTY) { if (getDeque().isEmpty()) { return null; } } return getDeque().pop(); } @Override public T pushElement(T t) { getDeque().push(t); return t; } @Override public IDequeSequence<T> addSequence(ISequence<? extends T> seq) { return (IDequeSequence<T>) super.addSequence(seq); } @Override public IDequeSequence<T> removeSequence(ISequence<? extends T> seq) { return (IDequeSequence<T>) super.removeSequence(seq); } @Override public IDequeSequence<T> removeWhere(@AdapterClass(value = "IWhereFilter") _FunctionTypes._return_P1_E0<? extends Boolean, ? super T> filter) { return (IDequeSequence<T>) super.removeWhere(filter); } @Override public IDequeSequence<T> asUnmodifiable() { throw new UnsupportedOperationException(); } @Override public IDequeSequence<T> asSynchronized() { throw new UnsupportedOperationException(); } protected Deque<T> getDeque() { return (Deque<T>) getQueue(); } public static <U> IDequeSequence<U> fromDeque(Deque<U> deque) { // change tempaltes to invoke this method and drop fromDequeNew return fromDequeNew(deque); } public static <U> IDequeSequence<U> fromDequeNew(Deque<U> deque) { if (deque instanceof IDequeSequence) { return (IDequeSequence<U>) deque; } if (deque == null && Sequence.USE_NULL_SEQUENCE) { return NullDequeSequence.instance(); } return new DequeSequence<U>(deque); } public static <U> IDequeSequence<U> fromIterable(Iterable<U> it) { if (Sequence.USE_NULL_SEQUENCE) { if (it == null) { return NullDequeSequence.instance(); } } if (it instanceof IDequeSequence) { return (IDequeSequence<U>) it; } Deque<U> deque = new LinkedList<U>(); if (Sequence.IGNORE_NULL_VALUES) { for (U u : it) { if (u != null) { deque.add(u); } } } else if (it instanceof Collection) { deque.addAll((Collection<? extends U>) it); } else { for (U u : it) { deque.add(u); } } return new DequeSequence<U>(deque); } public static <U> IDequeSequence<U> fromDequeAndArray(Deque<U> deque, U... array) { // change templates to invoke this method and remove fromDequeAndArrayNew return fromDequeAndArrayNew(deque, array); } public static <U> IDequeSequence<U> fromDequeAndArrayNew(Deque<U> deque, U... array) { if (Sequence.NULL_ARRAY_IS_SINGLETON) { if (array == null) { array = (U[]) Sequence.nullSingletonArray(); } } if (Sequence.USE_NULL_SEQUENCE) { if (deque == null && array == null) { return NullDequeSequence.instance(); } else if (deque == null) { deque = new LinkedList<U>(); } else if (array == null) { if (deque instanceof IDequeSequence) { return (IDequeSequence<U>) deque; } return new DequeSequence<U>(deque); } } List<U> input = Arrays.asList(array); if (Sequence.IGNORE_NULL_VALUES) { for (U u : input) { if (u != null) { deque.add(u); } } } else { deque.addAll(input); } if (deque instanceof IDequeSequence) { return (IDequeSequence<U>) deque; } return new DequeSequence<U>(deque); } public static <U> IDequeSequence<U> fromDequeWithValues(Deque<U> deque, Iterable<? extends U> it) { // change generators to use this method and drop fromDequeWithValuesNew return fromDequeWithValuesNew(deque, it); } public static <U> IDequeSequence<U> fromDequeWithValuesNew(Deque<U> deque, Iterable<? extends U> it) { Deque<U> tmp = deque; if (Sequence.USE_NULL_SEQUENCE) { if (deque == null && it == null) { return NullDequeSequence.instance(); } else if (deque == null) { tmp = new LinkedList<U>(); } else if (it == null) { return DequeSequence.fromDequeNew(deque); } } if (Sequence.IGNORE_NULL_VALUES) { for (U u : it) { if (u != null) { tmp.add(u); } } } else if (it instanceof Collection) { tmp.addAll((Collection<? extends U>) it); } else { for (U u : it) { tmp.add(u); } } if (tmp instanceof IDequeSequence) { return (IDequeSequence<U>) tmp; } return new DequeSequence<U>(tmp); } }