/* * FunctionSetType.java * Created on Sep 14, 2010 * * Copyright 2010 Wind River Systems, Inc. All rights reserved. */ package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics; import static org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory.LVALUE; import static org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory.PRVALUE; import org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownFunction; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.Cost.Rank; /** * Used during overload resolution as a place-holder for function sets. */ public class FunctionSetType implements IType { private ICPPFunction[] fFunctionSet; private boolean fPointerType; private IASTName fName; public FunctionSetType(ICPPFunction[] functions, IASTName name, boolean addressOf) { fName= name; fFunctionSet= functions; fPointerType= addressOf; } public boolean isSameType(IType type) { return type == this; } @Override public Object clone() { throw new UnsupportedOperationException(); } public ValueCategory getValueCategory() { return fPointerType ? PRVALUE : LVALUE; } public Cost costForTarget(IType paramType) { IBinding result = CPPSemantics.resolveTargetedFunction(paramType, fName, fFunctionSet); if (result instanceof ICPPFunction && !(result instanceof IProblemBinding)) { Cost c= new Cost(paramType, paramType, Rank.IDENTITY); c.setSelectedFunction((ICPPFunction) result); return c; } return Cost.NO_CONVERSION; } public void applySelectedFunction(ICPPFunction selectedFunction) { if (selectedFunction != null) { fName.setBinding(selectedFunction); } } public ICPPFunction[] getFunctionSet() { return fFunctionSet; } public void setToUnknown() { fName.setBinding(new CPPUnknownFunction(null, fName.toCharArray())); } }