/******************************************************************************* * Copyright (c) 2009, 2011 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.pdom.dom.cpp; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecializationSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassTemplatePartialSpecialization; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; import org.eclipse.cdt.internal.core.pdom.db.Database; import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.core.runtime.CoreException; /** * A partial specialization further specialized in the context of a class specialization. */ class PDOMCPPClassTemplatePartialSpecializationSpecialization extends PDOMCPPClassTemplateSpecialization implements IPDOMPartialSpecialization, ICPPClassTemplatePartialSpecializationSpecialization { private static final int PRIMARY_TEMPLATE = PDOMCPPClassTemplateSpecialization.RECORD_SIZE; private static final int ARGUMENTS = PDOMCPPClassTemplateSpecialization.RECORD_SIZE+4; private static final int NEXT_PARTIAL = PDOMCPPClassTemplateSpecialization.RECORD_SIZE+8; @SuppressWarnings("hiding") protected static final int RECORD_SIZE= PDOMCPPClassTemplateSpecialization.RECORD_SIZE+12; private volatile ICPPClassTemplate fPrimaryTemplate; public PDOMCPPClassTemplatePartialSpecializationSpecialization(PDOMCPPLinkage linkage, PDOMNode parent, PDOMBinding specialized, ICPPClassTemplatePartialSpecialization partial, PDOMCPPClassTemplateSpecialization primary) throws CoreException { super(linkage, parent, partial, specialized); getDB().putRecPtr(record + PRIMARY_TEMPLATE, primary.getRecord()); linkage.new ConfigurePartialSpecialization(this, partial); } public PDOMCPPClassTemplatePartialSpecializationSpecialization(PDOMLinkage linkage, long bindingRecord) { super(linkage, bindingRecord); } @Override protected int getRecordSize() { return RECORD_SIZE; } @Override public int getNodeType() { return IIndexCPPBindingConstants.CPP_CLASS_TEMPLATE_PARTIAL_SPEC_SPEC; } @Override public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() throws DOMException { return ICPPClassTemplatePartialSpecialization.EMPTY_PARTIAL_SPECIALIZATION_ARRAY; } public PDOMCPPClassTemplatePartialSpecializationSpecialization getNextPartial() throws CoreException { long value = getDB().getRecPtr(record + NEXT_PARTIAL); return value != 0 ? new PDOMCPPClassTemplatePartialSpecializationSpecialization(getLinkage(), value) : null; } public void setNextPartial(PDOMCPPClassTemplatePartialSpecializationSpecialization partial) throws CoreException { long value = partial != null ? partial.getRecord() : 0; getDB().putRecPtr(record + NEXT_PARTIAL, value); } @Override public boolean isSameType(IType type) { if (type instanceof ITypedef) { return type.isSameType(this); } if (type instanceof PDOMNode) { PDOMNode node= (PDOMNode) type; if (node.getPDOM() == getPDOM()) { return node.getRecord() == getRecord(); } } if (!(type instanceof ICPPClassTemplatePartialSpecialization)) { return false; } final ICPPClassTemplatePartialSpecialization rhs = (ICPPClassTemplatePartialSpecialization)type; return CPPClassTemplatePartialSpecialization.isSamePartialClassSpecialization(this, rhs); } public ICPPClassTemplate getPrimaryClassTemplate() { if (fPrimaryTemplate == null) { try { int specializedRec = getDB().getInt(record + PRIMARY_TEMPLATE); fPrimaryTemplate= (ICPPClassTemplate) getLinkage().getNode(specializedRec); } catch (CoreException e) { CCorePlugin.log(e); } } return fPrimaryTemplate; } public void setArguments(ICPPTemplateArgument[] templateArguments) throws CoreException { final Database db = getPDOM().getDB(); long oldRec = db.getRecPtr(record+ARGUMENTS); long rec= PDOMCPPArgumentList.putArguments(this, templateArguments); db.putRecPtr(record+ARGUMENTS, rec); if (oldRec != 0) { PDOMCPPArgumentList.clearArguments(this, oldRec); } } public ICPPTemplateArgument[] getTemplateArguments() { try { final long rec= getPDOM().getDB().getRecPtr(record+ARGUMENTS); return PDOMCPPArgumentList.getArguments(this, rec); } catch (CoreException e) { CCorePlugin.log(e); return ICPPTemplateArgument.EMPTY_ARGUMENTS; } } @Deprecated public IType[] getArguments() { return CPPTemplates.getArguments(getTemplateArguments()); } }