/******************************************************************************* * Copyright (c) 2010, 2012 Wind River Systems, Inc. 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: * Markus Schorn - initial API and implementation *******************************************************************************/ 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.IASTNode; 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.semantics.Cost.Rank; /** * Used during overload resolution as a place-holder for function sets. */ public class FunctionSetType implements IType { private final CPPFunctionSet fFunctionSet; private final boolean fPointerType; public FunctionSetType(CPPFunctionSet set, boolean addressOf) { fFunctionSet= set; fPointerType= addressOf; } @Override public boolean isSameType(IType type) { return type instanceof FunctionSetType && fFunctionSet == ((FunctionSetType) type).fFunctionSet; } @Override public Object clone() { throw new UnsupportedOperationException(); } public ValueCategory getValueCategory() { return fPointerType ? PRVALUE : LVALUE; } public Cost costForTarget(IType paramType, IASTNode point) { IBinding result = CPPSemantics.resolveTargetedFunction(paramType, fFunctionSet, point); 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) { fFunctionSet.applySelectedFunction(selectedFunction); } public CPPFunctionSet getFunctionSet() { return fFunctionSet; } public void setToUnknown() { fFunctionSet.setToUnknown(); } }