/******************************************************************************* * Copyright (c) 2009, 2017 IBM Corporation 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 * * Contributors: * IBM Corporation - initial API and implementation * Zend Technologies *******************************************************************************/ /* * StateStack.java * * Created on May 2, 2000, 12:36 PM */ package org.eclipse.php.internal.core.util.collections; import java.util.Arrays; /** * @author erez * @version A last in first out (LIFO) stack of integers that contains states * pushed by the lexer. */ public class StateStack implements Cloneable { private byte[] stack; private int lastIn = -1; /** * Creates new StateStack */ public StateStack() { this(5); } public StateStack(int stackSize) { stack = new byte[stackSize]; lastIn = -1; } public boolean isEmpty() { return lastIn == -1; } public int popStack() { int result = stack[lastIn]; lastIn--; return result; } public void pushStack(int state) { lastIn++; if (lastIn == stack.length) multiplySize(); stack[lastIn] = (byte) state; } private void multiplySize() { int length = stack.length; byte[] temp = new byte[length * 2]; System.arraycopy(stack, 0, temp, 0, length); stack = temp; } public int clear() { return lastIn = -1; } public int size() { return lastIn + 1; } public StateStack createClone() { StateStack rv = new StateStack(this.size()); rv.copyFrom(this); return rv; } @Override protected Object clone() throws CloneNotSupportedException { return createClone(); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + lastIn; result = prime * result + Arrays.hashCode(stack); return result; } @Override public boolean equals(final Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; StateStack other = (StateStack) obj; if (lastIn != other.lastIn) return false; if (!Arrays.equals(stack, other.stack)) return false; return true; } public void copyFrom(StateStack s) { while (s.lastIn >= this.stack.length) { this.multiplySize(); } this.lastIn = s.lastIn; for (int i = 0; i <= s.lastIn; i++) { this.stack[i] = s.stack[i]; } } public boolean contains(int state) { for (int i = 0; i <= lastIn; i++) { if (stack[i] == state) { return true; } } return false; } public int get(int index) { return stack[index]; } public String toString() { StringBuilder sb = new StringBuilder(50); for (int i = 0; i <= lastIn; i++) { sb.append(" stack[" + i + "]= " + stack[i]); //$NON-NLS-1$ //$NON-NLS-2$ } return sb.toString(); } }