1bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root/*
2bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Copyright (C) 2006 The Android Open Source Project
3bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root *
4bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
5bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * you may not use this file except in compliance with the License.
6bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * You may obtain a copy of the License at
7bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root *
8bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
9bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root *
10bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Unless required by applicable law or agreed to in writing, software
11bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
12bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * See the License for the specific language governing permissions and
14bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * limitations under the License.
15bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root */
16412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
17412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevichpublic class CType {
18412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
19412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    String baseType;
20412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    boolean isConst;
21412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    boolean isPointer;
22412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
23412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public CType() {
24412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
25412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
26412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public CType(String baseType) {
27412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    setBaseType(baseType);
28412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
29412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
30412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public CType(String baseType, boolean isConst, boolean isPointer) {
31412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    setBaseType(baseType);
32412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    setIsConst(isConst);
33412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    setIsPointer(isPointer);
34412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
35412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
36412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public String getDeclaration() {
37412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    return baseType + (isPointer ? " *" : "");
38412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
39412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
40412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public void setIsConst(boolean isConst) {
41412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    this.isConst = isConst;
42412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
43412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
44412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public boolean isConst() {
45412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    return isConst;
46412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
47412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
48412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public void setIsPointer(boolean isPointer) {
49412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    this.isPointer = isPointer;
50412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
51412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
52412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public boolean isPointer() {
53412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    return isPointer;
54412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
55412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
56412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    boolean isVoid() {
57412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    String baseType = getBaseType();
58412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    return baseType.equals("GLvoid") ||
59412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        baseType.equals("void");
60412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
61412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
6250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich    public boolean isConstCharPointer() {
6350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        return isConst && isPointer && baseType.equals("char");
6450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich    }
6550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
66412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public boolean isTypedPointer() {
6750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich    return isPointer() && !isVoid() && !isConstCharPointer();
68412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
69412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
70412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public void setBaseType(String baseType) {
71412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    this.baseType = baseType;
72412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
73412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
74412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public String getBaseType() {
75412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    return baseType;
76412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
77412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
78412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    @Override
79412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public String toString() {
80412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    String s = "";
81412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    if (isConst()) {
82412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        s += "const ";
83412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
84412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    s += baseType;
85412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    if (isPointer()) {
86412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        s += "*";
87412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
88412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
89412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    return s;
90412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
91412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
92412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    @Override
93412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public int hashCode() {
94412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    return baseType.hashCode() ^ (isPointer ? 2 : 0) ^ (isConst ? 1 : 0);
95412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
96412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
97412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    @Override
98412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public boolean equals(Object o) {
99412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    if (o != null && o instanceof CType) {
100412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        CType c = (CType)o;
101412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        return baseType.equals(c.baseType) &&
102412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        isPointer() == c.isPointer() &&
103412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        isConst() == c.isConst();
104412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
105412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    return false;
106412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
107412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich}
108