/** 
 * Copyright (c) 2009-2011, The HATS Consortium. All rights reserved. 
 * This file is licensed under the terms of the Modified BSD License.
 */
package org.abs_models.backend.java.lib.types;

public class ABSBool extends ABSBuiltInDataType {
    public final static ABSBool TRUE = new ABSBool("True", true);
    public final static ABSBool FALSE = new ABSBool("False", false);

    private boolean value;

    private ABSBool(String constr, boolean v) {
        super(constr);
        this.value = v;
    }

    @Override
    public ABSBool eq(ABSValue o) {
        return ABSBool.fromBoolean(o == this);
    }

    @Override
    public ABSBool notEq(ABSValue o) {
        return ABSBool.fromBoolean(o != this);
    }

    public ABSBool gt(ABSValue o) {
        if (o == null)
            return ABSBool.FALSE;
        if (!o.getClass().equals(ABSBool.class))
            return ABSBool.FALSE;
        ABSBool oi = (ABSBool) o;
        // True > False
        return this.and(oi.negate());
    }

    public ABSBool lt(ABSValue o) {
        if (o == null)
            return ABSBool.FALSE;
        if (!o.getClass().equals(ABSBool.class))
            return ABSBool.FALSE;
        ABSBool oi = (ABSBool) o;
        // False < True
        return oi.and(this.negate());
    }

    public ABSBool negate() {
        return fromBoolean(!value);
    }

    public ABSBool and(ABSBool b) {
        return fromBoolean(value && b.value);
    }

    public ABSBool or(ABSBool b) {
        return fromBoolean(value || b.value);
    }

    public boolean toBoolean() {
        return value;
    }

    public static ABSBool fromBoolean(boolean b) {
        if (b)
            return TRUE;
        else
            return FALSE;
    }

}
