1/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17import java.util.HashMap;
18
19public class JType {
20
21    String baseType;
22    boolean isArray;
23    boolean isClass;
24    boolean isString;
25
26    static HashMap<CType,JType> typeMapping = new HashMap<CType,JType>();
27    static HashMap<CType,JType> arrayTypeMapping = new HashMap<CType,JType>();
28
29    static {
30    // Primitive types
31    typeMapping.put(new CType("GLbitfield"), new JType("int"));
32    typeMapping.put(new CType("GLboolean"), new JType("boolean"));
33    typeMapping.put(new CType("GLclampf"), new JType("float"));
34    typeMapping.put(new CType("GLclampx"), new JType("int"));
35    typeMapping.put(new CType("GLenum"), new JType("int"));
36    typeMapping.put(new CType("GLfloat"), new JType("float"));
37    typeMapping.put(new CType("GLfixed"), new JType("int"));
38    typeMapping.put(new CType("GLint"), new JType("int"));
39    typeMapping.put(new CType("GLintptr"), new JType("int"));
40    typeMapping.put(new CType("GLshort"), new JType("short"));
41    typeMapping.put(new CType("GLsizei"), new JType("int"));
42    typeMapping.put(new CType("GLsizeiptr"), new JType("int"));
43    typeMapping.put(new CType("GLubyte"), new JType("byte"));
44    typeMapping.put(new CType("GLuint"), new JType("int"));
45    typeMapping.put(new CType("void"), new JType("void"));
46    typeMapping.put(new CType("GLubyte", true, true), new JType("String", false, false));
47    typeMapping.put(new CType("char", false, true), new JType("byte"));
48    typeMapping.put(new CType("char", true, true), new JType("String", false, false));
49    typeMapping.put(new CType("int"), new JType("int"));
50
51    // Untyped pointers map to untyped Buffers
52    typeMapping.put(new CType("GLvoid", true, true),
53            new JType("java.nio.Buffer", true, false));
54    typeMapping.put(new CType("GLvoid", false, true),
55            new JType("java.nio.Buffer", true, false));
56    typeMapping.put(new CType("void", false, true),
57            new JType("java.nio.Buffer", true, false));
58    typeMapping.put(new CType("GLeglImageOES", false, false),
59            new JType("java.nio.Buffer", true, false));
60
61    // Typed pointers map to typed Buffers
62    typeMapping.put(new CType("GLboolean", false, true),
63            new JType("java.nio.IntBuffer", true, false));
64    typeMapping.put(new CType("GLenum", false, true),
65            new JType("java.nio.IntBuffer", true, false));
66    typeMapping.put(new CType("GLfixed", false, true),
67            new JType("java.nio.IntBuffer", true, false));
68    typeMapping.put(new CType("GLfixed", true, true),
69            new JType("java.nio.IntBuffer", true, false));
70    typeMapping.put(new CType("GLfloat", false, true),
71            new JType("java.nio.FloatBuffer", true, false));
72    typeMapping.put(new CType("GLfloat", true, true),
73            new JType("java.nio.FloatBuffer", true, false));
74    typeMapping.put(new CType("GLint", false, true),
75            new JType("java.nio.IntBuffer", true, false));
76    typeMapping.put(new CType("GLint", true, true),
77            new JType("java.nio.IntBuffer", true, false));
78    typeMapping.put(new CType("GLsizei", false, true),
79            new JType("java.nio.IntBuffer", true, false));
80    typeMapping.put(new CType("GLuint", false, true),
81            new JType("java.nio.IntBuffer", true, false));
82    typeMapping.put(new CType("GLuint", true, true),
83            new JType("java.nio.IntBuffer", true, false));
84    typeMapping.put(new CType("GLshort", true, true),
85            new JType("java.nio.ShortBuffer", true, false));
86
87    // Typed pointers map to arrays + offsets
88    arrayTypeMapping.put(new CType("char", false, true),
89            new JType("byte", false, true));
90    arrayTypeMapping.put(new CType("GLboolean", false, true),
91                 new JType("boolean", false, true));
92    arrayTypeMapping.put(new CType("GLenum", false, true), new JType("int", false, true));
93    arrayTypeMapping.put(new CType("GLfixed", true, true), new JType("int", false, true));
94    arrayTypeMapping.put(new CType("GLfixed", false, true), new JType("int", false, true));
95    arrayTypeMapping.put(new CType("GLfloat", false, true), new JType("float", false, true));
96    arrayTypeMapping.put(new CType("GLfloat", true, true), new JType("float", false, true));
97    arrayTypeMapping.put(new CType("GLint", false, true), new JType("int", false, true));
98    arrayTypeMapping.put(new CType("GLint", true, true), new JType("int", false, true));
99    arrayTypeMapping.put(new CType("GLshort", true, true), new JType("short", false, true));
100    arrayTypeMapping.put(new CType("GLsizei", false, true), new JType("int", false, true));
101    arrayTypeMapping.put(new CType("GLsizei", true, true), new JType("int", false, true));
102    arrayTypeMapping.put(new CType("GLuint", false, true), new JType("int", false, true));
103    arrayTypeMapping.put(new CType("GLuint", true, true), new JType("int", false, true));
104    arrayTypeMapping.put(new CType("GLintptr"), new JType("int", false, true));
105    arrayTypeMapping.put(new CType("GLsizeiptr"), new JType("int", false, true));
106    }
107
108    public JType() {
109    }
110
111    public JType(String primitiveTypeName) {
112    this.baseType = primitiveTypeName;
113    this.isClass = false;
114    this.isArray = false;
115    }
116
117    public JType(String primitiveTypeName, boolean isClass, boolean isArray) {
118    this.baseType = primitiveTypeName;
119    this.isClass = isClass;
120    this.isArray = isArray;
121    }
122
123    public String getBaseType() {
124    return baseType;
125    }
126
127    @Override
128    public String toString() {
129    return baseType + (isArray ? "[]" : "");
130    }
131
132    public boolean isArray() {
133    return isArray;
134    }
135
136    public boolean isClass() {
137    return isClass;
138    }
139
140    public boolean isString() {
141        return baseType.equals("String");
142    }
143
144    public boolean isPrimitive() {
145    return !isClass() && !isArray();
146    }
147
148    public boolean isVoid() {
149    return baseType.equals("void");
150    }
151
152    public boolean isBuffer() {
153    return baseType.indexOf("Buffer") != -1;
154    }
155
156    public boolean isTypedBuffer() {
157    return !baseType.equals("java.nio.Buffer") &&
158        (baseType.indexOf("Buffer") != -1);
159    }
160
161    public static JType convert(CType ctype, boolean useArray) {
162     JType javaType = null;
163     if (useArray) {
164         javaType = arrayTypeMapping.get(ctype);
165     }
166     if (javaType == null) {
167         javaType = typeMapping.get(ctype);
168     }
169     if (javaType == null) {
170         throw new RuntimeException("Unsupported C type: " + ctype);
171     }
172     return javaType;
173    }
174}
175