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

package io.netty.channel.nio;

import io.netty.channel.IoOps;

public final class NioIoOps implements IoOps
{
    public static final NioIoOps NONE;
    public static final NioIoOps ACCEPT;
    public static final NioIoOps CONNECT;
    public static final NioIoOps WRITE;
    public static final NioIoOps READ;
    public static final NioIoOps READ_AND_ACCEPT;
    public static final NioIoOps READ_AND_WRITE;
    private static final NioIoEvent[] EVENTS;
    final int value;
    
    private static void addToArray(final NioIoEvent[] array, final NioIoOps opt) {
        array[opt.value] = new DefaultNioIoEvent(opt);
    }
    
    private NioIoOps(final int value) {
        this.value = value;
    }
    
    public boolean contains(final NioIoOps ops) {
        return this.isIncludedIn(ops.value);
    }
    
    public NioIoOps with(final NioIoOps ops) {
        if (this.contains(ops)) {
            return this;
        }
        return valueOf(this.value | ops.value());
    }
    
    public NioIoOps without(final NioIoOps ops) {
        if (!this.contains(ops)) {
            return this;
        }
        return valueOf(this.value & ~ops.value());
    }
    
    public int value() {
        return this.value;
    }
    
    @Override
    public boolean equals(final Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || this.getClass() != o.getClass()) {
            return false;
        }
        final NioIoOps nioOps = (NioIoOps)o;
        return this.value == nioOps.value;
    }
    
    @Override
    public int hashCode() {
        return this.value;
    }
    
    public static NioIoOps valueOf(final int value) {
        return eventOf(value).ops();
    }
    
    public boolean isIncludedIn(final int ops) {
        return (ops & this.value) != 0x0;
    }
    
    public boolean isNotIncludedIn(final int ops) {
        return (ops & this.value) == 0x0;
    }
    
    static NioIoEvent eventOf(final int value) {
        if (value > 0 && value < NioIoOps.EVENTS.length) {
            final NioIoEvent event = NioIoOps.EVENTS[value];
            if (event != null) {
                return event;
            }
        }
        return new DefaultNioIoEvent(new NioIoOps(value));
    }
    
    static {
        NONE = new NioIoOps(0);
        ACCEPT = new NioIoOps(16);
        CONNECT = new NioIoOps(8);
        WRITE = new NioIoOps(4);
        READ = new NioIoOps(1);
        READ_AND_ACCEPT = new NioIoOps(17);
        READ_AND_WRITE = new NioIoOps(5);
        final NioIoOps all = new NioIoOps(NioIoOps.NONE.value | NioIoOps.ACCEPT.value | NioIoOps.CONNECT.value | NioIoOps.WRITE.value | NioIoOps.READ.value);
        addToArray(EVENTS = new NioIoEvent[all.value + 1], NioIoOps.NONE);
        addToArray(NioIoOps.EVENTS, NioIoOps.ACCEPT);
        addToArray(NioIoOps.EVENTS, NioIoOps.CONNECT);
        addToArray(NioIoOps.EVENTS, NioIoOps.WRITE);
        addToArray(NioIoOps.EVENTS, NioIoOps.READ);
        addToArray(NioIoOps.EVENTS, NioIoOps.READ_AND_ACCEPT);
        addToArray(NioIoOps.EVENTS, NioIoOps.READ_AND_WRITE);
        addToArray(NioIoOps.EVENTS, all);
    }
    
    private static final class DefaultNioIoEvent implements NioIoEvent
    {
        private final NioIoOps ops;
        
        DefaultNioIoEvent(final NioIoOps ops) {
            this.ops = ops;
        }
        
        @Override
        public NioIoOps ops() {
            return this.ops;
        }
        
        @Override
        public boolean equals(final Object o) {
            if (this == o) {
                return true;
            }
            if (o == null || this.getClass() != o.getClass()) {
                return false;
            }
            final NioIoEvent event = (NioIoEvent)o;
            return event.ops().equals(this.ops());
        }
        
        @Override
        public int hashCode() {
            return this.ops().hashCode();
        }
    }
}
