/*
 * Copyright (C) 2006 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

public class CType {

    String baseType;
    boolean isConst;
    boolean isPointer;

    public CType() {
    }

    public CType(String baseType) {
    setBaseType(baseType);
    }

    public CType(String baseType, boolean isConst, boolean isPointer) {
    setBaseType(baseType);
    setIsConst(isConst);
    setIsPointer(isPointer);
    }

    public String getDeclaration() {
    return baseType + (isPointer ? " *" : "");
    }

    public void setIsConst(boolean isConst) {
    this.isConst = isConst;
    }

    public boolean isConst() {
    return isConst;
    }

    public void setIsPointer(boolean isPointer) {
    this.isPointer = isPointer;
    }

    public boolean isPointer() {
    return isPointer;
    }

    public boolean isEGLHandle() {
        if(baseType.equals("EGLContext")
           || baseType.equals("EGLConfig")
           || baseType.equals("EGLSurface")
           || baseType.equals("EGLDisplay")) {
               return true;
        }
        return false;
    }

    boolean isVoid() {
    String baseType = getBaseType();
    return baseType.equals("GLvoid") ||
        baseType.equals("void");
    }

    public boolean isConstCharPointer() {
        return isConst && isPointer &&
            (baseType.equals("char") || baseType.equals("GLchar"));
    }

    public boolean isTypedPointer() {
    return isPointer() && !isVoid() && !isConstCharPointer();
    }

    public void setBaseType(String baseType) {
    this.baseType = baseType;
    }

    public String getBaseType() {
    return baseType;
    }

    @Override
    public String toString() {
    String s = "";
    if (isConst()) {
        s += "const ";
    }
    s += baseType;
    if (isPointer()) {
        s += "*";
    }

    return s;
    }

    @Override
    public int hashCode() {
    return baseType.hashCode() ^ (isPointer ? 2 : 0) ^ (isConst ? 1 : 0);
    }

    @Override
    public boolean equals(Object o) {
    if (o != null && o instanceof CType) {
        CType c = (CType)o;
        return baseType.equals(c.baseType) &&
        isPointer() == c.isPointer() &&
        isConst() == c.isConst();
    }
    return false;
    }
}
