content: /*******************************************************************************
   * Copyright (c) 2000, 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.typeconstraints2;
  
  import org.eclipse.core.runtime.Assert;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.typeconstraints.types.TType;
  
  public abstract class ConstraintVariable2 {
  
  	public static final String TO_STRING= "toString"; //$NON-NLS-1$
  
  	private Object[] fDatas;
  
  	private TypeEquivalenceSet fTypeEquivalenceSet;
  
  	protected final TType fType;
  
  	/**
  	 * @param type the type
  	 */
  	protected ConstraintVariable2(TType type) {
  		fType= type;
  	}
  
  	public Object getData(String name) {
  		if (fDatas == null) {
  			return null;
  		} else {
  			for (int i= 0; i < fDatas.length; i+= 2) {
  				String key= (String) fDatas[i];
  				if (key.equals(name))
  					return fDatas[i + 1];
  			}
  			return null;
  		}
  	}
  
  	public TypeEquivalenceSet getTypeEquivalenceSet() {
  		return fTypeEquivalenceSet;
  	}
  
  	/**
  	 * @return the type binding, or <code>null</code> iff the type constraint variable has no type in the original source (e.g. {@link CollectionElementVariable2})
  	 */
  	public TType getType() {
  		return fType;
  	}
  
  	public ITypeSet getTypeEstimate() {
  		Assert.isNotNull(fTypeEquivalenceSet);
  		return fTypeEquivalenceSet.getTypeEstimate();
  	}
  
  	public void setData(String name, Object data) {
  		int index= 0;
  		if (fDatas != null) {
  			while (index < fDatas.length) {
  				if (name.equals(fDatas[index]))
  					break;
  				index+= 2;
  			}
  		}
  		if (data != null) { // add
  			if (fDatas != null) {
  				if (index == fDatas.length) {
  					Object[] newTable= new Object[fDatas.length + 2];
  					System.arraycopy(fDatas, 0, newTable, 0, fDatas.length);
  					fDatas= newTable;
  				}
  			} else {
  				fDatas= new Object[2];
  			}
  			fDatas[index]= name;
  			fDatas[index + 1]= data;
  		} else { // remove
  			if (fDatas != null) {
  				if (index != fDatas.length) {
  					int length= fDatas.length - 2;
  					if (length == 0) {
  						fDatas= null;
  					} else {
  						Object[] newTable= new Object[length];
  						System.arraycopy(fDatas, 0, newTable, 0, index);
  						System.arraycopy(fDatas, index + 2, newTable, index, length - index);
  						fDatas= newTable;
  					}
  				}
  			}
  		}
  	}
  
  	public void setTypeEquivalenceSet(TypeEquivalenceSet set) {
  		fTypeEquivalenceSet= set;
  	}
  
  	public String toString() {
  		String toString= (String) getData(TO_STRING);
  		if (toString != null)
  			return toString;
  
  		String name= getClass().getName();
  		int dot= name.lastIndexOf('.');
  		return name.substring(dot + 1) + ": " + fType != null ? fType.getPrettySignature() : "<NONE>"; //$NON-NLS-1$ //$NON-NLS-2$
  	}
  }
  