blob: 336084d1b52b950ba9bf512ca864c9147ffe71a9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 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:
* Robert M. Fuhrer (rfuhrer@watson.ibm.com), IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets;
import java.util.Iterator;
import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types.ArrayType;
import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types.TType;
import org.eclipse.jdt.internal.corext.refactoring.typeconstraints2.TTypes;
/**
* Represents the set of array types whose element types are in a given TypeSet.
* I.e., ArrayTypeSet(S) = { x[] | x \in S }
*/
public class ArrayTypeSet extends TypeSet {
protected TypeSet fElemTypeSet;
protected ArrayTypeSet(TypeSetEnvironment typeSetEnvironment) {
super(typeSetEnvironment);
}
public ArrayTypeSet(TypeSet s) {
super(s.getTypeSetEnvironment());
fElemTypeSet= s;
}
/**
* @return Returns the element TypeSet.
*/
public TypeSet getElemTypeSet() {
return fElemTypeSet;
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#isUniverse()
*/
public boolean isUniverse() {
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#makeClone()
*/
public TypeSet makeClone() {
return new ArrayTypeSet(fElemTypeSet);
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#isEmpty()
*/
public boolean isEmpty() {
return fElemTypeSet.isEmpty();
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#upperBound()
*/
public TypeSet upperBound() {
return new ArrayTypeSet(fElemTypeSet.upperBound());
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#lowerBound()
*/
public TypeSet lowerBound() {
return new ArrayTypeSet(fElemTypeSet.lowerBound());
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#hasUniqueLowerBound()
*/
public boolean hasUniqueLowerBound() {
return fElemTypeSet.hasUniqueLowerBound();
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#hasUniqueUpperBound()
*/
public boolean hasUniqueUpperBound() {
return fElemTypeSet.hasUniqueUpperBound();
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#uniqueLowerBound()
*/
public TType uniqueLowerBound() {
return TTypes.createArrayType(fElemTypeSet.uniqueLowerBound(), 1);
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#uniqueUpperBound()
*/
public TType uniqueUpperBound() {
return TTypes.createArrayType(fElemTypeSet.uniqueUpperBound(), 1);
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#contains(TType)
*/
public boolean contains(TType t) {
if (!(t instanceof ArrayType))
return false;
ArrayType at= (ArrayType) t;
return fElemTypeSet.contains(at.getComponentType());
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#containsAll(org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet)
*/
public boolean containsAll(TypeSet s) {
if (s instanceof ArrayTypeSet && !(s instanceof ArraySuperTypeSet)) {
ArrayTypeSet ats= (ArrayTypeSet) s;
return fElemTypeSet.containsAll(ats.fElemTypeSet);
}
for(Iterator iter= s.iterator(); iter.hasNext(); ) {
TType t= (TType) iter.next();
if (!contains(t))
return false;
}
return true;
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#iterator()
*/
public Iterator iterator() {
if (fEnumCache != null) return fEnumCache.iterator();
return new Iterator() {
Iterator fElemIter= fElemTypeSet.iterator();
public boolean hasNext() {
return fElemIter.hasNext();
}
public Object next() {
return TTypes.createArrayType(((TType) fElemIter.next()), 1);
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
private EnumeratedTypeSet fEnumCache= null;
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#enumerate()
*/
public EnumeratedTypeSet enumerate() {
if (fEnumCache == null) {
fEnumCache= new EnumeratedTypeSet(getTypeSetEnvironment());
for(Iterator iter= fElemTypeSet.iterator(); iter.hasNext(); ) {
TType t= (TType) iter.next();
fEnumCache.add(TTypes.createArrayType(t, 1));
}
fEnumCache.initComplete();
}
return fEnumCache;
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#isSingleton()
*/
public boolean isSingleton() {
return fElemTypeSet.isSingleton();
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#anyMember()
*/
public TType anyMember() {
return TTypes.createArrayType(fElemTypeSet.anyMember(), 1);
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.corext.refactoring.typeconstraints.typesets.TypeSet#superTypes()
*/
public TypeSet superTypes() {
return new ArraySuperTypeSet(fElemTypeSet);
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object obj) {
if (obj == this) return true;
if (obj instanceof ArrayTypeSet) {
ArrayTypeSet other= (ArrayTypeSet) obj;
return fElemTypeSet.equals(other.fElemTypeSet);
}
return false;
}
public String toString() {
return "{" + fID + ": array(" + fElemTypeSet + ")}"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
}