/*******************************************************************************
* Copyright (c) 2006, 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:
* QNX - Initial API and implementation
* IBM Corporation
* Andrew Ferguson (Symbian)
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.dom;
import java.util.Arrays;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.parser.util.CharArrayUtils;
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
import org.eclipse.cdt.internal.core.pdom.db.Database;
import org.eclipse.cdt.internal.core.pdom.db.IString;
import org.eclipse.core.runtime.CoreException;
/**
* @author Doug Schaefer
*
*/
public abstract class PDOMNamedNode extends PDOMNode {
/**
* Offset of pointer to node name (relative to the beginning of the record).
*/
private static final int NAME = PDOMNode.RECORD_SIZE + 0;
/**
* The size in bytes of a PDOMNamedNode record in the database.
*/
@SuppressWarnings("hiding")
protected static final int RECORD_SIZE = PDOMNode.RECORD_SIZE + 4;
private volatile char[] fName;
public PDOMNamedNode(PDOMLinkage linkage, long record) {
super(linkage, record);
}
public PDOMNamedNode(PDOMLinkage linkage, PDOMNode parent, char[] name) throws CoreException {
super(linkage, parent);
fName= name;
final Database db = linkage.getDB();
db.putRecPtr(record + NAME, name != null ? db.newString(name).getRecord() : 0);
}
/**
* For linkages, only.
*/
protected PDOMNamedNode(Database db, char[] name) throws CoreException {
super(db);
fName= name;
db.putRecPtr(record + NAME, name != null ? db.newString(name).getRecord() : 0);
}
@Override
abstract protected int getRecordSize();
public IString getDBName() throws CoreException {
return getDBName(getDB(), record);
}
public static IString getDBName(Database db, long record) throws CoreException {
long namerec = db.getRecPtr(record + NAME);
return db.getString(namerec);
}
public char[] getNameCharArray() throws CoreException {
if (fName != null)
return fName;
return fName= getDBName().getChars();
}
public boolean hasName(char[] name) throws CoreException {
if (fName != null)
return Arrays.equals(fName, name);
return getDBName().equals(name);
}
/**
* Template parameters need to update their name.
* @throws CoreException
*/
protected void updateName(char[] nameCharArray) throws CoreException {
if (fName != null && CharArrayUtils.equals(fName, nameCharArray))
return;
IString name= getDBName();
if (!name.equals(nameCharArray)) {
name.delete();
final Database db= getDB();
db.putRecPtr(record + NAME, db.newString(nameCharArray).getRecord());
}
fName= nameCharArray;
}
@Override
public void delete(PDOMLinkage linkage) throws CoreException {
final Database db = getDB();
final long namerec= db.getRecPtr(record + NAME);
if (namerec != 0) {
db.free(namerec);
}
super.delete(linkage);
}
public boolean mayHaveChildren() {
return false;
}
public IIndexFragmentBinding getParentBinding() throws CoreException {
PDOMNode parent= getParentNode();
if (parent instanceof IIndexFragmentBinding) {
return (IIndexFragmentBinding) parent;
}
return null;
}
public IIndexFragmentBinding getOwner() {
try {
return getParentBinding();
} catch (CoreException e) {
CCorePlugin.log(e);
}
return null;
}
}