/*******************************************************************************
* Copyright (c) 2008, 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.pdom.dom.cpp;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.ISemanticProblem;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.internal.core.dom.parser.ProblemType;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateTypeArgument;
import org.eclipse.cdt.internal.core.pdom.db.Database;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
/**
* Collects methods to store an argument list in the database
*/
public class PDOMCPPArgumentList {
private static final int NODE_SIZE = Database.ARGUMENT_SIZE;
/**
* Stores the given template arguments in the database.
* @return the record by which the arguments can be referenced.
*/
public static long putArguments(PDOMNode parent, ICPPTemplateArgument[] templateArguments) throws CoreException {
final PDOMLinkage linkage= parent.getLinkage();
final Database db= linkage.getDB();
final short len= (short) Math.min(templateArguments.length, (Database.MAX_MALLOC_SIZE - 2) / NODE_SIZE);
final long block= db.malloc(2 + NODE_SIZE * len);
long p= block;
db.putShort(p, len);
p += 2;
for (int i= 0; i < len; i++, p += NODE_SIZE) {
final ICPPTemplateArgument arg = templateArguments[i];
linkage.storeTemplateArgument(p, arg);
}
return block;
}
/**
* Restores an array of template arguments from the database.
*/
public static void clearArguments(PDOMNode parent, final long record) throws CoreException {
final PDOMLinkage linkage= parent.getLinkage();
final Database db= linkage.getDB();
final short len= db.getShort(record);
Assert.isTrue(len >= 0 && len <= (Database.MAX_MALLOC_SIZE - 2) / NODE_SIZE);
long p= record + 2;
for (int i= 0; i < len; i++) {
linkage.storeTemplateArgument(p, null);
p+= NODE_SIZE;
}
db.free(record);
}
/**
* Restores an array of template arguments from the database.
*/
public static ICPPTemplateArgument[] getArguments(PDOMNode parent, long rec) throws CoreException {
if (rec == 0) {
CCorePlugin.log(new IllegalArgumentException(
"Trying to access template arguments before they have been stored.")); //$NON-NLS-1$
return ICPPTemplateArgument.EMPTY_ARGUMENTS;
}
final PDOMLinkage linkage= parent.getLinkage();
final Database db= linkage.getDB();
final short len= db.getShort(rec);
Assert.isTrue(len >= 0 && len <= (Database.MAX_MALLOC_SIZE - 2) / NODE_SIZE);
if (len == 0) {
return ICPPTemplateArgument.EMPTY_ARGUMENTS;
}
rec += 2;
ICPPTemplateArgument[] result= new ICPPTemplateArgument[len];
for (int i= 0; i < len; i++) {
ICPPTemplateArgument arg= linkage.loadTemplateArgument(rec);
if (arg == null) {
arg= new CPPTemplateTypeArgument(new ProblemType(ISemanticProblem.TYPE_NOT_PERSISTED));
}
result[i]= arg;
rec += NODE_SIZE;
}
return result;
}
}