/** * <copyright> * </copyright> * * $Id$ */ package net.sf.orcc.cache.impl; import java.util.HashMap; import java.util.Map; import net.sf.orcc.cache.Cache; import net.sf.orcc.cache.CacheFactory; import net.sf.orcc.cache.CacheManager; import net.sf.orcc.cache.CachePackage; import org.eclipse.emf.common.util.EMap; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.impl.EObjectImpl; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.util.Switch; /** * <!-- begin-user-doc --> An implementation of the model object ' * <em><b>Manager</b></em>'. <!-- end-user-doc --> * <p> * </p> * * @generated */ public class CacheManagerImpl extends EObjectImpl implements CacheManager { private final Map<Resource, Cache> cacheMap = new HashMap<Resource, Cache>(); /** * <!-- begin-user-doc --> <!-- end-user-doc --> * @generated */ protected CacheManagerImpl() { super(); } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * @generated */ @Override protected EClass eStaticClass() { return CachePackage.Literals.CACHE_MANAGER; } @Override public Cache getCache(Resource resource) { Cache cache = cacheMap.get(resource); if (cache == null) { cache = CacheFactory.eINSTANCE.createCache(); cacheMap.put(resource, cache); } return cache; } @Override public <F extends EObject, T> T getOrCompute(F astObject, Switch<T> switchInst, EStructuralFeature featureMap) { Resource resource = astObject.eResource(); T result; if (resource == null) { result = switchInst.doSwitch(astObject); } else { Cache cache = getCache(resource); @SuppressWarnings("unchecked") EMap<EObject, T> map = (EMap<EObject, T>) cache.eGet(featureMap); result = map.get(astObject); if (result == null) { result = switchInst.doSwitch(astObject); if (result != null) { map.put(astObject, result); } } } return result; } @Override public void unloadAllCaches() { cacheMap.clear(); } }