/******************************************************************************* * Copyright (c) 2008, 2009 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.dom.ast.IType; 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; /** * Stores a list of types */ class PDOMCPPTypeList { private static final int NODE_SIZE = Database.TYPE_SIZE; /** * Stores the given types in the database. * @return the record by which the types can be referenced. */ public static long putTypes(PDOMNode parent, IType[] types) throws CoreException { if (types == null) return 0; final PDOMLinkage linkage= parent.getLinkage(); final Database db= linkage.getDB(); final short len = (short)Math.min(types.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 IType type = types[i]; linkage.storeType(p, type); } return block; } public static IType[] getTypes(PDOMNode parent, long rec) throws CoreException { if (rec == 0) return null; final PDOMLinkage linkage= parent.getLinkage(); final Database db= linkage.getDB(); final short len = db.getShort(rec); if (len == 0) return IType.EMPTY_TYPE_ARRAY; Assert.isTrue(len >= 0 && len <= (Database.MAX_MALLOC_SIZE-2)/NODE_SIZE); rec+=2; IType[] result= new IType[len]; for (int i=0; i<len; i++, rec+=NODE_SIZE) { result[i]= linkage.loadType(rec); } return result; } /** * Restores an array of template arguments from the database. */ public static void clearTypes(PDOMNode parent, final long record) throws CoreException { if (record == 0) return; 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++, p+=NODE_SIZE) { linkage.storeType(p, null); } db.free(record); } }