content: /*******************************************************************************
   * Copyright (c) 2005, 2007 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
   *******************************************************************************/
  
  package org.eclipse.wst.jsdt.internal.corext.refactoring.typeconstraints.typesets;
  
  import java.util.LinkedHashMap;
  import java.util.Map;
  
  import org.eclipse.wst.jsdt.internal.corext.refactoring.typeconstraints.types.TType;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.typeconstraints.types.TypeEnvironment;
  
  
  
  public class TypeSetEnvironment {
  
  	private final TypeEnvironment fTypeEnvironment;
  	private final TypeUniverseSet fUniverse;
  	private final EmptyTypeSet fEmptyTypeSet;
  	
  	private final Map/*<TType, SubTypesOfSingleton>*/ fSubtypesOfSingletons= new LinkedHashMap();//@perf
  	private final Map/*<TType, SubTypesSet>*/ fSubTypesSets= new LinkedHashMap();//@perf
  	private final Map/*<TType, SuperTypesOfSingleton>*/ fSuperTypesOfSingletons= new LinkedHashMap();//@perf
  	private final Map/*<TType, SuperTypesSet>*/ fSuperTypesSets= new LinkedHashMap();//@perf
  	
  	private int fgCommonExprHits= 0;
  	private int fgCommonExprMisses= 0;
  
  	public TypeSetEnvironment(TypeEnvironment typeEnvironment) {
  		fTypeEnvironment= typeEnvironment;
  		fUniverse= new TypeUniverseSet(this);
  		fEmptyTypeSet= new EmptyTypeSet(this);
  	}
  
  	public TType getJavaLangObject() {
  		return fTypeEnvironment.getJavaLangObject();
  	}
  
  	public TypeUniverseSet getUniverseTypeSet() {
  		return fUniverse;
  	}
  
  	public EmptyTypeSet getEmptyTypeSet() {
  		return fEmptyTypeSet;
  	}
  
  	public SubTypesOfSingleton createSubTypesOfSingleton(TType superType) {
  		if (superType.isJavaLangObject())
  			return this.getUniverseTypeSet();
  		if (fSubtypesOfSingletons.containsKey(superType)) {
  			fgCommonExprHits++;
  			return (SubTypesOfSingleton) fSubtypesOfSingletons.get(superType);
  		} else {
  			SubTypesOfSingleton s= new SubTypesOfSingleton(superType, this);
  	
  			fgCommonExprMisses++;
  			fSubtypesOfSingletons.put(superType, s);
  			return s;
  		}
  	}
  
  	public SubTypesSet createSubTypesSet(TypeSet superTypes) {
  		if (fSubTypesSets.containsKey(superTypes)) {
  			fgCommonExprHits++;
  			return (SubTypesSet) fSubTypesSets.get(superTypes);
  		} else {
  			SubTypesSet s= new SubTypesSet(superTypes);
  	
  			fgCommonExprMisses++;
  			fSubTypesSets.put(superTypes, s);
  			return s;
  		}
  	}
  
  	public SuperTypesOfSingleton createSuperTypesOfSingleton(TType subType) {
  		if (fSuperTypesOfSingletons.containsKey(subType)) {
  			fgCommonExprHits++;
  			return (SuperTypesOfSingleton) fSuperTypesOfSingletons.get(subType);
  		} else {
  			SuperTypesOfSingleton s= new SuperTypesOfSingleton(subType, this);
  	
  			fgCommonExprMisses++;
  			fSuperTypesOfSingletons.put(subType, s);
  			return s;
  		}
  	}
  
  	public SuperTypesSet createSuperTypesSet(TType subType) {
  		if (fSuperTypesSets.containsKey(subType)) {
  			fgCommonExprHits++;
  			return (SuperTypesSet) fSuperTypesSets.get(subType);
  		} else {
  			SuperTypesSet s= new SuperTypesSet(subType, this);
  	
  			fgCommonExprMisses++;
  			fSuperTypesSets.put(subType, s);
  			return s;
  		}
  	}
  
  	public SuperTypesSet createSuperTypesSet(TypeSet subTypes) {
  		if (fSuperTypesSets.containsKey(subTypes))
  			return (SuperTypesSet) fSuperTypesSets.get(subTypes);
  		else {
  			SuperTypesSet s= new SuperTypesSet(subTypes, this);
  	
  			fSuperTypesSets.put(subTypes, s);
  			return s;
  		}
  	}
  
  	public void dumpStats() {
  		System.out.println("Common expression hits:   " + fgCommonExprHits); //$NON-NLS-1$
  		System.out.println("Common expression misses: " + fgCommonExprMisses); //$NON-NLS-1$
  	}
  
  }
  