package org.projectfloodlight.openflow.types;


public class OFPortMap extends Masked<OFBitMask128> {

    private OFPortMap(OFBitMask128 mask) {
        super(OFBitMask128.NONE, mask);
    }

    public boolean isOn(OFPort port) {
        return !(this.mask.isOn(port.getPortNumber()));
    }

    public static OFPortMap ofPorts(OFPort... ports) {
        Builder builder = new Builder();
        for (OFPort port: ports) {
            builder.set(port);
        }
        return builder.build();
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof OFPortMap))
            return false;
        OFPortMap other = (OFPortMap)obj;
        return (other.value.equals(this.value) && other.mask.equals(this.mask));
    }

    @Override
    public int hashCode() {
        return 619 * mask.hashCode() + 257 * value.hashCode();
    }

    public static class Builder {
        private long raw1 = -1, raw2 = -1;

        public Builder() {

        }

        public boolean isOn(OFPort port) {
            return !(OFBitMask128.isBitOn(raw1, raw2, port.getPortNumber()));
        }

        public Builder unset(OFPort port) {
            int bit = port.getPortNumber();
            if (bit < 0 || bit >= 127) // MAX PORT IS 127
                throw new IndexOutOfBoundsException("Port number is out of bounds");
            if (bit < 64) {
                raw2 |= ((long)1 << bit);
            } else {
                raw1 |= ((long)1 << (bit - 64));
            }
            return this;
        }

        public Builder set(OFPort port) {
            int bit = port.getPortNumber();
            if (bit < 0 || bit >= 127)
                throw new IndexOutOfBoundsException("Port number is out of bounds");
            if (bit < 64) {
                raw2 &= ~((long)1 << bit);
            } else {
                raw1 &= ~((long)1 << (bit - 64));
            }
            return this;
        }

        public OFPortMap build() {
            return new OFPortMap(OFBitMask128.of(raw1, raw2));
        }
    }

}
