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
5666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    public boolean isEGLHandle() {
5766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if(baseType.equals("EGLContext")
5866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer           || baseType.equals("EGLConfig")
5966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer           || baseType.equals("EGLSurface")
6066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer           || baseType.equals("EGLDisplay")) {
6166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer               return true;
6266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
6366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        return false;
6466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    }
6566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
66412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    boolean isVoid() {
67412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    String baseType = getBaseType();
68412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    return baseType.equals("GLvoid") ||
69412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        baseType.equals("void");
70412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
71412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
7250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich    public boolean isConstCharPointer() {
730eb6ad563825b97aec760a893db0eead10fe0ae6Jesse Hall        return isConst && isPointer &&
740eb6ad563825b97aec760a893db0eead10fe0ae6Jesse Hall            (baseType.equals("char") || baseType.equals("GLchar"));
7550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich    }
7650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
77412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public boolean isTypedPointer() {
7850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich    return isPointer() && !isVoid() && !isConstCharPointer();
79412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
80412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
81412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public void setBaseType(String baseType) {
82412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    this.baseType = baseType;
83412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
84412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
85412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public String getBaseType() {
86412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    return baseType;
87412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
88412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
89412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    @Override
90412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public String toString() {
91412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    String s = "";
92412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    if (isConst()) {
93412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        s += "const ";
94412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
95412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    s += baseType;
96412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    if (isPointer()) {
97412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        s += "*";
98412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
99412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
100412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    return s;
101412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
102412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
103412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    @Override
104412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public int hashCode() {
105412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    return baseType.hashCode() ^ (isPointer ? 2 : 0) ^ (isConst ? 1 : 0);
106412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
107412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
108412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    @Override
109412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public boolean equals(Object o) {
110412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    if (o != null && o instanceof CType) {
111412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        CType c = (CType)o;
112412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        return baseType.equals(c.baseType) &&
113412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        isPointer() == c.isPointer() &&
114412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        isConst() == c.isConst();
115412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
116412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    return false;
117412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
118412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich}
119