/******************************************************************************* * Copyright (c) 2008, 2011 QNX Software Systems 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: * Bryan Wilkinson (QNX) - Initial API and implementation * Andrew Ferguson (Symbian) * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.index.IndexCPPSignatureUtil; import org.eclipse.cdt.internal.core.pdom.dom.IPDOMBinding; import org.eclipse.cdt.internal.core.pdom.dom.IPDOMOverloader; import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.core.runtime.CoreException; /** * Base class for specializations and instances of other bindings. */ abstract class PDOMCPPSpecialization extends PDOMCPPBinding implements ICPPSpecialization, IPDOMOverloader { private static final int ARGMAP = PDOMCPPBinding.RECORD_SIZE + 0; private static final int SIGNATURE_HASH = PDOMCPPBinding.RECORD_SIZE + 4; private static final int SPECIALIZED = PDOMCPPBinding.RECORD_SIZE + 8; /** * The size in bytes of a PDOMCPPSpecialization record in the database. */ @SuppressWarnings("hiding") protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 12; private volatile IBinding fSpecializedCache= null; private volatile ICPPTemplateParameterMap fArgMap; public PDOMCPPSpecialization(PDOMLinkage linkage, PDOMNode parent, ICPPSpecialization spec, IPDOMBinding specialized) throws CoreException { super(linkage, parent, spec.getNameCharArray()); getDB().putRecPtr(record + SPECIALIZED, specialized.getRecord()); // Specializations that are not instances have the same map as their owner. if (this instanceof ICPPTemplateInstance) { long rec= PDOMCPPTemplateParameterMap.putMap(this, spec.getTemplateParameterMap()); getDB().putRecPtr(record + ARGMAP, rec); } try { Integer sigHash = IndexCPPSignatureUtil.getSignatureHash(spec); getDB().putInt(record + SIGNATURE_HASH, sigHash != null ? sigHash.intValue() : 0); } catch (DOMException e) { } } public PDOMCPPSpecialization(PDOMLinkage linkage, long bindingRecord) { super(linkage, bindingRecord); } public IBinding getSpecializedBinding() { if (fSpecializedCache == null) { try { long specializedRec = getDB().getRecPtr(record + SPECIALIZED); fSpecializedCache= loadSpecializedBinding(specializedRec); } catch (CoreException e) { CCorePlugin.log(e); } } return fSpecializedCache; } protected IPDOMBinding loadSpecializedBinding(long specializedRec) throws CoreException { return (IPDOMBinding) getLinkage().getNode(specializedRec); } @Deprecated public ObjectMap getArgumentMap() { return CPPTemplates.getArgumentMap(this, getTemplateParameterMap()); } public ICPPTemplateParameterMap getTemplateParameterMap() { if (fArgMap == null) { try { if (this instanceof ICPPTemplateInstance) { fArgMap= PDOMCPPTemplateParameterMap.getMap(this, getDB().getRecPtr(record + ARGMAP)); } else { // specializations that are no instances have the same argmap as their owner. IBinding owner= getOwner(); if (owner instanceof ICPPSpecialization) { fArgMap= ((ICPPSpecialization) owner).getTemplateParameterMap(); } } } catch (CoreException e) { CCorePlugin.log(e); } } return fArgMap; } public int getSignatureHash() throws CoreException { return getDB().getInt(record + SIGNATURE_HASH); } }