/******************************************************************************* * Copyright (c) 2004, 2008 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 * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.core.parser.util; import java.lang.reflect.Array; import java.util.Collections; import java.util.Comparator; import java.util.List; /** * @author Doug Schaefer */ public class CharArrayObjectMap <T> extends CharTable { public static final CharArrayObjectMap<Object> EMPTY_MAP = new CharArrayObjectMap<Object>(0) { @Override public Object clone() { return this; } @Override public List<char[]> toList() { return Collections.emptyList(); } @Override public Object put(char[] key, int start, int length, Object value) { throw new UnsupportedOperationException(); } }; /** * @since 5.4 */ @SuppressWarnings("unchecked") public static <T> CharArrayObjectMap<T> emptyMap() { return (CharArrayObjectMap<T>) EMPTY_MAP; } private Object[] valueTable; public CharArrayObjectMap(int initialSize) { super(initialSize); valueTable = new Object[capacity()]; } public T put(char[] key, int start, int length, T value) { int i = addIndex(key, start, length); @SuppressWarnings("unchecked") T oldvalue = (T) valueTable[i]; valueTable[i] = value; return oldvalue; } final public T put(char[] key, T value) { return put(key, 0, key.length, value); } @SuppressWarnings("unchecked") final public T get(char[] key, int start, int length) { int i = lookup(key, start, length); if (i >= 0) return (T) valueTable[i]; return null; } final public T get(char[] key) { return get(key, 0, key.length); } @SuppressWarnings("unchecked") final public T getAt(int i) { if (i < 0 || i > currEntry) return null; return (T) valueTable[i]; } final public T remove(char[] key, int start, int length) { int i = lookup(key, start, length); if (i < 0) return null; @SuppressWarnings("unchecked") T value = (T) valueTable[i]; if (i < currEntry) System.arraycopy(valueTable, i + 1, valueTable, i, currEntry - i); valueTable[currEntry] = null; removeEntry(i); return value; } @Override public Object clone() { @SuppressWarnings("unchecked") CharArrayObjectMap<T> newTable = (CharArrayObjectMap<T>) super.clone(); newTable.valueTable = new Object[capacity()]; System.arraycopy(valueTable, 0, newTable.valueTable, 0, valueTable.length); return newTable; } @Override protected void resize(int size) { Object[] oldValueTable = valueTable; valueTable = new Object[size]; System.arraycopy(oldValueTable, 0, valueTable, 0, oldValueTable.length); super.resize(size); } @Override public void clear() { super.clear(); for (int i = 0; i < capacity(); i++) valueTable[i] = null; } @Override protected int partition(Comparator<Object> c, int p, int r) { char[] x = keyTable[p]; Object temp = null; int i = p; int j = r; while (true) { while (c.compare(keyTable[j], x) > 0) { j--; } if (i < j) { while (c.compare(keyTable[i], x) < 0) { i++; } } if (i < j) { temp = keyTable[j]; keyTable[j] = keyTable[i]; keyTable[i] = (char[]) temp; temp = valueTable[j]; valueTable[j] = valueTable[i]; valueTable[i] = temp; } else { return j; } } } public Object[] valueArray() { Object[] values = new Object[size()]; System.arraycopy(valueTable, 0, values, 0, values.length); return values; } public Object[] valueArray(Class<?> clazz) { Object[] values= (Object[]) Array.newInstance(clazz, size()); System.arraycopy(valueTable, 0, values, 0, values.length); return values; } }