1
/*******************************************************************************
2
* Copyright (c) 2007, 2010 Intel Corporation and others.
3
* All rights reserved. This program and the accompanying materials
4
* are made available under the terms of the Eclipse Public License v1.0
5
* which accompanies this distribution, and is available at
6
* http://www.eclipse.org/legal/epl-v10.html
9
* Intel Corporation - Initial API and implementation
10
*******************************************************************************/
11
package org.eclipse.cdt.core.settings.model.util;
13
import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry;
14
import org.eclipse.cdt.core.settings.model.ICSettingEntry;
17
* A storage where stored data is organized by "kind".
18
* In most cases kind is one of {@link ICLanguageSettingEntry}, i.e. include path, macro etc.
20
* @param <T> - stored type
22
* @see ICSettingEntry#INCLUDE_PATH
23
* @see ICSettingEntry#INCLUDE_FILE
24
* @see ICSettingEntry#MACRO
25
* @see ICSettingEntry#MACRO_FILE
26
* @see ICSettingEntry#LIBRARY_PATH
27
* @see ICSettingEntry#LIBRARY_FILE
28
* @see ICSettingEntry#OUTPUT_PATH
29
* @see ICSettingEntry#SOURCE_PATH
32
public class KindBasedStore<T> implements Cloneable {
33
private static final int INDEX_INCLUDE_PATH = 0;
34
private static final int INDEX_INCLUDE_FILE = 1;
35
private static final int INDEX_MACRO = 2;
36
private static final int INDEX_MACRO_FILE = 3;
37
private static final int INDEX_LIBRARY_PATH = 4;
38
private static final int INDEX_LIBRARY_FILE = 5;
39
private static final int LANG_STORAGE_SIZE = 6;
41
private static final int INDEX_SOURCE_PATH = 6;
42
private static final int INDEX_OUPUT_PATH = 7;
43
private static final int ALL_STORAGE_SIZE = 8;
45
public static final int ORED_LANG_ENTRY_KINDS =
46
ICLanguageSettingEntry.INCLUDE_PATH
47
| ICLanguageSettingEntry.INCLUDE_FILE
48
| ICLanguageSettingEntry.MACRO
49
| ICLanguageSettingEntry.MACRO_FILE
50
| ICLanguageSettingEntry.LIBRARY_PATH
51
| ICLanguageSettingEntry.LIBRARY_FILE;
53
public static final int ORED_ALL_ENTRY_KINDS =
54
ICLanguageSettingEntry.INCLUDE_PATH
55
| ICLanguageSettingEntry.INCLUDE_FILE
56
| ICLanguageSettingEntry.MACRO
57
| ICLanguageSettingEntry.MACRO_FILE
58
| ICLanguageSettingEntry.LIBRARY_PATH
59
| ICLanguageSettingEntry.LIBRARY_FILE
60
| ICLanguageSettingEntry.SOURCE_PATH
61
| ICLanguageSettingEntry.OUTPUT_PATH;
63
private static final int LANG_ENTRY_KINDS[] = new int[]{
64
ICLanguageSettingEntry.INCLUDE_PATH,
65
ICLanguageSettingEntry.INCLUDE_FILE,
66
ICLanguageSettingEntry.MACRO,
67
ICLanguageSettingEntry.MACRO_FILE,
68
ICLanguageSettingEntry.LIBRARY_PATH,
69
ICLanguageSettingEntry.LIBRARY_FILE,
72
private static final int ALL_ENTRY_KINDS[] = new int[]{
73
ICLanguageSettingEntry.INCLUDE_PATH,
74
ICLanguageSettingEntry.INCLUDE_FILE,
75
ICLanguageSettingEntry.MACRO,
76
ICLanguageSettingEntry.MACRO_FILE,
77
ICLanguageSettingEntry.LIBRARY_PATH,
78
ICLanguageSettingEntry.LIBRARY_FILE,
79
ICLanguageSettingEntry.SOURCE_PATH,
80
ICLanguageSettingEntry.OUTPUT_PATH,
83
// private static final int INEXISTENT_INDEX = -1;
85
private Object[] fEntryStorage;
87
public KindBasedStore(){
91
public KindBasedStore(boolean langOnly){
93
fEntryStorage = new Object[LANG_STORAGE_SIZE];
95
fEntryStorage = new Object[ALL_STORAGE_SIZE];
98
private int kindToIndex(int kind){
100
case ICLanguageSettingEntry.INCLUDE_PATH:
101
return INDEX_INCLUDE_PATH;
102
case ICLanguageSettingEntry.INCLUDE_FILE:
103
return INDEX_INCLUDE_FILE;
104
case ICLanguageSettingEntry.MACRO:
106
case ICLanguageSettingEntry.MACRO_FILE:
107
return INDEX_MACRO_FILE;
108
case ICLanguageSettingEntry.LIBRARY_PATH:
109
return INDEX_LIBRARY_PATH;
110
case ICLanguageSettingEntry.LIBRARY_FILE:
111
return INDEX_LIBRARY_FILE;
112
case ICSettingEntry.SOURCE_PATH:
113
if(INDEX_SOURCE_PATH < fEntryStorage.length)
114
return INDEX_SOURCE_PATH;
116
case ICSettingEntry.OUTPUT_PATH:
117
if(INDEX_OUPUT_PATH < fEntryStorage.length)
118
return INDEX_OUPUT_PATH;
121
throw new IllegalArgumentException(UtilMessages.getString("KindBasedStore.0")); //$NON-NLS-1$
124
public static int[] getLanguageEntryKinds(){
125
return LANG_ENTRY_KINDS.clone();
128
public static int[] getAllEntryKinds(){
129
return ALL_ENTRY_KINDS.clone();
132
private int indexToKind(int index){
134
case INDEX_INCLUDE_PATH:
135
return ICLanguageSettingEntry.INCLUDE_PATH;
136
case INDEX_INCLUDE_FILE:
137
return ICLanguageSettingEntry.INCLUDE_FILE;
139
return ICLanguageSettingEntry.MACRO;
140
case INDEX_MACRO_FILE:
141
return ICLanguageSettingEntry.MACRO_FILE;
142
case INDEX_LIBRARY_PATH:
143
return ICLanguageSettingEntry.LIBRARY_PATH;
144
case INDEX_LIBRARY_FILE:
145
return ICLanguageSettingEntry.LIBRARY_FILE;
146
case INDEX_SOURCE_PATH:
147
return ICSettingEntry.SOURCE_PATH;
148
case INDEX_OUPUT_PATH:
149
return ICSettingEntry.OUTPUT_PATH;
151
throw new IllegalArgumentException(UtilMessages.getString("KindBasedStore.1")); //$NON-NLS-1$
153
@SuppressWarnings("unchecked")
154
public T get(int kind){
155
return (T) fEntryStorage[kindToIndex(kind)];
158
public T put(int kind, T object){
159
int index = kindToIndex(kind);
160
@SuppressWarnings("unchecked")
161
T old = (T) fEntryStorage[index];
162
fEntryStorage[index] = object;
166
private class KindBasedInfo implements IKindBasedInfo<T> {
170
KindBasedInfo(int num, boolean isKind){
172
fIdex = kindToIndex(num);
176
fKind = indexToKind(num);
181
@SuppressWarnings("unchecked")
182
T info = (T)fEntryStorage[fIdex];
186
public int getKind() {
190
public T setInfo(T newInfo) {
191
@SuppressWarnings("unchecked")
192
T old = (T)fEntryStorage[fIdex];
193
fEntryStorage[fIdex] = newInfo;
199
public IKindBasedInfo<T>[] getContents(){
200
@SuppressWarnings("unchecked")
201
IKindBasedInfo<T> infos[] = new IKindBasedInfo[fEntryStorage.length];
202
for(int i = 0; i < fEntryStorage.length; i++){
203
infos[i] = new KindBasedInfo(i, false);
208
public IKindBasedInfo<T> getInfo(int kind){
209
return new KindBasedInfo(kind, true);
213
for(int i = 0; i < fEntryStorage.length; i++){
214
fEntryStorage[i] = null;
219
public Object clone() {
221
@SuppressWarnings("unchecked")
222
KindBasedStore<T> clone = (KindBasedStore<T>)super.clone();
223
clone.fEntryStorage = fEntryStorage.clone();
225
} catch (CloneNotSupportedException e) {