/*******************************************************************************
* Copyright (c) 2007, 2010 Intel 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:
* Intel Corporation - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.core.settings.model.util;
import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry;
import org.eclipse.cdt.core.settings.model.ICSettingEntry;
/**
* A storage where stored data is organized by "kind".
* In most cases kind is one of {@link ICLanguageSettingEntry}, i.e. include path, macro etc.
*
* @param <T> - stored type
*
* @see ICSettingEntry#INCLUDE_PATH
* @see ICSettingEntry#INCLUDE_FILE
* @see ICSettingEntry#MACRO
* @see ICSettingEntry#MACRO_FILE
* @see ICSettingEntry#LIBRARY_PATH
* @see ICSettingEntry#LIBRARY_FILE
* @see ICSettingEntry#OUTPUT_PATH
* @see ICSettingEntry#SOURCE_PATH
*
*/
public class KindBasedStore<T> implements Cloneable {
private static final int INDEX_INCLUDE_PATH = 0;
private static final int INDEX_INCLUDE_FILE = 1;
private static final int INDEX_MACRO = 2;
private static final int INDEX_MACRO_FILE = 3;
private static final int INDEX_LIBRARY_PATH = 4;
private static final int INDEX_LIBRARY_FILE = 5;
private static final int LANG_STORAGE_SIZE = 6;
private static final int INDEX_SOURCE_PATH = 6;
private static final int INDEX_OUPUT_PATH = 7;
private static final int ALL_STORAGE_SIZE = 8;
public static final int ORED_LANG_ENTRY_KINDS =
ICLanguageSettingEntry.INCLUDE_PATH
| ICLanguageSettingEntry.INCLUDE_FILE
| ICLanguageSettingEntry.MACRO
| ICLanguageSettingEntry.MACRO_FILE
| ICLanguageSettingEntry.LIBRARY_PATH
| ICLanguageSettingEntry.LIBRARY_FILE;
public static final int ORED_ALL_ENTRY_KINDS =
ICLanguageSettingEntry.INCLUDE_PATH
| ICLanguageSettingEntry.INCLUDE_FILE
| ICLanguageSettingEntry.MACRO
| ICLanguageSettingEntry.MACRO_FILE
| ICLanguageSettingEntry.LIBRARY_PATH
| ICLanguageSettingEntry.LIBRARY_FILE
| ICLanguageSettingEntry.SOURCE_PATH
| ICLanguageSettingEntry.OUTPUT_PATH;
private static final int LANG_ENTRY_KINDS[] = new int[]{
ICLanguageSettingEntry.INCLUDE_PATH,
ICLanguageSettingEntry.INCLUDE_FILE,
ICLanguageSettingEntry.MACRO,
ICLanguageSettingEntry.MACRO_FILE,
ICLanguageSettingEntry.LIBRARY_PATH,
ICLanguageSettingEntry.LIBRARY_FILE,
};
private static final int ALL_ENTRY_KINDS[] = new int[]{
ICLanguageSettingEntry.INCLUDE_PATH,
ICLanguageSettingEntry.INCLUDE_FILE,
ICLanguageSettingEntry.MACRO,
ICLanguageSettingEntry.MACRO_FILE,
ICLanguageSettingEntry.LIBRARY_PATH,
ICLanguageSettingEntry.LIBRARY_FILE,
ICLanguageSettingEntry.SOURCE_PATH,
ICLanguageSettingEntry.OUTPUT_PATH,
};
// private static final int INEXISTENT_INDEX = -1;
private Object[] fEntryStorage;
public KindBasedStore(){
this(true);
}
public KindBasedStore(boolean langOnly){
if(langOnly)
fEntryStorage = new Object[LANG_STORAGE_SIZE];
else
fEntryStorage = new Object[ALL_STORAGE_SIZE];
}
private int kindToIndex(int kind){
switch (kind){
case ICLanguageSettingEntry.INCLUDE_PATH:
return INDEX_INCLUDE_PATH;
case ICLanguageSettingEntry.INCLUDE_FILE:
return INDEX_INCLUDE_FILE;
case ICLanguageSettingEntry.MACRO:
return INDEX_MACRO;
case ICLanguageSettingEntry.MACRO_FILE:
return INDEX_MACRO_FILE;
case ICLanguageSettingEntry.LIBRARY_PATH:
return INDEX_LIBRARY_PATH;
case ICLanguageSettingEntry.LIBRARY_FILE:
return INDEX_LIBRARY_FILE;
case ICSettingEntry.SOURCE_PATH:
if(INDEX_SOURCE_PATH < fEntryStorage.length)
return INDEX_SOURCE_PATH;
break;
case ICSettingEntry.OUTPUT_PATH:
if(INDEX_OUPUT_PATH < fEntryStorage.length)
return INDEX_OUPUT_PATH;
break;
}
throw new IllegalArgumentException(UtilMessages.getString("KindBasedStore.0")); //$NON-NLS-1$
}
public static int[] getLanguageEntryKinds(){
return LANG_ENTRY_KINDS.clone();
}
public static int[] getAllEntryKinds(){
return ALL_ENTRY_KINDS.clone();
}
private int indexToKind(int index){
switch (index){
case INDEX_INCLUDE_PATH:
return ICLanguageSettingEntry.INCLUDE_PATH;
case INDEX_INCLUDE_FILE:
return ICLanguageSettingEntry.INCLUDE_FILE;
case INDEX_MACRO:
return ICLanguageSettingEntry.MACRO;
case INDEX_MACRO_FILE:
return ICLanguageSettingEntry.MACRO_FILE;
case INDEX_LIBRARY_PATH:
return ICLanguageSettingEntry.LIBRARY_PATH;
case INDEX_LIBRARY_FILE:
return ICLanguageSettingEntry.LIBRARY_FILE;
case INDEX_SOURCE_PATH:
return ICSettingEntry.SOURCE_PATH;
case INDEX_OUPUT_PATH:
return ICSettingEntry.OUTPUT_PATH;
}
throw new IllegalArgumentException(UtilMessages.getString("KindBasedStore.1")); //$NON-NLS-1$
}
@SuppressWarnings("unchecked")
public T get(int kind){
return (T) fEntryStorage[kindToIndex(kind)];
}
public T put(int kind, T object){
int index = kindToIndex(kind);
@SuppressWarnings("unchecked")
T old = (T) fEntryStorage[index];
fEntryStorage[index] = object;
return old;
}
private class KindBasedInfo implements IKindBasedInfo<T> {
int fIdex;
int fKind;
KindBasedInfo(int num, boolean isKind){
if(isKind){
fIdex = kindToIndex(num);
fKind = num;
} else {
fIdex = num;
fKind = indexToKind(num);
}
}
public T getInfo() {
@SuppressWarnings("unchecked")
T info = (T)fEntryStorage[fIdex];
return info;
}
public int getKind() {
return fKind;
}
public T setInfo(T newInfo) {
@SuppressWarnings("unchecked")
T old = (T)fEntryStorage[fIdex];
fEntryStorage[fIdex] = newInfo;
return old;
}
}
public IKindBasedInfo<T>[] getContents(){
@SuppressWarnings("unchecked")
IKindBasedInfo<T> infos[] = new IKindBasedInfo[fEntryStorage.length];
for(int i = 0; i < fEntryStorage.length; i++){
infos[i] = new KindBasedInfo(i, false);
}
return infos;
}
public IKindBasedInfo<T> getInfo(int kind){
return new KindBasedInfo(kind, true);
}
public void clear(){
for(int i = 0; i < fEntryStorage.length; i++){
fEntryStorage[i] = null;
}
}
@Override
public Object clone() {
try {
@SuppressWarnings("unchecked")
KindBasedStore<T> clone = (KindBasedStore<T>)super.clone();
clone.fEntryStorage = fEntryStorage.clone();
return clone;
} catch (CloneNotSupportedException e) {
}
return null;
}
}