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

package io.netty.channel.epoll;

import io.netty.channel.IoOps;

public final class EpollIoOps implements IoOps
{
    public static final EpollIoOps EPOLLOUT;
    public static final EpollIoOps EPOLLIN;
    public static final EpollIoOps EPOLLERR;
    public static final EpollIoOps EPOLLRDHUP;
    public static final EpollIoOps EPOLLET;
    static final int EPOLL_ERR_OUT_MASK;
    static final int EPOLL_ERR_IN_MASK;
    static final int EPOLL_RDHUP_MASK;
    private static final EpollIoEvent[] EVENTS;
    final int value;
    
    private static void addToArray(final EpollIoEvent[] array, final EpollIoOps ops) {
        array[ops.value] = new DefaultEpollIoEvent(ops);
    }
    
    private EpollIoOps(final int value) {
        this.value = value;
    }
    
    public boolean contains(final EpollIoOps ops) {
        return (this.value & ops.value) != 0x0;
    }
    
    boolean contains(final int value) {
        return (this.value & value) != 0x0;
    }
    
    public EpollIoOps with(final EpollIoOps ops) {
        if (this.contains(ops)) {
            return this;
        }
        return valueOf(this.value | ops.value());
    }
    
    public EpollIoOps without(final EpollIoOps 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 EpollIoOps nioOps = (EpollIoOps)o;
        return this.value == nioOps.value;
    }
    
    @Override
    public int hashCode() {
        return this.value;
    }
    
    public static EpollIoOps valueOf(final int value) {
        return eventOf(value).ops();
    }
    
    @Override
    public String toString() {
        return "EpollIoOps{value=" + this.value + '}';
    }
    
    static EpollIoEvent eventOf(final int value) {
        if (value > 0 && value < EpollIoOps.EVENTS.length) {
            final EpollIoEvent event = EpollIoOps.EVENTS[value];
            if (event != null) {
                return event;
            }
        }
        return new DefaultEpollIoEvent(new EpollIoOps(value));
    }
    
    static {
        Epoll.ensureAvailability();
        EPOLLOUT = new EpollIoOps(Native.EPOLLOUT);
        EPOLLIN = new EpollIoOps(Native.EPOLLIN);
        EPOLLERR = new EpollIoOps(Native.EPOLLERR);
        EPOLLRDHUP = new EpollIoOps(Native.EPOLLRDHUP);
        EPOLLET = new EpollIoOps(Native.EPOLLET);
        EPOLL_ERR_OUT_MASK = (EpollIoOps.EPOLLERR.value | EpollIoOps.EPOLLOUT.value);
        EPOLL_ERR_IN_MASK = (EpollIoOps.EPOLLERR.value | EpollIoOps.EPOLLIN.value);
        EPOLL_RDHUP_MASK = EpollIoOps.EPOLLRDHUP.value;
        final EpollIoOps all = new EpollIoOps(EpollIoOps.EPOLLOUT.value | EpollIoOps.EPOLLIN.value | EpollIoOps.EPOLLERR.value | EpollIoOps.EPOLLRDHUP.value);
        addToArray(EVENTS = new EpollIoEvent[all.value + 1], EpollIoOps.EPOLLOUT);
        addToArray(EpollIoOps.EVENTS, EpollIoOps.EPOLLIN);
        addToArray(EpollIoOps.EVENTS, EpollIoOps.EPOLLERR);
        addToArray(EpollIoOps.EVENTS, EpollIoOps.EPOLLRDHUP);
        addToArray(EpollIoOps.EVENTS, all);
    }
    
    private static final class DefaultEpollIoEvent implements EpollIoEvent
    {
        private final EpollIoOps ops;
        
        DefaultEpollIoEvent(final EpollIoOps ops) {
            this.ops = ops;
        }
        
        @Override
        public EpollIoOps 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 EpollIoEvent event = (EpollIoEvent)o;
            return event.ops().equals(this.ops());
        }
        
        @Override
        public int hashCode() {
            return this.ops().hashCode();
        }
        
        @Override
        public String toString() {
            return "DefaultEpollIoEvent{ops=" + this.ops + '}';
        }
    }
}
