package bjc.utils.esodata; import java.util.Arrays; import java.util.stream.Stream; /* * Implements a spaghetti stack, which is a stack that is branched off of a * parent stack. * * @param T The datatype stored in the stack. * @author Ben Culkin */ class SpaghettiStack extends Stack { private Stack backing; private Stack parent; /** * Create a new empty spaghetti stack, off of the specified parent. * * @param par * The parent stack */ public SpaghettiStack(Stack par) { backing = new SimpleStack<>(); parent = par; } @Override public void push(T elm) { backing.push(elm); } @Override public T pop() { if(backing.empty()) return parent.pop(); return backing.pop(); } @Override public T top() { if(backing.empty()) return parent.top(); return backing.top(); } @Override public int size() { return parent.size() + backing.size(); } @Override public boolean empty() { return backing.empty() && parent.empty(); } @Override public String toString() { return "[base=" + parent.toString() + ", own=" + backing.toString() + "]"; } @SuppressWarnings("unchecked") @Override public T[] toArray() { return (T[]) Stream.concat(Arrays.stream(parent.toArray()), Arrays.stream(backing.toArray())).toArray(); } }