// 
// Decompiled by Procyon v0.6.0
// 

package org.bouncycastle.asn1;

import java.io.IOException;

public class ASN1Boolean extends ASN1Primitive
{
    static final ASN1UniversalType TYPE;
    private static final byte FALSE_VALUE = 0;
    private static final byte TRUE_VALUE = -1;
    public static final ASN1Boolean FALSE;
    public static final ASN1Boolean TRUE;
    private final byte value;
    
    public static ASN1Boolean getInstance(final Object o) {
        if (o == null || o instanceof ASN1Boolean) {
            return (ASN1Boolean)o;
        }
        if (o instanceof byte[]) {
            final byte[] array = (byte[])o;
            try {
                return (ASN1Boolean)ASN1Boolean.TYPE.fromByteArray(array);
            }
            catch (final IOException ex) {
                throw new IllegalArgumentException("failed to construct boolean from byte[]: " + ex.getMessage());
            }
        }
        throw new IllegalArgumentException("illegal object in getInstance: " + o.getClass().getName());
    }
    
    public static ASN1Boolean getInstance(final boolean b) {
        return b ? ASN1Boolean.TRUE : ASN1Boolean.FALSE;
    }
    
    public static ASN1Boolean getInstance(final int n) {
        return (n != 0) ? ASN1Boolean.TRUE : ASN1Boolean.FALSE;
    }
    
    public static ASN1Boolean getInstance(final ASN1TaggedObject asn1TaggedObject, final boolean b) {
        return (ASN1Boolean)ASN1Boolean.TYPE.getContextTagged(asn1TaggedObject, b);
    }
    
    public static ASN1Boolean getTagged(final ASN1TaggedObject asn1TaggedObject, final boolean b) {
        return (ASN1Boolean)ASN1Boolean.TYPE.getTagged(asn1TaggedObject, b);
    }
    
    private ASN1Boolean(final byte value) {
        this.value = value;
    }
    
    public boolean isTrue() {
        return this.value != 0;
    }
    
    @Override
    boolean encodeConstructed() {
        return false;
    }
    
    @Override
    int encodedLength(final boolean b) {
        return ASN1OutputStream.getLengthOfEncodingDL(b, 1);
    }
    
    @Override
    void encode(final ASN1OutputStream asn1OutputStream, final boolean b) throws IOException {
        asn1OutputStream.writeEncodingDL(b, 1, this.value);
    }
    
    @Override
    boolean asn1Equals(final ASN1Primitive asn1Primitive) {
        return asn1Primitive instanceof ASN1Boolean && this.isTrue() == ((ASN1Boolean)asn1Primitive).isTrue();
    }
    
    @Override
    public int hashCode() {
        return this.isTrue() ? 1 : 0;
    }
    
    @Override
    ASN1Primitive toDERObject() {
        return this.isTrue() ? ASN1Boolean.TRUE : ASN1Boolean.FALSE;
    }
    
    @Override
    public String toString() {
        return this.isTrue() ? "TRUE" : "FALSE";
    }
    
    static ASN1Boolean createPrimitive(final byte[] array) {
        if (array.length != 1) {
            throw new IllegalArgumentException("BOOLEAN value should have 1 byte in it");
        }
        final byte b = array[0];
        switch (b) {
            case 0: {
                return ASN1Boolean.FALSE;
            }
            case -1: {
                return ASN1Boolean.TRUE;
            }
            default: {
                return new ASN1Boolean(b);
            }
        }
    }
    
    static {
        TYPE = new ASN1UniversalType(1) {
            @Override
            ASN1Primitive fromImplicitPrimitive(final DEROctetString derOctetString) {
                return ASN1Boolean.createPrimitive(derOctetString.getOctets());
            }
        };
        FALSE = new ASN1Boolean((byte)0);
        TRUE = new ASN1Boolean((byte)(-1));
    }
}
