/*******************************************************************************
 * Copyright (c) 2000, 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.jsdt.internal.compiler.util;

import org.eclipse.wst.jsdt.core.compiler.CharOperation;

public final class CompoundNameVector {
	static int INITIAL_SIZE = 10;
    
	public int size;
	int maxSize;
	char[][][] elements;
public CompoundNameVector() {
	maxSize = INITIAL_SIZE;
	size = 0;
	elements = new char[maxSize][][];
}
public void add(char[][] newElement) {
	if (size == maxSize)    // knows that size starts <= maxSize
		System.arraycopy(elements, 0, (elements = new char[maxSize *= 2][][]), 0, size);
	elements[size++] = newElement;
}
public void addAll(char[][][] newElements) {
	if (size + newElements.length >= maxSize) {
		maxSize = size + newElements.length;    // assume no more elements will be added
		System.arraycopy(elements, 0, (elements = new char[maxSize][][]), 0, size);
	}
	System.arraycopy(newElements, 0, elements, size, newElements.length);
	size += newElements.length;
}
public boolean contains(char[][] element) {
	for (int i = size; --i >= 0;)
		if (CharOperation.equals(element, elements[i]))
			return true;
	return false;
}
public char[][] elementAt(int index) {
	return elements[index];
}
public char[][] remove(char[][] element) {
	// assumes only one occurrence of the element exists
	for (int i = size; --i >= 0;)
		if (element == elements[i]) {
			// shift the remaining elements down one spot
			System.arraycopy(elements, i + 1, elements, i, --size - i);
			elements[size] = null;
			return element;
		}
	return null;
}
public void removeAll() {
	for (int i = size; --i >= 0;)
		elements[i] = null;
	size = 0;
}
public String toString() {
	StringBuffer buffer = new StringBuffer();
	for (int i = 0; i < size; i++) {
		buffer.append(CharOperation.toString(elements[i])).append("\n"); //$NON-NLS-1$
	}
	return buffer.toString();
}
}
