blob: a03ad056cd9c6429cb06a18033c0edf5390bd804 [file] [log] [blame]
package org.eclipse.cdt.internal.core.model;
/**********************************************************************
* Copyright (c) 2002,2003 Rational Software Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v0.5
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v05.html
*
* Contributors:
* Rational Software - Initial API and implementation
***********************************************************************/
import java.util.HashMap;
import java.util.Map;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.internal.core.util.OverflowingLRUCache;
/**
* The cache of C elements to their respective info.
*
* This class is similar to the JDT CModelCache class.
*/
public class CModelCache {
public static final int PROJ_CACHE_SIZE = 50;
public static final int FOLDER_CACHE_SIZE = 500;
public static final int FILE_CACHE_SIZE = 2000;
public static final int CHILDREN_CACHE_SIZE = FILE_CACHE_SIZE * 20;
/**
* Cache of open projects and roots.
*/
protected Map projectAndRootCache;
/**
* Cache of open containers
*/
protected Map folderCache;
/**
* Cache of open translation unit files
*/
protected OverflowingLRUCache fileCache;
/**
* Cache of children of C elements
*/
protected Map childrenCache;
public CModelCache() {
this.projectAndRootCache = new HashMap(PROJ_CACHE_SIZE);
this.folderCache = new HashMap(FOLDER_CACHE_SIZE);
this.fileCache = new ElementCache(FILE_CACHE_SIZE);
this.childrenCache = new HashMap(CHILDREN_CACHE_SIZE); // average 20 children per openable
}
public double openableFillingRatio() {
return this.fileCache.fillingRatio();
}
/**
* Returns the info for the element.
*/
public Object getInfo(ICElement element) {
switch (element.getElementType()) {
case ICElement.C_MODEL:
case ICElement.C_PROJECT:
return this.projectAndRootCache.get(element);
case ICElement.C_CCONTAINER:
return this.folderCache.get(element);
case ICElement.C_ARCHIVE:
case ICElement.C_BINARY:
case ICElement.C_UNIT:
return this.fileCache.get(element);
default:
return this.childrenCache.get(element);
}
}
/**
* Returns the info for this element without
* disturbing the cache ordering.
*/
protected Object peekAtInfo(ICElement element) {
switch (element.getElementType()) {
case ICElement.C_MODEL:
case ICElement.C_PROJECT:
return this.projectAndRootCache.get(element);
case ICElement.C_CCONTAINER:
return this.folderCache.get(element);
case ICElement.C_ARCHIVE:
case ICElement.C_BINARY:
case ICElement.C_UNIT:
return this.fileCache.peek(element);
default:
return this.childrenCache.get(element);
}
}
/**
* Remember the info for the element.
*/
protected void putInfo(ICElement element, Object info) {
switch (element.getElementType()) {
case ICElement.C_MODEL:
case ICElement.C_PROJECT:
this.projectAndRootCache.put(element, info);
break;
case ICElement.C_CCONTAINER:
this.folderCache.put(element, info);
break;
case ICElement.C_ARCHIVE:
case ICElement.C_BINARY:
case ICElement.C_UNIT:
this.fileCache.put(element, info);
break;
default:
this.childrenCache.put(element, info);
}
}
/**
* Removes the info of the element from the cache.
*/
protected void removeInfo(ICElement element) {
switch (element.getElementType()) {
case ICElement.C_MODEL:
case ICElement.C_PROJECT:
this.projectAndRootCache.remove(element);
break;
case ICElement.C_CCONTAINER:
this.folderCache.remove(element);
break;
case ICElement.C_ARCHIVE:
case ICElement.C_BINARY:
case ICElement.C_UNIT:
this.fileCache.remove(element);
break;
default:
this.childrenCache.remove(element);
}
}
}