1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
/*******************************************************************************
* 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.DOMException;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter;
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 PDOMTemplateParameterArray {
/**
* Stores the given template arguments in the database.
* @return the record by which the arguments can be referenced.
*/
public static long putArray(final Database db, IPDOMCPPTemplateParameter[] params) throws CoreException {
final short len= (short) Math.min(params.length, (Database.MAX_MALLOC_SIZE-2)/8);
final long block= db.malloc(2+8*len);
long p= block;
db.putShort(p, len); p+=2;
for (int i=0; i<len; i++, p+=4) {
final IPDOMCPPTemplateParameter elem= params[i];
db.putRecPtr(p, elem == null ? 0 : elem.getRecord());
}
return block;
}
/**
* Restores an array of template arguments from the database.
*/
public static IPDOMCPPTemplateParameter[] getArray(PDOMNode parent, long rec) throws CoreException {
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)/8);
if (len == 0) {
return IPDOMCPPTemplateParameter.EMPTY_ARRAY;
}
rec+=2;
IPDOMCPPTemplateParameter[] result= new IPDOMCPPTemplateParameter[len];
for (int i=0; i<len; i++) {
final long nodeRec= db.getRecPtr(rec); rec+=4;
result[i]= nodeRec == 0 ? null : (IPDOMCPPTemplateParameter) linkage.getNode(nodeRec);
}
return result;
}
/**
* Creates template parameters in the pdom
*/
public static IPDOMCPPTemplateParameter[] createPDOMTemplateParameters(PDOMLinkage linkage, PDOMNode parent, ICPPTemplateParameter[] origParams) throws CoreException, DOMException {
IPDOMCPPTemplateParameter[] params= new IPDOMCPPTemplateParameter[origParams.length];
for (int i = 0; i < origParams.length; i++) {
params[i]= createPDOMTemplateParameter(linkage, parent, origParams[i]);
}
return params;
}
/**
* Creates a template parameter in the pdom
*/
public static IPDOMCPPTemplateParameter createPDOMTemplateParameter(PDOMLinkage linkage, PDOMNode parent, ICPPTemplateParameter origParam) throws CoreException, DOMException {
IPDOMCPPTemplateParameter param= null;
if (origParam instanceof ICPPTemplateNonTypeParameter) {
param= new PDOMCPPTemplateNonTypeParameter(linkage, parent, (ICPPTemplateNonTypeParameter) origParam);
} else if (origParam instanceof ICPPTemplateTypeParameter) {
param= new PDOMCPPTemplateTypeParameter(linkage, parent, (ICPPTemplateTypeParameter) origParam);
} else if (origParam instanceof ICPPTemplateTemplateParameter) {
param= new PDOMCPPTemplateTemplateParameter(linkage, parent, (ICPPTemplateTemplateParameter) origParam);
}
return param;
}
}
|